【问题标题】:Xdebug successfully connects to DBGP clients, but won't stop at breakpointsXdebug 成功连接到 DBGP 客户端,但不会在断点处停止
【发布时间】:2010-07-20 10:00:03
【问题描述】:

我安装了Xdebug 2.1,并使用 PHP 5.2.13 运行。它可以成功连接到多个 DBGP 客户端(即xdebug.remote_log 显示来回通信,客户端本身也显示传入连接),但它不会在断点处停止。我已经尝试过NetBeansMacGDBp 以及与 Xdebug 捆绑在一起的命令行 debugclient

典型的交换看起来像:

Log opened at 2010-07-20 09:33:17
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///mnt/hgfs/htdocs/mycompany/index.php" language="PHP" protocol_version="1.0" appid="14371" idekey="macgdbp"><engine version="2.1.0"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2010 by Derick Rethans]]></copyright></init>

<- status -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="status" transaction_id="macgdbp" status="starting" reason="ok"></response>

<- step_into -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="step_into" transaction_id="macgdbp" status="stopping" reason="ok"></response>

<- status -i macgdbp
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="status" transaction_id="macgdbp" status="stopping" reason="ok"></response>

Log closed at 2010-07-20 09:33:18

NetBeans 尝试设置断点,这些被 Xdebug 确认:

<- breakpoint_set -i 7 -t line -s enabled -f file:///mnt/hgfs/htdocs/mycompany/index.php -n 9
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="7" state="enabled" id="139360004"></response>

但是,Xdebug 仍然拒绝停止!

【问题讨论】:

    标签: php netbeans debugging breakpoints xdebug


    【解决方案1】:

    如果您在 PHP 配置中将 Xdebug 加载为extension(即extension=xdebug.so)而不是zend_extension(即zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so),就会出现这种情况。

    确保你的 PHP 配置中没有extension=xdebug.soanywhere,即使你很确定你使用的是zend_extension .例如,如果您在/etc/php5/conf.d/xdebug.ini 中有zend_extension,则很可能会被/etc/php5/apache2/php.ini 中的extension 取代。如果是这样的话,什么都不会抱怨,phpinfo() 会尽职尽责地报告 Xdebug 已加载! (Xdebug 2.1 在作为扩展加载时确实会在 phpinfo() 中发出一个小警告,但以前的版本什么也不做。)

    【讨论】:

    • 哇,在使用 MacGDBP 配置远程调试时遇到了一些奇怪的行为,这真的救了我。我可以在 xdebug.remote_log 中看到连接成功,并且客户端正在接收连接,但连接很快被丢弃。客户端也没有输出。按照您的建议更改了“extension=xdebug.so”,一切顺利。
    • 您先生成就了我的一天。如果可以,我会投票一千次。
    【解决方案2】:

    我在 Windows 上的 Docker 容器上遇到了这个问题。一切似乎都已正确配置,phpStorm 正确侦听 127.0.0.1 上的本地端口 9000。 phpinfo() 显示 xdebug.so 正在运行。当我从 Web 浏览器运行脚本时,调试器未能在断点处停止。 xdebug.log 包含以下内容:

    Log opened at 2019-07-02 08:17:10
    I: Connecting to configured address/port: docker.for.mac.localhost:9000.
    I: Connected to client. :-)
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///app/www/index.php" language="PHP" xdebug:language_version="7.2.15" protocol_version="1.0" appid="38768" idekey="PHPSTORM"><engine version="2.6.1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2018 by Derick Rethans]]></copyright></init>
    
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>
    
    Log closed at 2019-07-02 08:17:10 
    

    我不得不通过 ssh 进入容器,以发现它没有从容器连接到托管容器的 Windows。问题是,我的 docker compose 配置包含 docker.for.mac.localhost 即将设置为 xdebug.remote_host 设置。即使 xdebug.log 声称 xdebug 连接到客户端,实际上它并没有连接。

    解决方案是xdebug.remote_host = host.docker.internal 此主机名在 Docker 容器中用于与托管容器的操作系统建立本地连接。

    更多信息在这里:https://docs.docker.com/docker-for-mac/networking/

    【讨论】:

    • 终于!!!经过几天试图找出问题!我的问题是我启用了 xdebug.discover_client_host,但我没有指定 xdebug.client_host。我禁用了 discover_client_host 并设置了 client_host=host.docker.internal。
    【解决方案3】:

    您必须将完整路径添加到xdebug.so 文件中,即使它位于php/modules/ 文件夹中,因为zend_extension 默认情况下不会在此文件夹中查找。

    如果你有一个exension=xdebug.so 行,xdebug 会加载,但它不会在断点处停止(为什么会打我)。

    删除所有exension=xdeabug.so(甚至从也会加载的cli ini文件中)并添加zend_extension将解决问题。

    【讨论】:

    • 这只是重复@mjs所说的一切......一个2岁的问题的答案应该比这个更好。
    • 我只是澄清你必须使用完整路径,他说“zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so”但我认为他使用了这个路径,因为他有那里的编译版本或其他什么,当我将 xdebug.so 放在 php/modules 文件夹中时,我没有放置完整路径(就像你使用“扩展”指令所做的那样),这不起作用。
    【解决方案4】:

    如果将 php 文件放入 symlink-folder 中,那么 XDebug 将使用源文件夹路径而不是 symlink-folder 路径进行操作!

    因此,要启用断点,您应该在 ide 中为符号链接的文件夹和文件配置路径映射

    【讨论】:

      【解决方案5】:

      我知道这已得到解答,但我遇到了同样的问题,只是想在其他人遇到此问题时提供我的答案。我不小心错过了路径中的一个 case 值,它仍然允许我连接并运行调试器,但它不会在我的断点处停止。我直到非常沮丧才意识到这一点,所以我只是想让人们知道这也可能是一种可能性。

      【讨论】:

        【解决方案6】:

        在我的情况下,Eclipse 无法获取调试信息,因此启用 xdebug 日志并检查响应,返回 &lt;response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"&gt;&lt;/response&gt; 没有更多信息。

        修复是更改调试配置

        xdebug.remote_host=127.0.0.1 to
        xdebug.remote_host=localhost
        

        在 /usr/local/etc/php/5.6/php.ini

        然后重新启动 Apache。

        希望对你有帮助

        【讨论】:

        • 嘿,我在 xdebug 日志中也得到了相同的结果。但是您的解决方案对我不起作用。我正在使用 Netbeans,代码在 Remotehost Cent OS 7 中。任何帮助将不胜感激。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2015-08-27
        • 2018-03-31
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 2020-02-01
        相关资源
        最近更新 更多