phpvisual-studio-codexdebugvscode-debugger

VSCode PHP Xdebug in remote server ignoring breakpoints


I'm trying to debug my app in a remote server.

The remote server is a QNAP NAS, runs Apache and has Xdebug installed.

99-xdebug.ini

[xDebug]
extension = xdebug
xdebug.mode = debug,develop
xdebug.remote_handler = "dbgp"
xdebug.remote_cookie_expire_time = 36000
xdebug.start_with_request=trigger
xdebug.client_host = 192.168.1.29
xdebug.client_port = 9003
xdebug.show_exception_trace=false
xdebug.log = /tmp/xdebug.log
xdebug.log_level=10
xdebug.trigger_value=DavidDebugando
xdebug.idekey=vsc

This is my launch.json

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Local listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "xdebugSettings": {
        "max_children": 128,
        "max_data": -1,
        "max_depth": 3
      },
    },
    {
      "name": "Remote listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "xdebugSettings": {
        "max_children": 128,
        "max_data": -1,
        "max_depth": 3
      },
      "pathMappings": {
        // "file:///share/ZFS2_DATA/Web/dolibarr-pruebas": "${workspaceFolder}",
        "/share/ZFS2_DATA/Web/dolibarr-pruebas": "${workspaceFolder}"
        },
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "program": "${file}",
      "cwd": "${fileDirname}",
      "port": 9003,
      "xdebugSettings": {
        "max_children": 128,
        "max_data": -1,
        "max_depth": 3
      }
    }
  ]
}

And this is my /tmp/xdebug.log

