简体   繁体   English

Xdebug忽略了Netbeans中为Docker容器内创建的Php项目的断点

[英]Xdebug ignores breakpoints in Netbeans for Php project created inside Docker container

When I debug project which is not created inside Docker container, then there is no problem with Xdebug. 当我调试未在Docker容器中创建的项目时,Xdebug没有问题。

But when I debug project created inside Docker container, then Xdebug does not stop on breakpoints - although it is running and it stops on xdebug_break(). 但是当我调试在Docker容器中创建的项目时,Xdebug不会在断点上停止 - 尽管它正在运行并且在xdebug_break()上停止。

My Docker host is Ubuntu 14.04. 我的Docker主机是Ubuntu 14.04。 It is installed as VirtualBox. 它安装为VirtualBox。 It uses PHP 5.5.9-1ubuntu4.16 with Xdebug v2.2.3. 它使用PHP 5.5.9-1ubuntu4.16和Xdebug v2.2.3。 I have a mounted volume (between Docker host and Docker container) where projects created inside Docker container are stored. 我有一个已安装的卷(在Docker主机和Docker容器之间),其中存储了在Docker容器中创建的项目。

My Docker container inside Ubuntu 14.0.4 is based on CentOS release 6.7 (Final). Ubuntu 14.0.4中的我的Docker容器基于CentOS版本6.7(最终版)。 It uses PHP 5.3.29 with Xdebug v2.1.4 and it has Xdebug configured as follows (inside /etc/php.d/xdebug.ini): 它使用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

I have checked through all, currently displayed as commented out, values for xdebug.remote_port setting. 我已经检查了xdebug.remote_port设置的所有值,当前显示为已注释掉的值。 I have tried different ports (9001, 9002) for xdebug.remote_port setting (of course with the same port set inside Netbeans). 我为xdebug.remote_port设置尝试了不同的端口(9001,9002)(当然在Netbeans中设置了相同的端口)。 I also tried changing xdebug.remote_connect_back and xdebug.remote_autostart settings. 我还尝试更改xdebug.remote_connect_back和xdebug.remote_autostart设置。 I have noticed that with these two ones set to zero, xdebug was actually hanging and waiting for connection. 我注意到,这两个设置为零,xdebug实际上是挂起并等待连接。

But still I am not able to make Xdebug stopping on breakpoints while debugging projects previously deployed inside Docker container. 但是,在调试先前部署在Docker容器中的项目时,我仍然无法使Xdebug在断点处停止。

I am not sure if I miss anything regarding Netbeans settings or Xdebug settings. 我不确定是否遗漏了有关Netbeans设置或Xdebug设置的任何内容。 I spent many hours trying to find the solution. 我花了很多时间试图找到解决方案。 I was trying to find some relevant information inside xdebug.log - but it does not seem to contain anything significant to me: 我试图在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>
...

It seems like it successfully manages to set breakpoints, but I am not sure if the filepath is correct inside xdebug.log. 它似乎成功地设置了断点,但我不确定xdebug.log中的文件路径是否正确。 Maybe I need to use manual path mapping inside Netbeans, but I am not sure how to do it and what path should be a server path. 也许我需要在Netbeans中使用手动路径映射,但我不知道该怎么做以及什么路径应该是服务器路径。

Right now if I start debugging, the page loads. 现在,如果我开始调试,页面加载。 But some time before, there was an error inside the browser saying that connection was reset. 但是之前的一段时间,浏览器内部出现错误,说连接已重置。 Apart from that, a couple of times an error popup was showing up. 除此之外,还出现了几次错误弹出窗口。 Some time a popup was saying that there was a communication problem between Netbeans and Xdebug. 有时候一个弹出窗口说Netbeans和Xdebug之间存在通信问题。 Other time different message was displayed - that there was a socket connection error. 其他时间显示不同的消息 - 存在套接字连接错误。 I am not sure why now I do not see these popups. 我不知道为什么现在我没有看到这些弹出窗口。

Any idea what could be the solution for Xdebug ignoring breakpoints in Netbeans for projects created inside Docker container? 知道什么可能是Xdebug的解决方案忽略Netbeans中的断点在Docker容器内创建的项目?

Finally I solved the issue on my own. 最后我自己解决了这个问题。

As I expected, the solution was to set Path Mapping properly in Netbeans. 正如我所料,解决方案是在Netbeans中正确设置路径映射

After analysing xdebug.log again today, I have noticed that the beginning of the log contains interesting information - a value for attribute fileuri of init element: 今天再次分析xdebug.log后,我注意到日志的开头包含有趣的信息 - init元素的属性fileuri的值:

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

The way I shared a directory of my Docker host, containing my-project , with Docker container, during run docker subcommand for my Docker container was: docker run ... -v /home/pkowalski/clients/deployments:/mnt/deployment . 在我的Docker容器的run docker子命令期间,我使用Docker容器共享包含my-project的 Docker主机目录的方式是: docker run ... -v / home / pkowalski / clients / deployments:/ mnt / deployment

So what I did to solve the problem with Netbeans ignoring breakpoints for my-project , was I just set Path Mapping inside Netbeans (Project Properties -> Run Configurtion -> Advanced) as follows: 所以我用Netbeans忽略了my-project的断点来解决这个问题,我只是在Netbeans中设置Path Mapping(Project Properties - > Run Configurtion - > Advanced),如下所示:

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

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

Because I have a soft link created inside my Docker container for the mounted directory: ln -s /mnt/deployments /home/devteam/deployments , initially I tried to put /home/devteam/deployments/my-project as a Server Path value, but it did not work. 因为我在Docker容器中为挂载目录创建了一个软链接: ln -s / mnt / deployments / home / devteam / deployments ,最初我尝试将/ home / devteam / deployments / my-project作为Server Path值,但它没有用。

Apart from that, now it works for me with no xdebug.remote_host set at all and with xdebug.remote_autostart set either to zero or one. 除此之外,现在工作对我来说,没有xdebug.remote_host设置都与xdebug.remote_autostart要么设置为0或1。

Here is the final working content of my /etc/php.d/xdebug.ini inside Docker container: 这是我的/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

My friend, my machine went through a similar problem. 我的朋友,我的机器遇到了类似的问题。 My machine already had a conventional installation, and the docker modules were installed. 我的机器已经安装了常规设备,并且安装了docker模块。 So what I did was unseal the php-xdebug package, it solved for me. 所以我所做的就是启动php-xdebug包,它为我解决了。

command: sudo apt purge php-xdebug 命令: sudo apt purge php-xdebug

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM