[原创]如何排查php-fpm的502报错(SIGSEGV)

参考:

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的版本问题。

相关推荐
XiaoLeisj2 小时前
Android 权限管理实战:运行时申请、ActivityResultLauncher 与设置页授权
android·java·权限
橙子199110162 小时前
Android 中的权限申请
android
2501_915921432 小时前
iOS APP上架工具,在没有 Mac 的环境中发布苹果应用
android·macos·ios·小程序·uni-app·iphone·webview
范特西林2 小时前
第一篇:从电源键到上帝进程——硬件觉醒与 Init 的诞生
android
养了一只皮卡丘2 小时前
ubuntu22.04搭建mysql8.0.45 mgr (2)
android·adb
常利兵2 小时前
深入理解Android ViewModel&SavedStateHandle:告别数据丢失,打造稳健UI架构
android·ui·架构
范特西林2 小时前
第四篇:从点击到显示——App 启动与 Activity 生命周期全追踪
android
ke_csdn2 小时前
安卓的视频通讯
android·音视频
范特西林2 小时前
第二篇:Java 世界的“创世神”:Zygote 如何一秒孵化一个 App?
android