Xdebug远程调试不会在断点处停止。

45
我在使用远程调试时遇到了xdebug不在断点处停止的问题(通过命令行运行脚本时一切正常)。它会在程序的第一行中断,然后退出,没有捕捉到任何断点。
这曾经是正常工作的,直到我转而使用MacPorts来安装Apache和PHP。我尝试过多次重新编译它(使用几个版本),但都没有成功。
我正在使用PHP 5.3.1和Xdebug 2.1.0-beta3
我还尝试了至少三个不同的调试程序(MacGDBp,Netbeans和JetBrains Web IDE)。
我的php.ini设置如下:
[xdebug]
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=webide

当我记录调试器输出时,设置断点的代码如下:; <- breakpoint_set -i 895 -t line -f file:///Users/WM_imac/Sites/wm/debug_test.php -n 13 -s enabled -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="895" state="enabled" id="890660002"></response> 运行调试器时,会获取应用程序第一行的上下文,然后发送分离和停止消息。
但是,这行代码是在启动调试器时输出的。 <- feature_get -i 885 -n breakpoint_types -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="feature_get" transaction_id="885" feature_name="breakpoint_types" supported="1"><![CDATA[line conditional call return exception]]></response> “line conditional call return exception”代表什么意思?

进一步的研究表明,“行条件调用返回异常”是支持断点的列表,而不是任何错误信息。 - Bryan M.
3
在我的代码中调用xdebug_break()函数将正确地导致调试器停止。 - Bryan M.
你能指定你的php.ini文件路径吗?你在这个主机上使用HTTPS吗? - DrDol
使用常规的http,在/opt/local/etc/php5/php.ini中使用ini文件(MacPorts安装的默认位置) - Bryan M.
在遇到这个问题很长一段时间后,似乎通过以下两种方式解决了:a)从Leopard升级到Snow Leopard(这将在OS X中重新安装大部分Unix系统),b)通过MacPorts完全重新安装我的开发环境。 - Bryan M.
没有在这里看到过这个问题...所以:使用xdebug.remote_connect_back = 1解决了我的问题;虽然这会让你的服务器对所有人开放进行调试,但当它是你本地机器上的虚拟机时,这没关系。我认为xdebug.remote_host =是更具体限制到你的工作站上的关键。并且在更改设置时重新启动Apache... - Adrian
24个回答

36
我曾遇到此问题,花费了很长时间才找到答案。
在您的调试配置中,在服务器区域,单击“配置”,转到“路径映射”,单击现有路径并单击“编辑”,更改为文件系统中的路径并导航至正确的文件。
完成。

那对我也起作用了。显然,我的先前的路径映射虽然不是错误的,但是相对于一个链接文件夹。(这对我来说感觉像是个错误)。 - e-motiv
我也遇到了这个问题 - 最受欢迎的解决方案可行,但界面可能已经改变了?我在“首选项/路径”中设置了本地和远程路径为同一个项目目录,然后开始在测试文件中使用断点。这可能与PHPUnit如何运行实际测试有关(启动新进程?)。 - brez
请记住,您需要在服务器文件系统上指定路径,而不是Web URL,例如: /var/www/html 需要映射到 C:\myworkspace\projectx 等等。 - JJ Roman
对我来说,问题在于服务器路径设置为~/Code/mysite,我猜测~没有被识别,所以我需要将其更改为/home/vagrant/Code/mysite。这让我花了好几天才解决。唉。 - Ryan
也要注意符号链接!如果您在Apache目录中使用PHP链接,xdebug将解析该链接并引用链接文件而不是链接本身。因此,即使您设置了一个Apache指令到/var/www/my_php/linkedFile.php,如果该链接由于某种原因解析为/tmp/src/linkedFile.php,则应将路径映射设置为/tmp/src而不是/var/www/my_php - Larry B.

23

我曾经遇到同样的问题,最终发现我的php.ini文件缺少了这两个重要的设置:

xdebug.remote_autostart = "On"
xdebug.remote_enable = "On"

然后它完美地工作了。


这个很好用,记得在更改后重新启动apache。_autostart标志对我很有帮助。 - Bradley
1
xdebug.mode = debug xdebug.start_with_request=yes 在 Xdebug 3 中。 - frazras

8

XDebug在我的Ubuntu Lucid盒子中与NetBeans一起正常工作,我在我的php.ini(/etc/php5/apache2/php.ini)中有zend_extension行。

我正在使用netbeans 6.9和PHP 5.2以及xdebug 2.0.4-2

我在这里粘贴相关的行,希望能帮到你:

zend_extension=/usr/lib/php5/20060613/xdebug.so

[debug]
; Remote settings
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey="netbeans-xdebug"

; General
xdebug.auto_trace=off
xdebug.collect_includes=on
xdebug.collect_params=off
xdebug.collect_return=off
xdebug.default_enable=on
xdebug.extended_info=1
xdebug.manual_url=http://www.php.net
xdebug.show_local_vars=1
xdebug.show_mem_delta=0
xdebug.max_nesting_level=100
;xdebug.idekey=

