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

Posted

技术标签:

【中文标题】远程调试不会在断点处停止【英文标题】:xdebug remote debugging won't stop at breakpoints 【发布时间】:2010-03-01 22:50:33 【问题描述】:

我在使用远程调试时遇到 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>

“行条件调用返回异常”是否意味着什么?

【问题讨论】:

进一步研究表明,“行条件调用返回异常”是支持的断点列表,而不是任何类型的错误消息。 调用 xdebug_break();在我的代码中将正确地导致调试器停止。 你能指定你的 php.ini 文件的路径吗?您是否为此主机使用 HTTPS? 使用常规 http,ini 文件位于 /opt/local/etc/php5/php.ini(MacPorts 安装的默认位置) 在遇到这个问题很长一段时间后,它似乎已通过以下方式解决:a) 从 Leopard 升级到 Snow Leopard(在 OS X 中重新安装了大部分 unix 系统)和 b) 完全重新通过 MacPorts 安装我的开发环境。 【参考方案1】:

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

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

完成。

【讨论】:

这对我也有用。显然,我之前虽然没有错误的路径映射是相对于链接文件夹的。 (对我来说就像一个错误。) 我也遇到了这个问题 - 投票最多的解决方案有效,但大概是 UI 发生了变化?我做了 Preference/Paths 然后将本地和远程路径都设置为同一个项目目录,并开始在测试文件中的断点上工作。大概与 PHPUnit 如何运行实际测试(启动新进程?)有关。 请记住,您需要在服务器文件系统上指定路径而不是 web url,例如:/var/www/html 需要映射到 C:\myworkspace\projectx 等 对我来说,问题是服务器路径设置为~/Code/mysite,我猜~ 不符合要求,所以我需要将其更改为/home/vagrant/Code/mysite。这花了我 来弄清楚。呃。 也要注意符号链接!如果您在 apache 目录中使用 PHP 链接,xdebug 将解析链接并引用链接文件而不是链接。因此,即使您将 Apache 指令设置为 /var/www/my_php/linkedFile.php,如果该链接由于某种原因解析为 /tmp/src/linkedFile.php,您也应该将路径映射设置为 /tmp/src 而不是 /var/www/my_php【参考方案2】:

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

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

然后它完美地工作了。

【讨论】:

这很好,记得在更改后重新启动 apache。 _autostart 标志是给我的。 xdebug.mode = debug xdebug.start_with_request=yes 在 Xdebug 3 中【参考方案3】:

XDebug 在我使用 NetBeans 的 Ubuntu Lucid 机器中运行良好,而且我的 php.ini (/etc/php5/apache2/php.ini) 中有 zend_extension 行。

我正在使用带有 xdebug 2.0.4-2 的 netbeans 6.9 和 PHP 5.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 中的大文件填满磁盘而崩溃,iut 是由 XDEBUG 分析器引起的...【参考方案4】:

来自 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 查找位置。

【讨论】:

我已经在使用 zend_extension。不过,感谢您的洞察力。 您确定 PHP 配置中没有 extension=xdebug.so somewhere 吗?我同时拥有 extension=xdebug.so 和 zend_extension=/path/to/xdebug.so,由于某种原因,它使用了 extension=xdebug.so,它加载了扩展,但是断点不起作用。 我仔细检查了一遍。仅使用 zend_extensions。同样,这里的问题在于通过 Web 浏览器运行时的断点。使用 CLI 脚本或 PHPUnit 一切正常。 我确定这只是 SO 上的一个拼写错误,但请检查 PHP 文件中“zend_extension”的拼写 - 如果这就是原因,那将是一种耻辱。 我希望展示这种矛盾会有所帮助。 serverfault.com/questions/202959/…【参考方案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 本地挂载远程文件系统更容易。

【讨论】:

看起来我遇到了同样的问题。在调用堆栈中,我可以看到对远程服务器上文件位置的引用。我的问题是......我正在尝试在 Windows 上调试我在 Linux 上运行的代码。有没有通用的解决方案? @JJRoman 我没有在混合环境中尝试过。或许来自 pitchandtone 的“路径映射”答案对你有用。【参考方案6】:

