调试IDE与XDebug的端口连接:“等待连接”

时间:2010-10-17 20:49:30

标签: php netbeans ide xdebug netstat

序言

和很多人一样,我花了更多时间来调试IDE与XDebug的连接,而不是使用XDebug来调试我的程序。 我已经让它重复工作,但每隔一段时间我就会得到共同的“Waiting to connect” problem。我无法本地化导致XDebug工作或失败的原因。我已经使用ubuntu两年了;我既不是菜鸟,也不是strace guru。 我做错了什么?如何更好地调试IDE与XDebug的连接?


设置

      
  • Ubuntu 10.10
  •   
  • Netbeans 6.9.1
  •   
  • PHP 5.3.3-1ubuntu9 with Suhosin-Patch
  •   
  • 使用tailored installation instructions script on xdebug.org来自源代码的2010年9月20日构建的debugclient的Xdebug v2.1.0
  •   
  • Apache Apache / 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)使用参数XDEBUG_SESSION_START=netbeans-xdebug打开我的项目的URL。这会导致页面在chrome中正常呈现,而Netbeans仅报告“等待连接”。

调试XDebug

首先,在“等待连接”消息仍然存在的情况下,我将尝试使用netstat来挖掘端口9000,其中类似

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

我关闭了我的IDE并尝试使用两个文件来帮助弄清楚发生了什么:{webroot}/index.php包含<?php phpinfo(); ?>{webroot}/dbgtest.php包含XDebug installation check script

<?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);
?>

当我启动XDebug debugclient并打开http://127.0.0.1/dbgtest.php?XDEBUG_SESSION_START=mysession时,我通常会得到regular output,然后验证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。然后调试器通常正常启动。我停止调试器,回到我的项目,这是问题真的变得烦人的地方:有时候,我可以继续正常调试我的项目,有时,问题重新出现,而“等待连接“符号正在显示,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之间连接的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

请阅读此主题。

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

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

答案 2 :(得分:2)

嗯,我的开发设置与你的有些不同,但我很清楚这个问题。事实上我刚解决了......这次我的Fireeall阻止了XDebug用来与我的IDE通信的端口。

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

1)“我无法解释导致问题的原因,或问题何时显现。” 这是一个非常重要的声明b / c,众所周知,技术解决方案严格依赖于潜在问题总是或有时以看似随机的方式发生。所以...你有时可以用这种方式进行XDebugging吗?或者从来没有?

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

3)您的解决方案对我来说似乎非常复杂。我会尽可能地保持简单,看看它是如何工作的。例如,对于第一次设置,“xdebug.idekey =”netbeans-xdebug“通常不是必需的。

那是我的两分钱

最佳

拉斐尔