; Trace options
xdebug.trace_format=0
xdebug.trace_output_dir=/tmp
xdebug.trace_options=0
xdebug.trace_output_name=crc32

; Profiling
xdebug.profiler_append=0
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=0
xdebug.profiler_output_dir=/tmp
xdebug.profiler_output_name=crc32

小心使用分析器,我曾经因为在 /tmp 目录下生成了大量文件而导致系统严重减速并最终崩溃,原因是 XDEBUG 分析器。 - pgr

8

来自 http://xdebug.org/docs/install,"你应该忽略任何添加“extension=xdebug.so”到php.ini的提示-这将导致问题。"

所以,这对我有用:

在配置文件中加载xdebug扩展(对于我来说,对于php的CLI版本,即/etc/php5/cli/conf.d/xdebug.ini)-不要指定。

extension=xdebug.so

请使用,而不是

zend_extension=/path/to/xdebug/module/xdebug.so

对我来说,这就像是 /usr/lib/php5/(...)/xdebug.so 这样的东西。

使用 locate xdebug.so 命令来查找位置。


2
我已经在使用 zend_extension 了。不过还是感谢你的见解。 - Bryan M.
你确定在 PHP 配置中没有 extension=xdebug.so 的扩展吗?我同时设置了 extension=xdebug.so 和 zend_extension=/path/to/xdebug.so,但由于某种原因它只加载了 extension=xdebug.so,这样虽然能够加载扩展,但断点调试无法正常工作。 - mjs
我仔细检查了,只使用zend_extension。再次强调,这里的问题是在通过Web浏览器运行时断点的问题。对于CLI脚本或PHPUnit,一切正常。 - Bryan M.
我相信这只是SO上的一个打字错误,但请检查PHP文件中“zend_extension”的拼写——如果那是原因的话,那将是一件遗憾的事情。 - Oddthinking
我希望展示这个矛盾能够有所帮助。http://serverfault.com/questions/202959/should-i-add-extensionxdebug-so-to-load-xdebug-as-a-php-module-or-not - Delirium tremens

7
我遇到了同样的问题,解决方法是将本地代码放在与远程代码相同的路径下。
例如,在Web服务器上,代码位于路径/var/www/dev01/app_name中,在本地,代码位于我的主目录下/home/me/projects/app_name
这种配置导致我的IDE(Eclipse和Komodo)直接忽略了断点。
将本地路径从/home/me/projects/app_name更改为/var/www/dev01/app_name修复了该问题。使用sshfs在本地挂载远程文件系统可以使此过程更加容易。

看起来我遇到了同样的问题。在调用堆栈中,我可以看到对远程服务器上文件位置的引用。但我的问题是...我正在尝试在Windows上调试我的代码,而它是在Linux上运行的。有没有通用的解决方案? - JJ Roman
@JJRoman 我还没有在混合环境中尝试过。 也许 pitchandtone 给出的“路径映射”答案适用于你。 - safl

4
我刚使用Komodo时遇到了类似safl评论中的情况,但不确定是否相关:
我已经使用zend_extension在Komodo中设置了xdebug,并且它完美地工作,可以设置断点和xdebug_break(),但只有一些文件。其他文件无法工作。
解决方案在于远程和本地路径映射的处理方式。结果发现,Komodo对路径名进行了大小写比较,因此我的映射并不完全匹配。通过步进打开的文件位于正确的路径上,但是我通过ide打开的文件具有大写驱动器字母,这显然导致Komodo忽略了它们。

3
我尝试了所有这些解决方案,但都无济于事。我感到困惑的原因是XDebug可以在其中一个项目中工作,但不能在这个新项目中工作。在比较配置属性时,我四处摸索后意识到:

项目属性 > 源 > Web根目录:

新项目的值设置为默认值,而现有项目的值设置为webroot。所以,我浏览到项目的Web根目录并设置了该值。我进行了测试,嘿,它奏效了。

enter image description here


谢谢!Web根目录的定义为我解决了完全相同的问题。 - Steven

2

我也遇到了同样的问题。我找到了解决方法,即要加载dll文件,我们应该使用zend_extension。

zend_extension=php_xdebug-2.5.5-5.6-vc11.dll 

Rest配置如下:

xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

2

我使用Eclipse并查看了一段时间。所有在php.ini中的内容都是正确的。

最后,我发现,在Eclipse中调试器设置为ZEND-Debugger。当我将其更改为XDEBUG时,它正常工作了。

祝好, Joerg


2
你确定你没有通过 extension=xdebug.so 加载 Xdebug 吗?如果这行代码出现在你的 php.ini 中(比如在 phpinfo() 的输出中出现),Xdebug 就会被加载,但是如果以这种方式加载,断点将无法正常工作。(它甚至可以连接到调试器客户端并接受断点,但它们永远不会被触发。)
我建议你注释掉 zend_extension 行,看看 Xdebug 是否仍然被加载——例如,你可能认为你是通过 /etc/php5/conf.d/xdebug.ini 加载 Xdebug 的,但是有些东西在你不知情的情况下将其添加到了 /etc/php5/apache2/php.ini 中。
有关更多信息,请参见此问题和答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接