通过 nat VM SERVER 进行 Xdebug

Posted

技术标签:

【中文标题】通过 nat VM SERVER 进行 Xdebug【英文标题】:Xdebug trough a nat VM SERVER 【发布时间】:2021-12-12 20:32:52 【问题描述】:

我的系统上运行着一个虚拟机,它托管一个带有 php 应用程序的 apache 网络服务器,我正在尝试通过 xdebug 进行调试,来宾 vm 是使用 RedHat virtmanager 配置的,并且是在 qcow2 中转换的 Hyper-V 机器,网络接口类型为 NAT(默认):guest 的当前地址为:

192.168.122.78

我试过各种xdebug的配置,目前的配置是:

zend_extension=xdebug.so
xdebug.mode = debug
xdebug.client_host = 192.168.122.1
xdebug.client_port = 9003
xdebug.log=/var/www/clients/client1/web4/web/xdebug.log
xdebug.discover_client_host = false

我从来宾内部运行得到了 xdebug.client_host IP 地址:

$ echo $SSH_CLIENT | awk ' print $1'
192.168.122.1

我在 Vscode 中配置了 php-xdebug 扩展,如下:


    "version": "0.2.0",
    "configurations": [
        
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "hostname": "192.168.122.78", --->ip adress of guest machine
            "pathMappings": 
                "/var/www/clients/client1/web4/web": "$workspaceRoot"   
              
 
        ,
        
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "$file",
            "cwd": "$fileDirname",
            "port": 0,
            "runtimeArgs": [
                "-dxdebug.start_with_request=yes"
            ],
            "env": 
                "XDEBUG_MODE": "debug,develop",
                "XDEBUG_CONFIG": "client_port=$port"
            
        ,
    ]

但是我得到了这个错误

Error: listen EADDRNOTAVAIL: address not available 192.168.122.78:9003
    at Server.setupListenHandle [as _listen2] (net.js:1301:21)
    at listenInCluster (net.js:1366:12)
    at doListen (net.js:1503:7)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) 
  code: 'EADDRNOTAVAIL',
  errno: -99,
  syscall: 'listen',
  address: '192.168.122.78',
  port: 9003

据我了解,xdebug 调用连接到客户端(我的主机)并且客户端侦听此端口: 如果我尝试 telnet 并通过访客的 ip 地址检查连接端口,我会收到连接被拒绝错误:

$ telnet 192.168.122.78 9003                                                                                                                                                                                  
Trying 192.168.122.78...
telnet: Unable to connect to remote host: Connessione rifiutata

我在服务器上没有任何 iptables 规则,因为我删除了它们并接受了所有传入和传出连接:

$ iptables -L -v -n
Chain INPUT (policy ACCEPT 329 packets, 28028 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 261 packets, 31104 bytes)
 pkts bytes target     prot opt in     out     source               destination    

这是服务器的xdebug日志:

[1366] Log opened at 2021-10-27 13:32:21.938749
[1366] [Step Debug] INFO: Connecting to configured address/port: 192.168.122.1:9003.
[1366] [Step Debug] WARN: Creating socket for '192.168.122.1:9003', poll success, but error: Operation now in progress (29).
[1366] [Step Debug] ERR: Could not connect to debugging client. Tried: 192.168.122.1:9003 (through xdebug.client_host/xdebug.client_port) :-(
[1366] Log closed at 2021-10-27 13:32:21.940222

显然启用 xdebug.discover_client_host = false 不会改变这种情况。

知道是什么导致了这个问题吗?任何帮助表示赞赏, 最好的问候。

【问题讨论】:

【参考方案1】:

"hostname": "192.168.122.78", --->访客机器的ip地址

我认为这是你的问题。 hostname 应该留空, Xdebug 将要连接的 IP 的 IP 地址 ,在您的情况下是 192.168.122.1

【讨论】:

两个都试过了,我不再从 xdebug 部分得到错误,甚至 Vscode 也监听端口,但是仍然不起作用,看不到堆栈跟踪或变量值,这是预期的吗行为?使用 yii2 框架构建的应用程序。

以上是关于通过 nat VM SERVER 进行 Xdebug的主要内容,如果未能解决你的问题,请参考以下文章

VM虚拟机如何连接网络(具体情况内详)

VM虚拟机网络NAT模式配置本机访问虚拟机

LVS负载均衡 -- NAT模式

vm虚拟机下的ubuntu16.04配置静态ip(NAT方式)

windows与vmware 虚拟机的linux通信

不同 NAT 中的虚拟机 [关闭]