29

前言

与许多人一样,我在调试 IDE 与 XDebug 的连接上所花费的时间比使用 XDebug 调试程序所花费的时间还要多。我已经让它反复工作,但每隔一段时间我就会遇到常见的“等待连接”问题。我无法定位导致 XDebug 工作或失败的原因。我已经使用 ubuntu 两年了;我既不是菜鸟也不是 strace 大师。我究竟做错了什么?如何更好地调试 IDE 与 XDebug 的连接?


设置

  • Ubuntu 10.10
  • 网豆 6.9.1
  • 带有 Suhosin 补丁的 PHP 5.3.3-1ubuntu9
  • Xdebug v2.1.0 和 debugclient 于 2010 年 9 月 20 日使用xdebug.org 上定制的安装说明脚本从源代码构建
  • 阿帕奇阿帕奇/2.2.16
  • /etc/php5/apache2/php.ini 和 /etc/php5/cli/php.ini 都有:
    • zend_extension = /usr/lib/php5/20090626+lfs/xdebug.so
      xdebug.remote_enable=1
      xdebug.remote_handler=dbgp
      xdebug.remote_mode=req
      xdebug.remote_host=127.0.0.1
      xdebug.remote_port=9000
      xdebug.remote_log=/var/log/xdebug.log
      xdebug.extended_info=1
      xdebug.idekey="netbeans-xdebug"
      

程序

问题

我无法解释导致问题的原因或问题何时出现。它从我尝试调试我的项目开始,这会导致我选择的开发浏览器 (Chrome) 使用参数打开到我的项目的 url XDEBUG_SESSION_START=netbeans-xdebug。这会导致页面在 chrome 中正常呈现,而 Netbeans 仅报告“等待连接”。

调试 XDebug

首先,在“等待连接”消息仍然存在的情况下,我将尝试使用 netstat 挖掘端口 9000,如下所示:

$ netstat -an | grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN     

我关闭了我的 IDE 并尝试使用两个文件来帮助弄清楚发生了什么:{webroot}/index.phpcontains<?php phpinfo(); ?>{webroot}/dbgtest.phpcontains XDebug 安装检查脚本

<?php
$address = '127.0.0.1';
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Unable to bind');
socket_listen($sock);
$client = socket_accept($sock);
echo "connection established: $client";
socket_close($client);
socket_close($sock);
?>

当我启动 XDebugdebugclient并打开http://127.0.0.1/dbgtest.php?XDEBUG_SESSION_START=mysession时,我通常会得到常规输出,然后验证 XDebug 是否已在另一个终端中使用 netstat 连接到脚本:

$ netstat -an | grep 9000
tcp        0      0 127.0.0.1:9000          127.0.0.1:34831         ESTABLISHED
tcp        0      0 127.0.0.1:34831         127.0.0.1:9000          ESTABLISHED

尽管这两个似乎都表明已建立连接,但网页显示“无法绑定”,我无法解释。我 Ctrl-c 退出 debugclient,此时 netstat 验证端口 9000 没有活动。我启动 Netbeans,打开{webroot}/index.php并使用调试器,它打开了http://127.0.0.1/index.php. 然后调试器通常会正常启动。我停止调试器,回到我的项目,这就是问题真正变得烦人的地方:有时,我可以继续正常调试我的项目,而其他时候,问题再次出现,而“Waiting to连接”标志显示,netstat 显示:

$ netstat -an | grep 9000
tcp6       0      0 :::9000                 :::*                    LISTEN     
tcp6       0      0 127.0.0.1:9000          127.0.0.1:34681         TIME_WAIT 

其他时候,我会重新启动计算机,启动终端,然后找到:

$ netstat -an | grep 9000
unix  3      [ ]         STREAM     CONNECTED     9000  
$ telnet 127.0.0.1 9000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

我对网络和 linux 内部结构不够熟悉,看不出这是什么意思。显然有东西在使用端口 9000。这是什么意思?请注意,尽管我在 php.ini 中进行了设置:

$ cat /var/log/xdebug.log
cat: /var/log/xdebug.log: No such file or directory

调试IDE和XDebug之间连接的正确方法是什么?

4

3 回答 3

5

如果您偶然使用 Cisco VPN 客户端,这可能是一个原因。它带有一个防火墙,即使客户端没有启动,它也始终处于开启状态。可以在选项菜单中取消选中它。

于 2011-02-04T10:19:26.383 回答
4

请阅读此线程。

http://forums.netbeans.org/post-99369.html

最后,解决方法是将 net.ipv6.bindv6only = 0 添加到文件 /etc/sysctl.d/bindv6only.conf 中,然后重新启动。之后 Xdebug 运行良好。

于 2012-03-27T02:43:04.160 回答
2

好吧,我的开发设置与您的有些不同,但我非常清楚这个问题。事实上,我刚刚解决了它……这次我的 Fireeall 阻止了 XDebug 用来与我的 IDE 对话的端口。

阅读您的帐户时,我想到了一些事情:

1)“我无法解释是什么导致了问题或问题何时出现。” 这是一个非常重要的陈述 b/c,众所周知,技术解决方案严格取决于潜在问题总是或有时以看似随机的方式发生。所以......你有时能以这种方式执行 XDebugging 还是永远不会?

2)当您的 IDE 正在等待并且您的浏览器立即呈现该站点时,我猜您的 IDE 告诉您的 XDebug-server 启动有问题。B/c 如果 XDebug 将启动并且无法连接回您的 XDebug 客户端,那么该网站将不会立即呈现。但是在您的情况下,GET-parameters 只是被忽略 b/c 它们对您的 Apache/PHP-server 没有任何意义,因为它们对您想要启动的某些 XDebug-session 一无所知。

3)您的解决方案对我来说似乎很复杂。我会先尽可能简单,看看它是如何工作的。例如,"xdebug.idekey="netbeans-xdebug" 通常不需要第一次设置。

那是我的两分钱

最好的拉斐尔

于 2011-01-29T13:36:31.967 回答