使用 VirtualBox 进行远程 Xdebug

Posted

技术标签:

【中文标题】使用 VirtualBox 进行远程 Xdebug【英文标题】:Remote Xdebug with VirtualBox 【发布时间】:2012-08-16 07:20:09 【问题描述】:

我正在尝试进行远程调试。 php 在 VM 上运行,我正在尝试从主机上的 NetBeans 进行调试。

我已按照说明here,在 Windows 7 防火墙和 VirtualBox 网络设置中转发了端口 9000,并在 NetBeans 中设置了路径映射。我的 xdebug 设置如下所示:

xdebug.remote_enable = On
xdebug.remote_connect_back = On
xdebug.idekey = "netbeans-xdebug"
xdebug.remote_log = /tmp/xdebug.log

当我加载要调试的 URL 时(使用正确的 idekey),它会记录以下内容:

I: Checking remote connect back address.
I: Remote address found, connecting to 192.168.0.1:9000.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" 
         xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
         fileuri="file:///home/dev/web/projects/project.com.vm/httpdocs/index.php" 
         language="PHP" protocol_version="1.0" 
         appid="1380" 
         idekey="netbeans-xdebug">
   <engine version="2.2.1"><![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>

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

但是,NetBeans 仍在等待连接。除了设置断点外,我还将它设置为在第一行停止。即使 NetBeans 未在侦听,日志文件也会包含“已连接到客户端”消息。

知道我可能缺少什么吗?

谢谢。

【问题讨论】:

所以我走了另一条路,并开始使用 VIM 在 VM 上进行本地调试(遵循these instructions)。仍然会感谢任何我无法让它远程工作的线索。 【参考方案1】:

对我有用的是从我的主机运行以下内容:

ssh -R 9000:localhost:9000 yourUserName@yourVirtualMachine

注意使用 -R 标志而不是 -L。我在使用端口转发来让事情正常工作时遇到了麻烦,而 ssh 隧道工作得很好。请注意,您也可以通过在 VM 中运行 ssh 命令并使用 -L 标志连接到主机来执行此操作。

由于我在使用 Vagrant 时遇到了这个问题,所以这是我个人使用的命令,提示时使用密码“vagrant”:

ssh -p 2222 vagrant@127.0.0.1 -R 9000:localhost:9000

【讨论】:

【参考方案2】:

我对此问题的解决方案如下:

1) 在网络配置中启用端口转发(使用 NAT 适配器) 我只是使用了端口 9000 以及主机和来宾的 IP 地址。协议是 TCP

2) 配置了我的 xdebug 设置: 在我的情况下,设置 xdebug.remote_host = "永久主机 IP" 很重要 然后一切都很顺利。

希望这对那里的人有所帮助。

【讨论】:

这对我有帮助。我最终按照你说的做了,在我的 xdebug.remote_host 中,使用了我的 DHCP 分配的 IP 地址。但是,这仅在您连接到路由器的情况下才有成效。当你完全独自飞行时,有什么办法可以让它工作,比如没有连接到路由器? 我在 Mac 上使用 VirtualBox (ubuntu)。我必须将我的 xdebug.remote_host 配置为 Mac(主机)计算机的 IP 地址。唯一烦人的是我的 IP 地址发生了变化,所以当我在全球范围内移动时,我必须保持设置。【参考方案3】:

我添加了 4 个选项以在我的虚拟机项目中使用 Xdebug:

xdebug.remote_enable = On
xdebug.remote_host = [YOUR_HOST_IP]
xdebug.remote_connect_back = On
xdebug.remote_autostart = On

只要您的调试器正在侦听,它就应该在断点处中断。

【讨论】:

【参考方案4】:

如果您的日志文件中有此内容:

I: Connected to client. :-)

这意味着 Xdebug 已成功连接到 IDE。

IDE (netbeans) 简单地关闭连接,甚至不尝试发送任何信息。如果它不知道如何处理您示例中的文件名 (file:///home/dev/web/projects/project.com.vm/httpdocs/index.php),就会发生这种情况。原因是您的 IDE 中没有正确的路径映射设置。

【讨论】:

【参考方案5】:

虚拟机需要能够与主机通信,并且要实现这一点,您需要转发 9000 来执行此操作。此步骤在某些设置中未描述,因为它发生在后台。

为此,发出命令 ssh -L 9000:localhost:9000 yourUserName@youVirtualMachine。

为了简化这一点,我在 /etc/hosts 和我的 ~/ssh/config 文件中都有虚拟机的名称。

【讨论】:

试过这个。仍然不适合我。日志输出没有变化。【参考方案6】:

3 必须满足 xdebug 与 VirtualBox 远程工作的条件,尤其是在 virtualbox 中与 Docker 连接时。

1) remote_connect_back=0 或者你的主机的确切ip地址必须列在remote_host中(,有时两者不能同时工作,特别是在docker分开的情况下直接从windows hyper-v的virtualbox)

2) 不能在端口 9000 上公开其他应用程序(例如 web-project),必须为 php 编辑器保留该端口,或者必须由编辑器/侦听器(或 php)保留不同的端口web 项目),并从 php 寻址/传输到

3) 与第二点类似,virtual box 必须没有端口转发到该端口,因为它会有效地占用它,但它必须保留给 php 编辑器,而不是用于 virtualbox 端口转发, 不是 virtualbox 必须在该端口上侦听才能转发到某个内部应用程序,但外部 php-editor 必须侦听它=该端口

【讨论】:

以上是关于使用 VirtualBox 进行远程 Xdebug的主要内容,如果未能解决你的问题,请参考以下文章

使用 Netbeans 和 XDebug 进行远程 PHP 调试

在远程服务器上的Docker内部进行Xdebug远程调试

从 Docker 容器内部使用 XDebug 进行远程调试不起作用

使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题

如何使用 phpstorm 和 Xdebug 设置远程调试

phpstorm+xdebug 远程调试