使用GDB调试PHP代码,解决PHP代码死循环问题
最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高。初步断定是PHP代码中发生死循环。下面通过一段代码展示如何解决PHP死循环问题。这个是独占的,所以不能再使用strace/gdb或者其他ptrace工具对此进程进行调试。另外此进程会中断执行。gdb输入c后,程序继续向下运行。通过bt命令查看进程的调用栈。两次的BT信息不一样,这是因为程序在不同的位置中断。看到execute 这一行,这里就是PHP执行oparray的入口了。gdb下输入f 6,。这里的filename就能看到op_array是哪个PHP文件的。然后输入f 0进入当前位置。zbacktrace的使用zend官方提供了一个gdb的脚本,对指令进行了封装,可以直接看到php函数的调用关系。在php源代码包的根目录中有一个.gdbinit。
下载地址
用户评论