xdebug调试时出错 --mxp

昨天在远程调试时,刚开始调试的好好的,忽然发现返回的结果变成502了,不对呀!刚刚明明是200的呀!而后我重启了nginx和php-fpm,仍是同样的502,难道是代码又有bug了。看了下php-fpm的日志,发现没有任何的出错记录,调试时就是直接断掉,返回个502,什么缘由呢?php

这时请教了龙哥,在服务器端跟踪php-fpm进程执行时的系统调用和所接收的信号。nginx

首先把php-fpm的进程数量设置为1个,这样就找到是哪一个进程处理了cgi请求。数组

设置好后重启php-fpm服务。服务器

重启后找出那个php-fpm进程的进程号。函数

而后用gdb调试这个进程。php-fpm

这时先不设置断点,让程序在IDE中直接一步一步地运行下去,看是在哪一个地方出错了。spa

在代码出错的那一行设置个断点,下次能够直接运行到断点处。debug

运行完后,就能够看获得出错的地方,先记下这个出错的函数,下次运行时设置断点须要用到(注意:xdebug的断点和gdb的断点是不一样的)。3d

这时,再看一下php-fpm的进程池,发现原来的那个进程的进程号变了,是由于本来的进程挂掉了,主进程又新开了一个子进程。调试

 

在Fillder中replay上次的那个请求,等运行到IDE的断点处,再打开gdb,在gdb中设置断点,输入c继续运行。

 

在IDE中继续运行,这时程序出错了,在gdb中输入bt查看堆栈

在堆栈里能够看到,在用xdebug调试时,是先运行xdebug扩展模块的代码,再运行了本来的php代码。

我在调试时,设置了一个查看的变量,这个变量在运行到这个方法时是一个对象,而我是以数组的方式来读取的,因此语法是有错误的,因此整个http请求返回了错误。因为这是xdebug的错误,因此不使用xdebug调试来运行代码时,返回的数据是正常的。

在找到问题的缘由后,我在别的方法内设置了断点,调试时直接跳过这个方法,虽然仍是查看同一个变量,可是没有出错。

相关文章
相关标签/搜索