Xdebug 之远程调试

本文图片和参考来源均来自:xdebug.org

你是否有过这样的经历:写了一大段代码,执行的时候无任何报错,有输出结果,只是部分数据不对,或者干脆没有数据。你猜测是某个文件的某一行的某个方法返回结果不对,为了验证自己的诊断,打印出这个结果以看个究竟,你飞奔到那一行,熟练的敲出了一行代码:

<?php var_dump($result); die;

保存文件并再次执行,然而却发现这部分的返回结果并没有问题。这时,你又猜测到另一行代码可能有问题,接着重复前面的过程。反反复复数次以后,你终于找到问题所在并成功修复。

在一个不太复杂的程序中,用以上这种打印变量、使用中断的方式来调试问题也是基本可行的。只是它有很多缺点:

如果你有这样的困扰,是时候使用Xdebug结合IDE进行断点调试了。Xdebug 是php开发的调试利器,支持断点、步调,结合IDE可以让开发人员方便地调试一些复杂的应用。它还可以调试CLI程序,本篇主要介绍其常见的使用IDE+HTTP请求的调试方式,即通过访问页面产生一个HTTP请求,启动调试会话,借助IDE和HTTP服务器通信来完成调试过程。

远程调试可以分为单用户和多用户两种,单用户最常见的就是本机搭建HTTP服务器,同时在本机开发程序;另外一种就是本文重点介绍的多用户远程调试。我们先介绍单用户模式:

单用户模式

单用户模式常用于本机开发、本机调试的场景,Xdebug 的工作流程如下:

动画演示图片:

http://xdebug.org/images/docs/dbgp-setup.gif

多用户模式

多用户共用一个HTTP服务器时,IDE所在的IP(通常也是发起HTTP请求的来源IP)不固定,需要HTTP服务器端确定了IDE的IP后才能启动会话,只要配置 xdebug.remote_connect_back=1 即可,过程大致如下:

动画演示图片:

http://xdebug.org/images/docs/dbgp-setup2.gif

多用户远程调试非常适合团队协作开发,甚至可以在测试环境下使用。最简单的配置如下:

xdebug.remote_enable=1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.idekey=XXX

其中 xdebug.idekey 是会话id标识,在各种IDE里有对应的配置,比如netbeans中的Session ID,phpstorm里的idekey;xdebug.remote_port 是IDE的配置的端口,只要都配置一致即可。

由于配置简单通用,在本机开发本机调试的情况下,还是建议按多用户模式配置。

生成快捷链接启用/停用调试

默认配置是不会自动创建调试会话的,我们可以在发起HTTP请求的时候需要携带上这个会话标识,用来触发调试会话、建立HTTP服务器和IDE的连接,携带该标识的方式有:

想要停用调试只需要去掉携带的参数或cookie即可。 为了更方便的启用/停用调试,建议使用收藏夹设置快捷链接来完成启用/停用调试,这里提供一个自动生成快捷链接的小工具:

IDE key

另外,还可以安装浏览器插件来辅助启用/停用调试,如Firefox的插件 https://addons.mozilla.org/en-US/firefox/addon/the-easiest-xdebug/ 。

远程代码目录映射

多用户调试的情况下,IDE和HTTP服务器往往不在一台机器上,由于调试的是HTTP服务器上的代码,需要配置IDE,让本机(也就是IDE所在的机器)上的项目代码路径映射到HTTP服务器上的代码路径,这样在本机设置断点后,Xdebug才能知道HTTP服务上代码的断点位置,前提是本机和服务器上的代码要完全一致。