先设置一下coredump的保存路径,注意要空间够大的地方,因为coredump可能会较多而且很大(比如开了apc设置了1G,那就会有1G):
1
#echo "/tmp/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern
然后修改下ulimit,允许coredump:
1
#ulimit -c unlimited
重启php-fpm。 要不了多久,/tmp/目录里就产生了一堆coredump文件,很好,打包拖回线下来分析吧。 记得关闭coredump,并重启程序:
1
#ulimit -c 0
分析coredump一般用gdb就够了,(二进制发行版的话,先安装对应的debug symbol包):
2
gdb -c /usr/local/php/sbin/php-fpm core.php-fpm.10375.php.1365314990
执行下bt命令,看下backtrace(具体的信息忘记记录了),发现是挂在lex_scan函数,看了好几个coredump,基本都是挂在lex阶段的函数。
调试:
1)gcc -g 编译
ulimit -c 20000
之后运行程序,等core dump
最后gdb -c core
来查调用栈
(2)使用strace execfile,运行程序,出错时会显示那个系统调用错