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

时间:2010-03-01 22:50:34

标签: php debugging xdebug

我在使用远程调试时xdebug没有在断点处停止时遇到问题(通过命令行运行脚本时一切正常)。它将在程序的第一行中断,然后退出,而不是捕获任何断点。

过去工作正常,直到我切换到使用MacPorts for Apache和PHP。我已经尝试过多次重新编译(有几个版本),但没有骰子。

我正在使用PHP 5.3.1和Xdebug 2.1.0-beta3

我还尝试过至少3种不同的调试程序(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条件调用返回异常'是否意味着什么?

24 个答案:

答案 0 :(得分:33)

我遇到了这个问题并花了很多时间才找到答案。

在调试配置中,在服务器区域中,单击“配置”,转到“路径映射”,单击其中的路径,然后单击“编辑”,更改为“文件系统中的路径”并导航到正确的文件。

完成。

答案 1 :(得分:19)

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

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

然后它完美无缺。

答案 2 :(得分:8)

XDebug使用NetBeans在我的Ubuntu Lucid框中运行良好,我的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

答案 3 :(得分:7)

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

所以,这为我解决了这个问题:

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

延长= xdebug.so

相反,请使用

的zend_extension = /路径/到/ Xdebug的/模块/ xdebug.so

(对我来说,这就像/usr/lib/php5/(...)/xdebug.so)

答案 4 :(得分:5)

我遇到了同样的问题,我的解决方案是将本地代码放在与远程代码相同的路径上。

实施例

在网络服务器上,代码位于路径:/var/www/dev01/app_name

本地代码位于我的主目录中:/home/me/projects/app_name

此配置导致我的IDE(Eclipse和Komodo)直接飞过断点。

将本地路径从/home/me/projects/app_name更改为/var/www/dev01/app_name解决了问题。 使用sshfs本地挂载远程文件系统使其更加容易。

答案 5 :(得分:4)

我刚刚使用Komodo经历过类似于safl上述评论的内容,但不确定它是否相关:

我使用zend_extension和Komodo设置了xdebug并且它工作正常,可以设置断点和xdebug_break(),但只能设置一些文件。其他人没有工作。

解决方案的方式是发生远程和本地路径的映射。事实证明,Komodo正在对路径名做一个区分大小写的比较,所以我的映射并不完全匹配。调试器逐步打开的文件位于正确的路径上,但我通过ide打开的文件有一个大写的驱动器,显然导致Komodo忽视。

答案 6 :(得分:3)

我尝试了所有这些解决方案无济于事。我很困惑,因为XDebug为我的一个项目工作但不是这个新项目。在比较配置属性后,我意识到了

  

项目属性&gt;来源&gt; Web root:

在新项目中将值设置为default value,但在现有项目上设置为webroot。所以,我浏览了项目的webroot并设置了该值。我测试了它,bada-bing,它有效。

enter image description here

答案 7 :(得分:2)

你完全确定你没有通过extension=xdebug.so加载Xdebug吗?如果此行显示在php.ini中(即它出现在phpinfo()输出中等),Xdebug将加载,但如果以这种方式加载,则断点不起作用。 (它甚至可以连接到调试器客户端,并接受断点 - 它们永远不会被触发。)

我建议您注释掉zend_extension行并查看它是否仍然加载 - 例如,您可能认为您正在通过/etc/php5/conf.d/xdebug.ini加载Xdebug,但有些内容已添加到{{1}在你背后。

有关详细信息,请参阅this question & answer

答案 8 :(得分:2)

我遇到了同样的事情,并且正在猛烈地撞击它一段时间。在某些时候,我还将ZendDebugger.so添加到我的PHP.ini中,这就是破坏Xdebug的原因。在我的php.ini中注释掉ZendDebugger.so行修复了它。

如果您没有使用ZendDebugger,您可能只是开始禁用其他Zend扩展,看看它是否是导致冲突的另一个扩展。

答案 9 :(得分:2)

我使用Eclipse并且还看了一会儿。 php.ini中的所有内容都是正确的。

最后,我发现,Eclipse中的 调试器设置为ZEND-Debugger。在我将其更改为XDEBUG之后,它运行正常。

此致 约尔格

答案 10 :(得分:2)

我也有同样的问题。我得到了加载dll文件的解决方案,我们应该使用zend_extension。

zend_extension=php_xdebug-2.5.5-5.6-vc11.dll 

休息配置

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

答案 11 :(得分:0)

要解决调试PHP CLI的问题,

将环境变量添加到〜/ .bashrc中(然后重新加载):

export PHP_IDE_CONFIG="serverName=www.yourservernameurl.com"
export XDEBUG_CONFIG="idekey=PHPSTORM"

(我使用phpstorm,但是您可以根据需要省略第二个)

答案 12 :(得分:0)

您是否可以在尝试使用Web IDE进行调试时提供完整的会话日志?

BTW使用Web IDE时,您通常不需要设置xdebug.idekey = webide,因为ide键是通过url参数自动分配的。

答案 13 :(得分:0)

就我而言,当我将zend_extension项目从[xdebug]上方移至[xdebug]下方时,效果很好。

;zend_extension = "D:\wamp\bin\php\php5.6.25\ext\php_xdebug-2.5.4-5.6-vc11-
x86_64.dll"
[xdebug]
zend_extension ="D:/wamp/bin/php/php5.6.25/zend_ext/php_xdebug-2.4.1-5.6-vc11.dll"

xdebug.auto_trace = On
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.profiler_enable = On
xdebug.profiler_enable_trigger = On

答案 14 :(得分:0)

只是为了快速更新该主题,我的新开发人员设置也遇到了类似的问题,而且显然是版本问题:至少在PHP版本7.1.20-1 + ubuntu16.04.1 + deb.sury.org + 1个xdebug 2.7.1无效:

它成功执行了第一个请求(我在一个Symfony项目中,所以它是router.php),但是随后当我的IDE(PHPSTORM)要求另一个断点时,它崩溃了,所以没有断点日志,当然我的页面也没有也加载^^。

我发现它看着日志(在php.ini中,您可以使用xdebug.remote_log参数对其进行自定义)。希望我将xdebug回滚到2.6.1,现在一切正常。

希望对您有所帮助;)

答案 15 :(得分:0)

我讨厌这些配置。当我知道lib Dephpugger时,我的生活发生了变化。

是否在终端中运行调试器(如Python的ipdb和Ruby的byebug)。 https://github.com/tacnoman/dephpugger 很容易使用。

答案 16 :(得分:0)

我不能对这篇文章发表评论。

我的问题的解决方案很像pitchandtone说。 Eclipce制作了错误的双路径映射项。不过我可以使用相对路径(即/ project / folder)。

答案 17 :(得分:0)

我正在尝试使用PhpStorm进行调试,但它并没有停留在某些断点处,而是在我尝试使用Google时可以找到的每个解决方案时开始忽略更多。

问题是在后台运行的多个分离的PHP进程实际上处理了我的请求。 PhpStorm并没有在断点处停止,因为我正在调试的过程没有接收到请求。 杀死这些流程为我解决了这个问题。

答案 18 :(得分:0)

路径中的异常符号也可能存在问题。例如,我通过路径找到了我的代码:

C:\[dev]\OpenServer\domains\...

我无法抓住任何东西,但在改变路径问题后消失了:

C:\dev\OpenServer\domains\...

所以即使是括号也很重要。

答案 19 :(得分:0)

说到路径,OSX文件系统不区分大小写,但xdebug似乎是。

在我的情况下,即使我使用/proj/test.php而不是/Proj/test.php运行脚本,一切似乎都有效。

当xdebug(或至少我目前的版本)检查断点时,检查区分大小写。如果为/Proj/test.php设置了断点,但脚本是通过/proj/test.php运行的,那么就没有匹配。

我的PHP包含路径也有类似的问题。路径包括/ proj -directory,这是错误的。运行代码工作,但由于断点是使用/ Proj设置的,因此它们没有被命中。

检查这是否是问题:

  • 启用日志记录,-dxdebug.remote_log = / tmp / remote.log
  • 设置断点时检查日志中的确切路径
  • 比较PHP解释器使用的路径,例如:echo dirname(__ FILE__);

答案 20 :(得分:0)

我有一个类似的问题,并遇到一个帖子来解决问题。我的html表单(testform.html)调用了一个php脚本(runQuery.php),Netbeans无法在runQuery.php的设置断点处中断

通过在像这样的论坛上搜索检查php.ini和Netbeans中的所有配置设置后,我发现如果项目的索引文件是PHP文件,netbeans将仅在断点处中断。这非常重要,否则你将花费数小时试图弄清楚为什么断点不起作用。

在Netbeans中,进入文件/项目属性/运行配置,检查索引文件是否为PHP文件。在我的情况下,我将我的索引文件从testform.html更改为testform.php并且它工作正常,我能够突破断点。

答案 21 :(得分:0)

在我的情况下,问题只发生在一个项目中(我只能使用xdebug_break中断),而在其他项目中工作正常。

修复了以下文件: nbproject / private / private.properties : 并设置:

copy.src.files=false

当我创建项目时,我错误地选择了“复制源”选项。然后我手动移动项目并编辑其源路径(在“nbproject / project.properties”文件中),调试器仍然在寻找旧路径(在copy.src.target中设置)。

从技术上讲,修复此DEBUG问题的其他方法是重新创建nbproject目录(通过删除它并再次创建项目)。我想调试器应该可以正常启用“复制”选项(因为我从不使用它)。

我希望这可以提供帮助。

答案 22 :(得分:0)

我经常碰到这个问题,但从来没有找到问题的真正原因。

我通常会解决,

  1. 在构造实例和加载类的客户端代码中放置更多断点(因为看起来XDebug会因类加载问题而忽略一些断点)。您可以通过一些步骤来学习和了解这些位置的位置。

  2. 检查依赖项的源路径。 XDebug通过完整路径获取这些文件,您可以在断点面板上看到IDE如何处理它们。

答案 23 :(得分:-1)

还要确保文件在本地和远程同步,否则断点可能会落在无效区域,例如空行,它将无法正常工作。

还要确保您具有足够的权限。我试图通过NetBeans进行同步,但权限被拒绝

还要确保在启动调试器后正确设置浏览器中的URL。我的nbproject文件夹中有一个旧的URL。