使用 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 进行远程调试不起作用