我刚刚使用 Komodo 遇到了与上述 safl 的评论类似的事情,但不确定是否相关:

我在 Komodo 中使用 zend_extension 设置了 xdebug,它运行良好,可以设置断点和 xdebug_break(),但只能设置一些文件。其他人没有工作。

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

谢谢!网络根定义为我解决了完全相同的问题。【参考方案8】:

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

我建议你注释掉zend_extension 行,看看它是否仍然被加载——例如,你可能认为你正在通过/etc/php5/conf.d/xdebug.ini 加载Xdebug,但是背后有东西将它添加到/etc/php5/apache2/php.ini

更多信息请参见this question & answer。

【讨论】:

【参考方案9】:

我遇到了同样的事情,并用头撞了一会儿。在某些时候,我还将 ZendDebugger.so 添加到我的 PHP.ini 中,这就是破坏 Xdebug 的原因。在我的 php.ini 中注释掉 ZendDebugger.so 行修复了它。

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

【讨论】:

【参考方案10】:

我用的是Eclipse,也找了一段时间。 php.ini 中的所有内容都是正确的。

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

问候 约尔格

【讨论】:

【参考方案11】:

我也遇到了同样的问题。我得到了加载 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

【讨论】:

【参考方案12】:

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

顺便说一句,在使用 Web IDE 时,您通常不需要设置 xdebug.idekey=webide,因为 ide 密钥是通过 url 参数自动分配的。

【讨论】:

此处的完整日志输出:pastie.org/866632。调试器在第一行停止,并忽略了所有其他断点。 日志显示 IDE 正在尝试将断点放入文件“/Users/WM_imac/Sites/wm/debug_test.php”。是否存在这样的文件,或者真正的 debug_test.php 位置不同?【参考方案13】:

我不时遇到这个问题,但一直无法找出问题的真正原因。

我通常是这样解决的,

    在构建实例和加载类的客户端代码上放置更多断点(因为 XDebug 似乎会因为类加载问题而忽略一些断点)。您可以通过一些步骤来了解并了解这些位置的位置。

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

【讨论】:

【参考方案14】:

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

已修复编辑文件:nbproject/private/private.properties: 并设置:

copy.src.files=false

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

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

我希望这会有所帮助。

【讨论】:

【参考方案15】:

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

通过在类似这样的论坛上搜索检查了 php.ini 和 Netbeans 中的所有配置设置后,我发现如果项目的索引文件是 PHP 文件,netbeans 只会在断点处中断。这非常重要,否则您将花费​​数小时试图找出断点不起作用的原因。

在 Netbeans 中进入文件/项目属性/运行配置并检查索引文件是否为 PHP 文件。就我而言,我将索引文件从 testform.html 更改为 testform.php 并且它有效,我能够在断点处中断。

【讨论】:

【参考方案16】:

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

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

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

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

检查这是否是问题:

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

【讨论】:

【参考方案17】:

路径中的异常符号也可能存在问题。例如,我的代码按路径定位:

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

而且我什么也抓不到,但改变路径后问题消失了:

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

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

【讨论】:

【参考方案18】:

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

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

【讨论】:

【参考方案19】:

我无法对帖子发表评论,因此这篇帖子。

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

【讨论】:

【参考方案20】:

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

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

【讨论】:

【参考方案21】:

只是为了快速更新这个主题,我在新的开发设置中遇到了类似的问题,这显然是一个版本问题:至少 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,现在一切都好。

希望对某人有所帮助;)

【讨论】:

【参考方案22】:

就我而言,当我将 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

【讨论】:

【参考方案23】:

要修复调试 PHP CLI 的问题,

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

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

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

【讨论】:

【参考方案24】:

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

还要确保您有足够的权限。我尝试通过 NetBeans 进行同步并获得 Permission denied

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

【讨论】:

以上是关于远程调试不会在断点处停止的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 调试器和远程调试器不工作

当前不会命中断点 - 远程调试

Eclipse调试器和远程调试器无法正常工作

在 Eclipse 中调试基于 AIDL 的远程服务

Visual Studio 2010 C# 调试器不会在新断点处停止

颤振调试器不会在断点处停止