我正在尝试在远程服务器中调试我的应用程序。
远程服务器是 QNAP NAS,运行 Apache 并安装了 Xdebug。
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
这是我的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
}
}
]
}
这是我的/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
当我在本地调试时,
breakpoint_set
之后,我明白了
[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>
但是正如您所看到的,这不会在远程日志中发生。
我不知道为什么会发生这种情况。我的
pathMappings
正确吗?
‘xdebug_info()’输出
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
切换到 dbgpProxy 认为这会有所帮助,因为我现在在家办公并使用 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
回到办公室进行测试
C:\xampp7\htdocs\Dolibarr16.0.3\htdocs\xdebug_test.php
/share/ZFS2_DATA/Web/dolibarr-pruebas/htdocs/xdebug_test.php
<?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
在
phpinfo.php
中,我看到了警告“XDEBUG 未加载为 ZEND 扩展”。我一开始忽略了它,因为这只是一个警告而不是错误。
Xdebug 没有在断点处停止,因为我在我的
extension=xdebug.so
中使用 99-xdebug.ini
加载了 Xdebug。
Xdebug 需要作为 Zend 扩展加载,因此正确的加载方法是使用
zend_extension=xdebug.so
。一旦我做出了改变,断点就开始工作了。
感谢@LazyOne