Linux操作系统生成core dump文件

编译php和扩展的时候,往往由于版本的兼容问题会出现问题,但是提示信息有很少,有时候想追进去看个究竟,core dump就可以记录这些错误

在linux平台下,设置core dump文件生成的方法:

1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump。

2) 使用ulimit -c unlimited命令,开启core dump功能,并且不限制生成core dump文件的大小。如果需要限制,加数字限制即可。ulimit – c 1024

3) 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel/core_uses_pid文件,可以将进程的pid作为作为扩展名,生成的core文件格式为core.xxx,其中xxx即为pid

4) 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. 

root用户执行下面命令:

echo "/var/log/core/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名: 
%% 单个%字符 
%p 所dump进程的进程ID 
%u 所dump进程的实际用户ID 
%g 所dump进程的实际组ID 
%s 导致本次core dump的信号 
%t core dump的时间 (由1970年1月1日计起的秒数) 
%h 主机名 
%e 程序文件名

5)查看core dump内容,core dump生成的文件其实是二进制格式,直接cat或者less命令是看不到内容的的,必须依赖gdb,下面以php-fpm启动报错为例:

gdb /opt/php7/sbin/php-fpm /var/log/php-fpm.core.33381

然后敲入bt命令,查看调用堆栈

内容如下

Reading symbols from /usr/lib64/libsasl2.so.2...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libsasl2.so.2
Reading symbols from /lib64/libkrb5support.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib64/libkrb5support.so.0
Reading symbols from /lib64/libkeyutils.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libkeyutils.so.1
Reading symbols from /lib64/libselinux.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libselinux.so.1
Reading symbols from /opt/php7/lib/php/extensions/no-debug-non-zts-20151012/opcache.so...done.
Loaded symbols for /opt/php7/lib/php/extensions/no-debug-non-zts-20151012/opcache.so
Reading symbols from /opt/php7/lib/php/extensions/no-debug-non-zts-20151012/yaf.so...done.
Loaded symbols for /opt/php7/lib/php/extensions/no-debug-non-zts-20151012/yaf.so
Core was generated by `/opt/php7/sbin/php-fpm --daemonize --fpm-config /opt/php7/etc/php-fpm.conf --pi'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000033f0729008 in __strcmp_sse42 () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install cyrus-sasl-lib-2.1.23-15.el6_6.2.x86_64 freetype-2.3.11-15.el6_6.1.x86_64 glibc-2.12-1.149.el6_6.7.x86_64 keyutils-libs-1.4-5.el6.x86_64 krb5-libs-1.10.3-37.el6_6.x86_64 libcom_err-1.41.12-21.el6.x86_64 libcurl-7.19.7-40.el6_6.4.x86_64 libidn-1.18-2.el6.x86_64 libjpeg-turbo-1.2.1-3.el6_5.x86_64 libpng-1.2.49-1.el6_2.x86_64 libselinux-2.0.94-5.8.el6.x86_64 libssh2-1.4.2-1.el6.x86_64 libtool-ltdl-2.2.6-15.5.el6.x86_64 libxml2-2.7.6-17.el6_6.1.x86_64 nspr-4.10.0-1.el6.x86_64 nss-3.15.1-15.el6.x86_64 nss-softokn-freebl-3.14.3-22.el6_6.x86_64 nss-util-3.15.1-3.el6.x86_64 openldap-2.4.39-8.el6.x86_64 openssl-1.0.1e-30.el6.8.x86_64 zlib-1.2.3-29.el6.x86_64
(gdb) bt
#0  0x00000033f0729008 in __strcmp_sse42 () from /lib64/libc.so.6
#1  0x00007ffdba9422a9 in accel_find_sapi (extension=<value optimized out>)
    at /data/src/php-src-php-7.0.0RC6/ext/opcache/ZendAccelerator.c:2355
#2  accel_startup (extension=<value optimized out>) at /data/src/php-src-php-7.0.0RC6/ext/opcache/ZendAccelerator.c:2613
#3  0x0000000000814d41 in zend_extension_startup (extension=0x203a5f0) at /data/src/php-src-php-7.0.0RC6/Zend/zend_extensions.c:176
#4  0x00000000007fe6b3 in zend_llist_apply_with_del (l=0x11621a0, func=0x814d30 <zend_extension_startup>)
    at /data/src/php-src-php-7.0.0RC6/Zend/zend_llist.c:171
#5  0x0000000000814d27 in zend_startup_extensions () at /data/src/php-src-php-7.0.0RC6/Zend/zend_extensions.c:197
#6  0x00000000007adeda in php_module_startup (sf=<value optimized out>, additional_modules=<value optimized out>,
    num_additional_modules=<value optimized out>) at /data/src/php-src-php-7.0.0RC6/main/main.c:2197
#7  0x00000000008a70d5 in php_cgi_startup (sapi_module=<value optimized out>)
    at /data/src/php-src-php-7.0.0RC6/sapi/fpm/fpm/fpm_main.c:837
#8  0x00000000008a794e in main (argc=6, argv=0x7fff549397c8) at /data/src/php-src-php-7.0.0RC6/sapi/fpm/fpm/fpm_main.c:1788

官方参考:

http://www.akadia.com/services/ora_enable_core.html

另外我们在用 echo “/var/log/core/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 重定向core文件时, 一定要确保该用户有/var/log/core目录的写权限,不然还是得不到coredump文件

发表评论

邮箱地址不会被公开。 必填项已用*标注