coredump

03 30,2016

使用GDB调试PHP core dump

最近线上服务器出现了访问不上的情况,查看php-fpm发现大量的WARNING: [pool www] child 11274 exited on signal 31 (SIGSYS) after 0.089068 seconds from start错误,然后php-fpm进程在不断的重启。

查看PHP的错误日记并没有太多可用信息,既然如此那就尝试抓取core dump使用gdb调试看下吧。

关于core dump

我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。

通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

core dump默认是不生成的文件,所以首先我们要开启下。

设置core dump路径

# echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern

修改ulimit允许生成core dump文件

# ulimit -c unlimited

重启php-fpm。 过一会进入/tmp,就会发现生成很多core.xxx的文件。这个时候设置关闭core dump并重启php-fpm。

# ulimit -c 0

这个时候就可以使用gdb进行调试core dump,注意因为生成core dump的是php-fpm,所以这里需要使用php-fpm进行调试。如果在cli模式使用php生成的core dump才是使用php程序进行调试。