软件指南针:专注于软件传播与分享

解决Zend Studio Xdebug插件无法断点调试

来源:原创 2429次浏览 0条评论
☞ 本文主要介绍软件Zend Studio的相关内容:解决Zend Studio Xdebug插件无法断点调试

   其下列版本/分支可以参考本文:

  • 全部版本/分支

当我们在PHP中安装完Xdebug模块并实现与Zend tudio的集成之后,却发现Xdebug根本无法正常进行断点调试,具体表现如下:

当我们启动服务器和Zend Studio之后,第一次断点调试是可以正常进行的。

Zend Studio第一次可以断点调试

不过,从第二次开始,我们就会发现断点调试将无法成功。

如下图所示,此时Zend Studio调试视图中没有了Remote Launch,也就是远程运行组件根本没有生效。Zend Studio下方的进度条也一直显示Launching:waiting for Xdebug session字样,并且进度条一直卡在57%的位置。

Zend Studio第二次断点调试无效

如何解决Xdebug的断点调试无效的问题

如果你的Xdebug连第一次断点调试都无法成功

  1. 很明显,你的Xdebug配置根本无效,你需要了解Xdebug的工作原理
  2. 请确保你PHP配置文件php.ini中至少包含类似如下两行配置指令:
    ;加载Xdebug扩展文件
    zend_extension="E:/php5.4.27/ext/php_xdebug-2.2.4-5.4-vc9.dll"
    
    ;启用远程调试功能
    xdebug.remote_enable=1
  3. 请确保zend_extension指定的路径为绝对路径。
  4. 请确保服务器端能够通过php.ini配置中指定的xdebug.remote_host访问到客户端,请确保xdebug.remote_port与客户端设置的端口号保持一致,尤其注意防火墙或安全软件的干扰。
  5. 请确保客户端存在多个PHP Executable,请确保当前使用的PHP Executable已经正确配置了Xdebug模块。
如果你的Xdebug断点调试存在如上面图中所示的问题
  1. 可能是端口被其他程序占用,默认的9000端口也有可能与FastCGI存在冲突,请尝试更改服务器端和客户端配置的端口号,然后重新启动再次尝试。
  2. 如果改动成未被占用的端口号后,依然不起作用,则可能比较麻烦。

    请在php.ini中添加类似如下配置语句,从而启用Xdebug的远程调试日志功能

    xdebug.remote_log="D:/debug/remote.log"

    重新进行远程调试操作,你可能会在日志文件中发现如下日志记录:

    Log opened at 2014-04-28 05:23:25
    I: Connecting to configured address/port: localhost:9000.
    E: Could not connect to client. :-(
    Log closed at 2014-04-28 05:23:25

    此外,打开Zend Studio当前工作空间目录/.metadata/.log文件,你会发现当我们进行远程调试时,该文件中可能会写入如下日志信息:

    !ENTRY org.eclipse.php.debug.core 4 4 2014-04-27 18:35:28.953
    !MESSAGE class org.eclipse.php.internal.debug.core.xdebug.dbgp.session.DBGpSession : Unexpected null from readResponse waiting for Init

    前者表示Xdebug无法连接到客户端,后者表示客户端在等待初始化时,读取的响应为null。

    这种情况到目前为止,没有找到彻底的解决方案。笔者曾经尝试在两台计算机上进行断点调试,Apache、PHP、Xdebug、ZendStudio的版本以及相关配置完全一致,但是一台可以完全正常地进行断点调试,另一台就遇到上面图中所示的问题。在网上查找了各种中文资料、英文资料仍然无法解决该问题。而且在出现问题的那台计算机上,启动Apache服务器之后,有些时候可以连续多次正常断点调试,有些时候只能第一次正常、之后就无法断点调试。遇到这样问题的人还真不少。

    笔者通过分析客户端和服务器端的TCP连接以及相关日志,猜测问题可能在于,当客户端和服务器端第一次建立连接并进行断点调试后,客户端和服务器端的连接并没有正常关闭,而是一直堵塞在那里,再加上客户端多次连接的会话名称默认是相同的,导致第二次断点调试时,Xdebug无法连接到客户端,自然也就无法进行断点调试。

    对此,你可以尝试以下几种解决方案:

    • 清除之前的配置,重新配置一次,就有可能奇迹般地解决了(国外有一些开发者就是如此搞定的)。
    • 每次启动只进行一次断点调试,如果需要再次断点调试,就重新启动一下Apache服务器(临时的解决方案)。
    • 国外的开发人员已经将该问题作为一个bug汇报给了Xdebug官方,有官方链接为证,你可以尝试更换Xdebug版本或者更换为Zend Debugger。
    • 最后,请大家留言发表一下自己的意见吧。

作者:软件指南针(http://www.softown.cn),转载请保留出处!

用户评论

使用指南 故障排除 0 返回顶部