Xdebug 忽略在 Docker 容器内创建的 Php 项目的 Netbeans 中的断点
Xdebug ignores breakpoints in Netbeans for Php project created inside Docker container
当我调试不是在 Docker 容器内创建的项目时,Xdebug 没有问题。
但是当我调试在 Docker 容器内创建的项目时,Xdebug 不会在断点处停止 - 尽管它是 运行 并且它在 xdebug_break() 处停止。
我的 Docker 主机是 Ubuntu 14.04。它作为 VirtualBox 安装。它使用 PHP 5.5.9-1ubuntu4.16 和 Xdebug v2.2.3。我有一个已安装的卷(在 Docker 主机和 Docker 容器之间),其中存储了在 Docker 容器内创建的项目。
我的 Docker 容器 Ubuntu 14.0.4 基于 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 之间存在通信问题。其他时间显示不同的消息 - 存在套接字连接错误。我不确定为什么现在看不到这些弹出窗口。
知道对于在 Docker 容器内创建的项目,Xdebug 忽略 Netbeans 中的断点的解决方案是什么吗?
最后我自己解决了这个问题。
如我所料,解决方案是在 Netbeans 中正确设置 路径映射。
今天再次分析xdebug.log后,我注意到日志的开头包含有趣的信息-属性值fileuri[= init 元素的 48=]:
<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 主机目录的方式,包含 my-project,Docker 容器,在 运行 docker 我的 Docker 容器的子命令是:docker 运行 ... -v /home/pkowalski/clients/deployments :/mnt/deployment.
所以我所做的是解决 Netbeans 忽略 my-project 断点的问题,我只是在 Netbeans 中设置路径映射(项目属性 -> 运行配置->高级)如下:
服务器路径:/mnt/deployments/my-project
项目路径:/home/pkowalski/clients/deployments/my-project
因为我在 Docker 容器中为挂载目录创建了一个软 link:ln -s /mnt/deployments /home/devteam/deployments,最初我尝试将 /home/devteam/deployments/my-project 作为 Server Path 值,但它没有用。
除此之外,现在它适用于我,完全没有设置 xdebug.remote_host 和 xdebug.remote_autostart 设置为零或一。
下面是我的 /etc/php.d/xdebug.ini 在 Docker 容器中的最终工作内容:
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
朋友,我的机器也遇到过类似的问题。我的机器已经有常规安装了,安装了docker个模块。所以我所做的就是解封 php-xdebug
包,它为我解决了。
命令:sudo apt purge php-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 容器内创建的项目。
我的 Docker 容器 Ubuntu 14.0.4 基于 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 之间存在通信问题。其他时间显示不同的消息 - 存在套接字连接错误。我不确定为什么现在看不到这些弹出窗口。
知道对于在 Docker 容器内创建的项目,Xdebug 忽略 Netbeans 中的断点的解决方案是什么吗?
最后我自己解决了这个问题。
如我所料,解决方案是在 Netbeans 中正确设置 路径映射。
今天再次分析xdebug.log后,我注意到日志的开头包含有趣的信息-属性值fileuri[= init 元素的 48=]:
<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 主机目录的方式,包含 my-project,Docker 容器,在 运行 docker 我的 Docker 容器的子命令是:docker 运行 ... -v /home/pkowalski/clients/deployments :/mnt/deployment.
所以我所做的是解决 Netbeans 忽略 my-project 断点的问题,我只是在 Netbeans 中设置路径映射(项目属性 -> 运行配置->高级)如下:
服务器路径:/mnt/deployments/my-project
项目路径:/home/pkowalski/clients/deployments/my-project
因为我在 Docker 容器中为挂载目录创建了一个软 link:ln -s /mnt/deployments /home/devteam/deployments,最初我尝试将 /home/devteam/deployments/my-project 作为 Server Path 值,但它没有用。
除此之外,现在它适用于我,完全没有设置 xdebug.remote_host 和 xdebug.remote_autostart 设置为零或一。
下面是我的 /etc/php.d/xdebug.ini 在 Docker 容器中的最终工作内容:
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
朋友,我的机器也遇到过类似的问题。我的机器已经有常规安装了,安装了docker个模块。所以我所做的就是解封 php-xdebug
包,它为我解决了。
命令:sudo apt purge php-xdebug