参考:
https://bugs.php.net/bugs-generating-backtrace.php
http://blog.csdn.net/tenfyguo/article/details/8159176/
0.什么是coredump
我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。
通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
1.如果你还没有core文件
默认Linux操作系统是不允许生成core文件的。如下:
- [root@linuxeye ~]# ulimit -a
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 0
- file size (blocks, -f) unlimited
- pending signals (-i) 5762
- max locked memory (kbytes, -l) 64
- max memory size (kbytes, -m) unlimited
- open files (-n) 65535
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 0
- stack size (kbytes, -s) 10240
- cpu time (seconds, -t) unlimited
- max user processes (-u) 65535
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
可以通过如下命令解除限制:
- [root@zcx ~]# ulimit -c unlimited
- [root@zcx ~]# ulimit -a
- core file size (blocks, -c) unlimited
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 0
- file size (blocks, -f) unlimited
- pending signals (-i) 5762
- max locked memory (kbytes, -l) 64
- max memory size (kbytes, -m) unlimited
- open files (-n) 65535
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 0
- stack size (kbytes, -s) 10240
- cpu time (seconds, -t) unlimited
- max user processes (-u) 65535
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
注意,ulimit -c 的设置仅仅是对你完成设置后启动的进程有效。而且退出登陆后,再进入需要从新设置。否则从新登陆后启动的进程也无法生成core文件。
如果想永久生效,可以把命令加入到 /etc/profile 中。建议不要这样做, 会疯狂dump文件,浪费性能。
- # vi /etc/sysctl.conf
- kernel.core_uses_pid = 1 #追加进程号到core文件名中
- fs.suid_dumpable = 2 #确保设置属主的进程也可以生成core文件
- kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t #指定core文件生成的位置和文件名规则。
文件名规则可以使用的参数有:
- %% -- 符号%
- %p -- 进程号
- %u -- 进程用户id
- %g -- 进程用户组id
- %s -- 生成core文件时收到的信号
- %t -- 生成core文件的 时间 (seconds since 0:00h, 1 Jan 1970)
- %h -- 主机名
- %e -- 程序文件名
2.设置core文件导出的地址
echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern
确认导出的目录可写。
3.重启php-fpm
service php-fpm restart
4.访问地址重现502报错,此时会发现core文件被写入到第2步中的/tmp里。
[root@zcx-centos] /tmp
0 $ls
core-php-fpm.5381 ...
5.gdb调试
$ gdb /usr/local/php/sbin/php-fpm /tmp/core-php-fpm.5381
。。。//多余输出省略
Missing separate debuginfos, use: debuginfo-install ImageMagick-6.7.2.7-2.el6.x86_64 bzip2-libs-1.0.5-7.el6_0.x86_64 cyrus-sasl-lib-2.1.23-15.el6_6.2.x86_64 expat-2.0.1-11.el6_2.x86_64 fontconfig-2.8.0-5.el6.x86_64 freetype-2.3.11-15.el6_6.1.x86_64 glibc-2.12-1.166.el6_7.1.x86_64 keyutils-libs-1.4-5.el6.x86_64 krb5-libs-1.10.3-42.el6.x86_64 lcms-libs-1.19-1.el6.x86_64 libICE-1.0.6-1.el6.x86_64 libSM-1.2.1-2.el6.x86_64 libX11-1.6.0-6.el6.x86_64 libXau-1.0.6-4.el6.x86_64 libXext-1.3.2-2.1.el6.x86_64 libXt-1.1.4-6.1.el6.x86_64 libcom_err-1.41.12-22.el6.x86_64 libcurl-7.19.7-46.el6.x86_64 libgcc-4.4.7-16.el6.x86_64 libgcrypt-1.4.5-11.el6_4.x86_64 libgomp-4.4.7-16.el6.x86_64 libgpg-error-1.7-4.el6.x86_64 libidn-1.18-2.el6.x86_64 libjpeg-turbo-1.2.1-3.el6_5.x86_64 libselinux-2.0.94-5.8.el6.x86_64 libssh2-1.4.2-1.el6_6.1.x86_64 libstdc++-4.4.7-16.el6.x86_64 libtiff-3.9.4-10.el6_5.x86_64 libtool-ltdl-2.2.6-15.5.el6.x86_64 libuuid-2.17.2-12.18.el6.x86_64 libxcb-1.9.1-3.el6.x86_64 libxml2-2.7.6-20.el6.x86_64 libxslt-1.1.26-2.el6_3.1.x86_64 nspr-4.11.0-1.el6.x86_64 nss-3.21.0-8.el6.x86_64 nss-softokn-freebl-3.14.3-22.el6_6.x86_64 nss-util-3.21.0-2.el6.x86_64 openssl-1.0.1e-42.el6.x86_64 zlib-1.2.3-29.el6.x86_64
(gdb) bt
#0 _phpi_pop (ht=<value optimized out>, return_value=0x7f19e80d8be8, return_value_ptr=0x0, this_ptr=<value optimized out>,
return_value_used=<value optimized out>, off_the_end=0) at /usr/local/src/php-5.6.12/ext/standard/array.c:1879
#1 0x00007f19e9fb526e in hp_execute_internal (execute_data=0x7f19ec0e3ac0, fci=0x0, ret=0) at /usr/local/src/xhprof-0.9.4/extension/xhprof.c:1709
#2 0x0000000000866b25 in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>) at /usr/local/src/php-5.6.12/Zend/zend_vm_execute.h:560
#3 0x0000000000856610 in execute_ex (execute_data=0x7f19ec0e3ac0) at /usr/local/src/php-5.6.12/Zend/zend_vm_execute.h:363
#4 0x00000000007e7f19 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /usr/local/src/php-5.6.12/Zend/zend.c:1341
#5 0x000000000078795a in php_execute_script (primary_file=0x7fff0185c9e0) at /usr/local/src/php-5.6.12/main/main.c:2597
#6 0x0000000000896ca7 in main (argc=<value optimized out>, argv=<value optimized out>) at /usr/local/src/php-5.6.12/sapi/fpm/fpm/fpm_main.c:1964
到此可以初步判断xhprof有问题。关闭扩展,一切正常。估计是xhprof的版本问题。