维护远古项目必备

Xdebug 深入学习

前言

最近接手了一个十分远古的项目,一个类,一个方法几千行都是稀松平常的事,这种情况用肉眼阅读和打 log 调试变得十分困难,只好祭出 xdebug 这个神器了!

前面说明一下,中文互联网上掺杂着各种你拷贝我拷贝的牛皮癣文章(尤其是 CSDN 这个毒瘤) , 很多内容反而会浪费自己很多时间

所以我这里把在谷歌找到的和 xdebug 相关的官方文章和原理剖析文章放在这里了

交互细节

首先推荐阅读以下 xdebug 和 phpstorm (或其他调试客户端) 的交互细节,对后面配置和问题排查有很大帮助 ,并且等哪天又遇到同样的问题的时候,不用再重复谷歌,bing,百度走一圈,减少时间成本.重点是这张流程图,作者文章里也讲了不少技巧

How xdebug communicates with IDE

avatar

简单来说就是:

ide:监听 9xxx 端口 xdebug 告诉 ide :这次调试过程已经启动了! ide : 你在执行到这个文件的这一行停下! 好了可以继续执行了! xdebug:我已经在这个文件的这一行停下了!你看看后面要干嘛! ....... .....

可以看到和浏览器是根本没关系的!!之前看各种配置文章都有浏览器安装插件的步骤,使得我误以为整个过程也有浏览器的参与,这次才知道原来那个插件只是一个开关的作用(没卵用,phpstorm 有开关)

xdebug 配置

PHPStorm 配置 xdebug 的看这一篇就够了 jetbrains-configuring xdebug

重点是要学会排查问题在哪,一是 xdebug插件正确安装在 php 上了 (执行phpinfo()查看确认) , 二是 phpstorm 打开了调试并且监听了正确的端口(lsof 等命令查看端口情况) , 再后面可以抓包继续排查 , 疑难杂症的话看 log 然后 google吧...

常用调试技巧

像web程序维护的话,一般先要找到控制器方法的入口,没有调试器的时候,一般是根据url命名等,一个一个文件夹,控制器,方法去找,或者使用phpstorm全局搜索,但是现在有了调试器,就可以在框架执行控制器方法的地方(不同框架不太一样,要自己找找) 下一个断点,这样在浏览器一访问就能跳转到目标控制器方法入口了,省去了大量的查找的时间

然后是断点的分组功能,不用之后不要删除,如图取消勾选就好,然后按需求分好组,下次就不用重新下断点了,并且也可以作为一个代码书签的功能

avatar

evaluate and logs功能我很少用,就是一个可以写php程序并在断点的时候把程序结果输出到console窗口的东西

evaluate窗口可以在断点的时候执行任意项目代码,获得当前时刻的输出结果,也不常用

avatar

然后stack堆栈窗口可以查看某个执行栈下的上下文(变量等等)

遇到的问题

1.端口冲突.本地部署了 php-fpm 在 9000 端口,和默认的ide 监听 xdebug 端口冲突了,这个需要注意一下,有冲突的话要换一个端口

2.调试了 10 多秒,调试过程自动中断了.这个的话我的问题是因为本地的 apache 超时时间导致的,nginx 的配置修改的话另外找找

httpd.conf 文件加上:
FcgidIOTimeout 3000  #程序响应超时时间
FcgidConnectTimeout 3000  #与程序通讯的最长时间

3.代码文件路径映射,可能是由于我的 PHPStorm 版本比较高? 不需要预先配置好路径,phpstorm 会弹窗让你选择 , 如果版本比较低或者什么的,可以看看 xdebug 或者 phpstorm 的错误提示,或者wireshark抓包也能看到 xdebug 发起请求时候的文件路径,然后在 IDE 的 configuration 里对应起来

xdebug profiler

这是个查看执行栈消耗时间的有用工具,phpstorm 可以读取生成的文件,展示执行栈消耗时间列表,如果觉得本地环境很慢的话,上这个排查下,我使用了这个发现了本地连接数据库的反向 DNS 造成的问题

其他 phpstorm 调试技巧文章

jetbrains-stepping through the program

How xdebug communicates with IDE

xdebug 官网文档