2010-03-01 91 views
34

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

它用于正常工作,直到我切换到使用MacPorts的Apache和PHP。我试过几次重新编译它(有几个版本),但没有骰子。

我使用PHP 5.3.1和Xdebug 2.1.0-β3

我也试了至少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>

是 '有条件行调用返回的异常' 意味着什么?

+0

进一步的研究表明'行条件调用返回异常'是支持的断点列表,而不是任何类型的错误消息。 – 2010-03-02 01:08:52

+2

调用xdebug_break();在我的代码中会正确地导致调试器停止。 – 2010-03-03 17:08:38

+0

你能指定你的php.ini文件的路径吗?你使用HTTPS为这个主机? – DrDol 2010-08-08 22:07:27

回答

7

from 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

(FO r我,这是像/usr/lib/php5/(...)/xdebug.so)

+2

我已经在使用zend_extension。尽管如此,感谢您的洞察力。 – 2010-03-12 15:35:15

+0

您确定PHP配置中没有扩展名= xdebug.so * somewhere *吗?我有两个extension = xdebug.so和zend_extension =/path/to/xdebug.so,由于某些原因,它使用extension = xdebug.so,它加载了扩展名,但断点不起作用。 – mjs 2010-07-20 21:57:37

+0

我再次检查。只使用zend_extenstion。同样,这里的问题是通过Web浏览器运行时的断点。一切正常使用CLI脚本或PHPUnit。 – 2010-07-21 13:59:32

0

你可以提供完整的会话日志,而试图与Web IDE调试?

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

+0

完整的日志输出在这里:http:// pastie .ORG/866632。调试器在第一行停止,并忽略所有其他断点。 – 2010-03-12 15:47:54

+0

日志显示IDE正试图将断点放置到文件'/Users/WM_imac/Sites/wm/debug_test.php'。这样的文件是否存在,或者真正的debug_test.php具有不同的位置? – ksafonov 2010-03-24 09:31:59

0

我不时遇到这种情况,从来没有找到问题的真正原因。

我通常解决,

  1. 在客户端代码放置多个断点构建实例和加载的类(因为它看起来的XDebug会忽略由于类加载问题的一些断点)。您可以通过一些插件了解并了解这些位置的位置。

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

2

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

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

查看this question & answer了解更多信息。

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 
+0

小心轮廓仪,我有一个系统非常缓慢,然后崩溃,因为在/ tmp中填充了大文件的磁盘,iut被XDEBUG分析器托管... – pgr 2016-04-17 10:49:58

5

我也有同样的问题对我来说,解决方案是让本地代码与远程代码处于相同的路径。

在Web服务器上的代码所在的路径:/var/www/dev01/app_name

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

这种配置使我的IDE(Eclipse和科莫多)直接飞过断点。

修改本地路径从/home/me/projects/app_name/var/www/dev01/app_name修复了这个问题。 使用sshfs在本地安装远程文件系统使其更容易。

+0

这正是我的解决方案。奇怪的是,这是必要的。 – h00ligan 2014-02-21 11:36:19

+0

看起来像我遇到同样的问题。在调用堆栈中,我可以看到对远程服务器上文件位置的引用。我的问题想法是...我试图在Windows上调试我在Linux上运行的代码。有没有通用的解决方案? – 2015-07-07 08:31:20

+0

@JJRoman我还没有在混合环境中尝试过。 也许Pitchandtone的“路径映射”答案将适用于您。 – safl 2015-07-08 08:51:52

17

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

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

然后,它完美地工作。

+0

这很好,请记住在更改后重新启动Apache。 _autostart标志是我的。 – Bradley 2014-03-14 07:58:40

+0

很好,谢谢! – 2014-08-25 11:47:08

4

我刚刚经历过类似的东西,以SAFL的评论上述使用科莫多,但不知道这是否是相关的:

我Xdebug的设置使用与科莫多的zend_extension和它完美的作品,可以设置断点和xdebug_break(),但只一些文件。其他人没有工作。

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

31

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

在你的调试配置,服务器区域,单击配置,进入路径映射中,按一下那里的路径,然后单击编辑,更改路径文件系统并导航到正确的文件。

完成。

+0

太棒了!这对我很有用 – webdevbyjoss 2011-10-05 09:50:21

+0

这也适用于我。显然,我的以前,虽然没有错误的路径映射是相对于链接的文件夹。 (感觉像是一个bug。) – 2012-11-26 13:26:09

+0

我遇到了这个 - 顶级投票的解决方案工作,但大概UI已经改变了?我做了Preference/Paths,然后将Local和Remote路径设置为同一个项目目录,并开始在Test文件中的断点上工作。大概与PHPUnit如何运行实际测试有关(开始一个新过程?)。 – brez 2013-10-09 21:42:39

2

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

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

0

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

它是固定的编辑文件:nbproject文件/私营/ private.properties: 并设置:

copy.src.files=false 

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

所以从技术上来说,其他的方式来解决这个问题,DEBUG是重新创建nbproject文件目录(删除并重新创建项目)。我想调试器应该可以正常使用“复制”选项(因为我从不使用它)。

我希望这可以提供帮助。

3

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

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

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

enter image description here

+0

感谢您的支持! Web根定义为我解决了完全相同的问题。 – Steven 2012-08-10 11:52:18

2

我使用Eclipse,也看了一会儿。所有东西在php.ini都是对的。

最后我发现,在Eclipse的调试器中设置得如此ZEND-Debugger。在我将其更改为XDEBUG后,它工作正常。

问候 约尔格

0

我有一个类似的问题和跨岗位来解决这个问题。我的html表单(testform.html)调用了一个php脚本(runQuery.php),Netbeans无法在我的runQuery中的设置中断点处中断。php

在php.ini和Netbeans中查找所有配置设置后,我发现如果项目的索引文件是PHP文件,netbeans只会在断点处断开。这非常重要,否则你会花几个小时试图弄清楚为什么断点不起作用。

在Netbeans进入文件/项目属性/运行配置,并检查索引文件是一个PHP文件。在我的情况下,我将我的索引文件从testform.html更改为testform.php,并且它工作正常,我可以在断点上断开。

0

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

在我而言似乎一切,即使我用 ROJ/test.php的中/ P ROJ/test.php的不是/ P上运行,该脚本工作。

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

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

要检查是否这就是问题所在:

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

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

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

而且我无法赶上什么,但改变路径问题后消失:

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

因此,即使支架无所谓。

0

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

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

0

我不能评论一篇文章,因此这篇文章。

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

0

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

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

相关问题