前言
与许多人一样,我在调试 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.php
contains<?php phpinfo(); ?>
和{webroot}/dbgtest.php
contains 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