[23080] Log opened at 2024-09-17 10:32:54.365243
[23080] [Config] DEBUG: Checking if trigger 'XDEBUG_TRIGGER' is enabled for mode 'debug'
[23080] [Config] DEBUG: The trigger value 'DavidDebugando' matched the shared secret 'DavidDebugando' for mode 'debug'
[23080] [Step Debug] INFO: Connecting to configured address/port: 192.168.1.29:9003.
[23080] [Step Debug] INFO: Connected to debugging client: 192.168.1.29:9003 (through xdebug.client_host/xdebug.client_port). :-)
[23080] [Step Debug] -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="file:///share/ZFS2_DATA/Web/dolibarr-pruebas/htdocs/custom/phpinfo.php" language="PHP" xdebug:language_version="7.4.30" protocol_version="1.0" appid="23080" idekey="DavidDebugando"><engine version="3.1.6"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[https://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2022 by Derick Rethans]]></copyright></init>

[23080] [Step Debug] <- feature_set -i 1 -n resolved_breakpoints -v 1
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="1" feature="resolved_breakpoints" success="1"></response>

[23080] [Step Debug] <- feature_set -i 2 -n notify_ok -v 1
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="2" feature="notify_ok" success="1"></response>

[23080] [Step Debug] <- feature_set -i 3 -n extended_properties -v 1
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="3" feature="extended_properties" success="1"></response>

[23080] [Step Debug] <- feature_get -i 4 -n breakpoint_include_return_value
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_get" transaction_id="4" feature_name="breakpoint_include_return_value" supported="0"><![CDATA[0]]></response>

[23080] [Step Debug] <- feature_set -i 5 -n max_children -v 128
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="5" feature="max_children" success="1"></response>

[23080] [Step Debug] <- feature_set -i 6 -n max_data -v -1
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="6" feature="max_data" success="1"></response>

[23080] [Step Debug] <- feature_set -i 7 -n max_depth -v 3
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="7" feature="max_depth" success="1"></response>

[23080] [Step Debug] <- breakpoint_set -i 8 -t line -f file:///share/ZFS2_DATA/Web/dolibarr-pruebas/htdocs/custom/phpinfo.php -n 3
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="8" id="230800002" resolved="unresolved"></response>

[23080] [Step Debug] <- run -i 9
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="9" status="stopping" reason="ok"></response>

[23080] [Step Debug] <- stop -i 10
[23080] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="stop" transaction_id="10" status="stopped" reason="ok"></response>

[23080] Log closed at 2024-09-17 10:32:54.415959

When I debug locally, after breakpoint_set, I see

[1040] [Step Debug] <- run -i 11
[1040] [Step Debug] DEBUG: Checking whether to break on C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\custom\phpinfo.php:3.
[1040] [Step Debug] DEBUG: I: Current location: C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\custom\phpinfo.php:3.
[1040] [Step Debug] DEBUG: I: Matching breakpoint 'C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\custom\phpinfo.php:3' against location 'C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\custom\phpinfo.php:3'.
[1040] [Step Debug] DEBUG: F: File names match (C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\custom\phpinfo.php).
[1040] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="11" status="break" reason="ok"><xdebug:message filename="file:///C:/xampp7/htdocs/Dolibarr16.0.3/htdocs/custom/phpinfo.php" lineno="3"></xdebug:message></response>

But as you can see this doesn't happen in the remote log.

I have no idea why this is happening. Are my pathMappings correct?

'xdebug_info()' output

Version 3.1.6
Support Xdebug on Patreon, GitHub, or as a business
Enabled Features
(through 'xdebug.mode' setting)
Feature Enabled/Disabled    Docs
Development Helpers ✔ enabled   
Coverage    ✘ disabled  
GC Stats    ✘ disabled  
Profiler    ✘ disabled  
Step Debugger   ✔ enabled   
Tracing ✘ disabled  
Optional Features
Compressed File Support no
Clock Source    clock_gettime
Diagnostic Log
Message Docs
⚠️  [Step Debug] Debug client detached: "dbgpProxy has no IDE connected to it". 
Step Debugging  Docs
Debugger    Detached    
Connected Client    127.0.0.1:9003   
Detached    "dbgpProxy has no IDE connected to it"   
PHP
Build Configuration
Version (Run Time)  7.4.30
Version (Compile Time)  7.4.33
Debug Build no
Thread Safety   disabled
Settings
Configuration File (php.ini) Path   /usr/local/etc/php
Loaded Configuration File   /mnt/HDA_ROOT/.config/php.ini
Scan this dir for additional .ini files /etc/config/php.d
Additional .ini files parsed    /etc/config/php.d/99-xdebug.ini, /etc/config/php.d/ext.ini, /etc/config/php.d/php_ext.ini
Directive   Local Value Master Value    Docs
xdebug.cli_color    0   0   
xdebug.client_discovery_header  no value    no value    
xdebug.client_host  127.0.0.1   127.0.0.1   
xdebug.client_port  9003    9003    
xdebug.cloud_id no value    no value    
xdebug.collect_assignments  Off Off 
xdebug.collect_return   Off Off 
xdebug.connect_timeout_ms   200 200 
xdebug.discover_client_host Off Off 
xdebug.dump.COOKIE  no value    no value    
xdebug.dump.ENV no value    no value    
xdebug.dump.FILES   no value    no value    
xdebug.dump.GET no value    no value    
xdebug.dump.POST    no value    no value    
xdebug.dump.REQUEST no value    no value    
xdebug.dump.SERVER  no value    no value    
xdebug.dump.SESSION no value    no value    
xdebug.dump_globals On  On  
xdebug.dump_once    On  On  
xdebug.dump_undefined   Off Off 
xdebug.file_link_format no value    no value    
xdebug.filename_format  no value    no value    
xdebug.force_display_errors Off Off 
xdebug.force_error_reporting    0   0   
xdebug.gc_stats_output_name gcstats.%p  gcstats.%p  
xdebug.halt_level   0   0   
xdebug.idekey   vsc vsc 
xdebug.log  /tmp/xdebug.log /tmp/xdebug.log 
xdebug.log_level    10  10  
xdebug.max_nesting_level    256 256 
xdebug.max_stack_frames -1  -1  
xdebug.mode debug,develop   debug,develop   
xdebug.output_dir   /tmp    /tmp    
xdebug.profiler_append  Off Off 
xdebug.profiler_output_name cachegrind.out.%p   cachegrind.out.%p   
xdebug.scream   Off Off 
xdebug.show_error_trace Off Off 
xdebug.show_exception_trace Off Off 
xdebug.show_local_vars  Off Off 
xdebug.start_upon_error default default 
xdebug.start_with_request   trigger trigger 
xdebug.trace_format 0   0   
xdebug.trace_options    0   0   
xdebug.trace_output_name    trace.%c    trace.%c    
xdebug.trigger_value    DavidDebugando  DavidDebugando  
xdebug.use_compression  0   0   
xdebug.var_display_max_children 128 128 
xdebug.var_display_max_data 512 512 
xdebug.var_display_max_depth    3   3   

Switched to dbgpProxy thinking it would help since I'm WFH right now and using Wireguard.

2024-09-18 11:36:16.535 [info] [server] Start new client connection from 198.18.7.15:48472
2024-09-18 11:36:17.049 [info] [proxyinit] [DavidDebugando] Added connection for IDE Key 'DavidDebugando': 198.18.7.15:9003
2024-09-18 11:36:17.049 [info] [server] Closing client connection from 198.18.7.15:48472
2024-09-18 11:36:20.928 [info] [server] Start new server connection from 127.0.0.1:53470
2024-09-18 11:36:20.928 [info] [proxy-client] [DavidDebugando] Found connection for IDE Key 'DavidDebugando': 198.18.7.15:9003
2024-09-18 11:36:20.928 [info] [proxy-client] [DavidDebugando] Connecting to 198.18.7.15:9003
2024-09-18 11:38:32.590 [err ] [proxy-client] [DavidDebugando] IDE not connected: dial tcp 198.18.7.15:9003: connect: connection timed out
2024-09-18 11:38:32.590 [warn] [proxy-client] [DavidDebugando] Removed connection information for 'DavidDebugando': dial tcp 198.18.7.15:9003: connect: connection timed out
2024-09-18 11:38:32.590 [warn] [server] Handler response error: Error reading response: Error reading length: EOF
2024-09-18 11:38:32.590 [info] [server] Closing server connection from 127.0.0.1:53470
2024-09-18 11:40:07.288 [info] [server] Start new server connection from 127.0.0.1:53620
2024-09-18 11:40:07.289 [info] [proxy-client] [DavidDebugando] Could not find IDE connection for IDE Key 'DavidDebugando'
2024-09-18 11:40:07.289 [warn] [server] Handler response error: Error reading response: Error reading length: EOF
2024-09-18 11:40:07.289 [info] [server] Closing server connection from 127.0.0.1:53620

Testing back at the office

<?php
$a=1;
$b=3;
$c=$a + $b;
xdebug_break();
echo $c, "\n";

[16879] Log opened at 2024-09-20 06:48:16.731443
[16879] [Config] DEBUG: Checking if trigger 'XDEBUG_TRIGGER' is enabled for mode 'debug'
[16879] [Config] DEBUG: The trigger value 'DavidDebugando' matched the shared secret 'DavidDebugando' for mode 'debug'
[16879] [Step Debug] INFO: Checking remote connect back address.
[16879] [Step Debug] INFO: Checking header 'HTTP_X_FORWARDED_FOR'.
[16879] [Step Debug] INFO: Checking header 'REMOTE_ADDR'.
[16879] [Step Debug] INFO: Client host discovered through HTTP header, connecting to 192.168.1.29:9003.
[16879] [Step Debug] INFO: Connected to debugging client: 192.168.1.29:9003 (from REMOTE_ADDR HTTP header). :-)
[16879] [Step Debug] -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="file:///share/ZFS2_DATA/Web/dolibarr-pruebas/htdocs/xdebug_test.php" language="PHP" xdebug:language_version="7.4.30" protocol_version="1.0" appid="16879" idekey="DavidDebugando"><engine version="3.1.6"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[https://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2022 by Derick Rethans]]></copyright></init>

[16879] [Step Debug] <- feature_set -i 1 -n resolved_breakpoints -v 1
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="1" feature="resolved_breakpoints" success="1"></response>

[16879] [Step Debug] <- feature_set -i 2 -n notify_ok -v 1
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="2" feature="notify_ok" success="1"></response>

[16879] [Step Debug] <- feature_set -i 3 -n extended_properties -v 1
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="3" feature="extended_properties" success="1"></response>

[16879] [Step Debug] <- feature_get -i 4 -n breakpoint_include_return_value
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_get" transaction_id="4" feature_name="breakpoint_include_return_value" supported="0"><![CDATA[0]]></response>

[16879] [Step Debug] <- feature_set -i 5 -n max_children -v 128
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="5" feature="max_children" success="1"></response>

[16879] [Step Debug] <- feature_set -i 6 -n max_data -v -1
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="6" feature="max_data" success="1"></response>

[16879] [Step Debug] <- feature_set -i 7 -n max_depth -v 3
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="7" feature="max_depth" success="1"></response>

[16879] [Step Debug] <- breakpoint_set -i 8 -t line -f file:///share/ZFS2_DATA/Web/dolibarr-pruebas/htdocs/xdebug_test.php -n 4
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="8" id="168790003" resolved="unresolved"></response>

[16879] [Step Debug] <- run -i 9
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="run" transaction_id="9" status="stopping" reason="ok"></response>

[16879] [Step Debug] <- stop -i 10
[16879] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" command="stop" transaction_id="10" status="stopped" reason="ok"></response>

[16879] Log closed at 2024-09-20 06:48:16.774053

Checked this, due to this opcache is loaded first, then xdebug, so it shouldn't be a problem.


Solution

  • In phpinfo.php I saw the warning "XDEBUG NOT LOADED AS ZEND EXTENSION." I ignored it at first since it was just a warning and not an error.

    Xdebug wasn't stopping at breakpoints because I had loaded Xdebug using extension=xdebug.so in my 99-xdebug.ini.

    Xdebug needs to be loaded as a Zend extension, so the correct way to load it is with zend_extension=xdebug.so. Once I made that change, breakpoints started working.

    Thanks to @LazyOne

    Wrong: enter image description here enter image description here

    Right: enter image description here enter image description here