远程调试不会在断点处停止
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。
【讨论】:
以上是关于远程调试不会在断点处停止的主要内容,如果未能解决你的问题,请参考以下文章