Xdebug忽略Netbeans中为Docker容器

时间:2016-05-21 01:47:05

标签: debugging netbeans docker ubuntu-14.04 xdebug

当我调试未在Docker容器中创建的项目时,Xdebug没有问题。

但是当我调试在Docker容器中创建的项目时,Xdebug不会在断点处停止 - 虽然它正在运行但它在xdebug_break()上停止。

我的Docker主机是Ubuntu 14.04。它安装为VirtualBox。它使用PHP 5.5.9-1ubuntu4.16和Xdebug v2.2.3。我有一个已安装的卷(在Docker主机和Docker容器之间),其中存储了在Docker容器中创建的项目。

Ubuntu 14.0.4中的我的Docker容器基于CentOS版本6.7(最终版)。它使用PHP 5.3.29和Xdebug v2.1.4,它的Xdebug配置如下(在/etc/php.d/xdebug.ini中):

zend_extension=/usr/lib64/php/modules/xdebug.so
;xdebug.remote_autostart = 0
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1
;xdebug.remote_host = 127.0.0.1
;xdebug.remote_host = localhost
;xdebug.remote_host = 172.17.42.1
;xdebug.remote_host = 10.0.2.15
;xdebug.remote_host = 10.0.2.2
;xdebug.remote_port = 9001
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = /home/devteam/xdebug/profiler
xdebug.remote_log=/home/devteam/xdebug/xdebug.log
xdebug.profiler_output_name = cachegrind.out.%c
xdebug.show_exception_trace = 1
xdebug.idekey = netbeans-xdebug

我已检查xdebug.remote_port设置的所有值,当前显示为已注释掉的值。我为xdebug.remote_port设置尝试了不同的端口(9001,9002)(当然在Netbeans中设置了相同的端口)。我还尝试更改xdebug.remote_connect_back和xdebug.remote_autostart设置。我注意到,将这两个设置为零,xdebug实际上是挂起并等待连接。

但是在调试以前部署在Docker容器中的项目时,我仍然无法让Xdebug在断点处停止。

我不确定是否遗漏了有关Netbeans设置或Xdebug设置的任何内容。我花了很多时间试图找到解决方案。我试图在xdebug.log中找到一些相关信息 - 但它似乎没有包含任何对我有意义的信息:

...
<- breakpoint_set -i 1567 -t line -s enabled -f file:///var/www/html/test/index.php -n 3
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="1567" state="enabled" id="11710015"></response>

<- breakpoint_set -i 1568 -t line -s enabled -f file:///home/pkowalski/clients/deployments/demon-prep/application/bootstrap_http.php -n 7
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="1568" state="enabled" id="11710016"></response>

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

Log closed at 2016-05-20 23:38:11

Log opened at 2016-05-20 23:40:23
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///mnt/deployments/demon-prep/application/bootstrap_http.php" language="PHP" protocol_version="1.0" appid="1172" idekey="netbeans-xdebug"><engine version="2.1.4"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2012 by Derick Rethans]]></copyright></init>

<- feature_set -i 1570 -n show_hidden -v 1
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="feature_set" transaction_id="1570" feature="show_hidden" success="1"></response>
...

它似乎成功设法设置断点,但我不确定xdebug.log中的文件路径是否正确。也许我需要在Netbeans中使用手动路径映射,但我不知道该怎么做以及哪条路径应该是服务器路径。

现在,如果我开始调试,页面会加载。但是之前的一段时间,浏览器内部出现错误,说连接已重置。 除此之外,还出现了几次错误弹出窗口。有时候一个弹出窗口说Netbeans和Xdebug之间存在通信问题。其他时间显示不同的消息 - 存在套接字连接错误。我不知道为什么现在我没有看到这些弹出窗口。

知道什么是Xdebug的解决方案,忽略了Netbeans中在Docker容器内创建的项目中的断点?

2 个答案:

答案 0 :(得分:3)

最后我自己解决了这个问题。

正如我所料,解决方案是在Netbeans中正确设置路径映射

今天再次分析xdebug.log之后,我注意到日志的开头包含了有趣的信息 - init 的属性值元素:

<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///mnt/deployments/my-project/application/bootstrap_http.php" language="PHP" protocol_version="1.0" appid="139" idekey="netbeans-xdebug"><engine version="2.1.4"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2012 by Derick Rethans]]></copyright></init>

在我的Docker容器的 run docker子命令期间,我与Docker容器共享我的Docker主机目录(包含 my-project )的方式是:docker run。 .. -v / home / pkowalski / clients / deploymentments:/ mnt / deployment

所以我用Netbeans忽略了 my-project 的断点来解决问题,我只是在Netbeans中设置路径映射(项目属性 - &gt;运行配置 - &gt;高级),如下所示:

服务器路径:/ mnt / deployments / my-project

项目路径:/ home / pkowalski / clients / deployments / my-project

因为我在Docker容器中为已挂载的目录创建了一个软链接: ln -s / mnt / deployments / home / devteam / deployments ,最初我尝试将 / home / devteam / deployments / my-project 作为服务器路径值,但它不起作用。

除此之外,现在它适用于我,完全没有设置 xdebug.remote_host 并且 xdebug.remote_autostart 设置为零或一。

以下是我在Docker容器中 /etc/php.d/xdebug.ini 的最终工作内容:

zend_extension=/usr/lib64/php/modules/xdebug.so 
xdebug.remote_autostart = 0
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp

答案 1 :(得分:0)

我的朋友,我的机器遇到了类似的问题。我的机器已经进行了常规安装,并安装了docker模块。所以我要做的是解开php-xdebug程序包,它为我解决了。

命令:sudo apt purge php-xdebug