Xdebug 即使在记录中断时也不会在断点处停止,而是说它已连接到客户端

Posted

技术标签:

【中文标题】Xdebug 即使在记录中断时也不会在断点处停止,而是说它已连接到客户端【英文标题】:Xdebug doesn't stop on breakpoints even when it logs a break, but says it is connected to client 【发布时间】:2015-08-27 04:33:06 【问题描述】:

我已经尝试了几个星期来让我的 phpStorm 通过 Xdebug 连接到远程主机。最近我发现客户端的主机阻塞了端口 9000。我终于解决了这个问题,现在 xdebug 日志显示它正在连接到客户端(当然是我)。

但是,它不会在任何断点处停止。 PHPStorm 中设置的断点甚至不会出现在日志中。调用xdebug_break(); 至少会被记录为休息,但它仍然没有停止。

基于此处的其他问题,我已确认 xdebug 加载了 zend_extention=/full/path/xdebug.so 而不是 extension=xdebug.so

我也尝试过从端口 9000 切换到端口 9001,结果没有任何变化。

日志条目是:

Log opened at 2015-06-09 14:41:10  //and many other dates and times
I: Checking remote connect back address.
I: Remote address found, connecting to MY.IP.HE.RE:9000.  //similar message on port 9001 after trying that
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///chroot/home/company/remotehost.com/html/index.php" language="PHP" protocol_version="1.0" appid="2294" idekey="PHPSTORM"><engine version="2.2.2"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2013 by Derick Rethans]]></copyright></init>

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="break" reason="ok"><xdebug:message filename="file:///chroot/home/company/remotehost.com/html/app/code/community/Zzyzzx/Stores/controllers/TestController.php" lineno="11"></xdebug:message></response>

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

Log closed at 2015-06-09 14:41:13

它从中获取的文件在 IDE 中设置了 3 个断点,其中一个在第 11 行编码。

什么可能导致它无法遵循断点并让我调试?

我在服务器设置中使用的路径是/home/company/remotehost.com/html 映射到我的项目根目录,其中包含相同的文件。我理解这是从根目录开始的绝对路径,如果我理解的话,它会通过显示代码中断的日志来确认。它是唯一具有路径集的文件。我需要为每个文件设置路径吗?

我还尝试删除服务器以希望触发对话,但它没有被触发,我只是得到与新时间/日期/IP完全相同的日志条目。

我刚刚发现,每当我尝试重新加载我正在调试的页面时,在我的“运行”菜单中有一个“恢复程序”选项,它会显示一个包含我正在尝试调试的文件的列表。单击它会打开调试工具窗口,其中显示消息“正在等待来自 JetBrains IDE Support extension for Chrome...的连接”。这不是用于调试javascript吗?它是否试图将我的 PHP 调试为 Javascript?

我还尝试使用其他几个具有类似结果的 xdebug 客户端。它连接然后给出相同的消息。让我觉得这不是 PHPStorm。

我尝试过的所有方法都在尝试调试以下代码:

    class Zzyzzx_Stores_TestController extends Mage_Core_Controller_Front_Action

    public function indexAction()
    
        echo "in the controller 1 <br />";
        xdebug_break();
        echo "in the controller 2 ";
        //3 commented lines of unused code
        //
        //
        phpinfo();
        //2 commented lines of unused code
        //
    

每个“echo”的ide中都设置了breaks,当然你可以看到编码的break。

在本地调试这个工作正常。

【问题讨论】:

很可能缺少路径映射。 1) jetbrains.com/phpstorm/quickstart/debugger.html 2) confluence.jetbrains.com/display/PhpStorm/… 那么..你解决了吗? 不,还没有。由于客户的原因,它被搁置了几天。路径映射看起来不错。有没有办法删除所有映射并强制它再次执行向导? 另外,@LazyOne 你能确认路径图应该是绝对的根目录还是相对于项目? 1) 是的——只需删除那个“服务器”条目(或在那里更改主机名)——如果 IDE 没有看到任何具有正确 hostname:port 对的条目,它将触发那个小对话框/向导再次。 2) 远程路径应该是从根目录开始的绝对 路径。还要确保它是最终/已解析路径(即其中没有符号链接)——这就是 xdebug 的工作方式——它解析所有符号链接并仅适用于最终路径。 【参考方案1】:

断点不起作用的一个原因是 Mac OSX 奇怪的大小写敏感性。

我发现,如果文件名与类的大小写不匹配,则仅针对该文件的断点将不起作用,即使应用程序的其余部分调试正常,并且“在第一行中断”显示调试器正常工作。

OSX 上的文件系统本质上是不区分大小写的,但奇怪的是命令行是区分大小写的,这会让你误以为它更像其他区分大小写的 Unix。然后,这会让您相信永远不会出现大小写不匹配的情况,因为它会完全损坏并且您会注意到!

但我觉得 OSX 的运行方式确实更像 Windows - 在这方面非常宽容,直到您将文件上传到 Linux 服务器...

我在LegacyJSONMetadataMapper.php 中有一个名为LegacyJsonMetadataMapper 的课程。自动加载器工作正常,应用程序工作正常,PHPStorm 没有提到大小写的区别——我没有注意到。但它根本不会触发任何断点。后来花了一个小时摆弄映射和服务器配置(这已经工作了多年!),然后我读到了a PHPStorm bug report,其中提到了这一方面。我改变了大小写,断点现在可以工作了。

注意,如果命名空间路径中的任何文件夹与命名空间“slugs”的大小写不匹配,也会发生这种情况。我只是遇到了同样的问题(一些断点工作,一些没有)。

【讨论】:

我自己可能也遇到过这个问题。我将 docroot 从一个大写字母的文件夹中移出,重新启动 PHPStorm 并在新文件夹中打开项目,在 xdebug 和 phpstorm 中将端口设置为 9001,它终于工作了。这可能是 PHPStorm 的重新启动,但我之前一直在尝试端口 9001。这是区分大小写的潜在 +1。

以上是关于Xdebug 即使在记录中断时也不会在断点处停止,而是说它已连接到客户端的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 中的 Xdebug 不会在命令行的 Laravel artisan 命令的断点处停止

Xdebug 停止工作并且无法在断点处停止

Sublime xdebug 在 ..."get_option(" 没有断点处中断

Xdebug V3 不会停止 VSCode 中的断点

Visual Studio 代码调试器未在 SAM Local 的断点处停止

即使没有 DOM 断点,Chrome 调试器也会在某个函数处停止