linux下core dump【总结】
在linux下,程序莫名突然崩溃了怎么办,有的程序有日志,有的程序没有则么办,或者自己忘记定义了怎么办,而且,有没有其他途径能配合程序日志更快的解决问题?
基本概念: 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
查看系统的core功能是否打开:
[root@VM_13_117_centos security]# 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) 128337
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 100001
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) 128337
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
参数描述及使用
ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)
和可同时运行的最大进程数(max user processes)无效
-a 列出所有当前资源极限
-c 设置core文件的最大值.单位:blocks
-d 设置一个进程的数据段的最大值.单位:kbytes
-f Shell 创建文件的文件大小的最大值,单位:blocks
-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
-l 可以锁住的物理内存的最大值
-m 可以使用的常驻内存的最大值,单位:kbytes
-n 每个进程可以同时打开的最大文件数
-p 设置管道的最大值,单位为block,1block=512bytes
-s 指定堆栈的最大值:单位:kbytes
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
-t 指定每个进程所使用的秒数,单位:seconds
-u 可以运行的最大并发进程数
-v Shell可使用的最大的虚拟内存,单位:kbytes
在linux中,我们可以用ulimit -a指令来查看,哪些系统设置被限制了,要么开关,要么限制大小,要么无限制,总共三种方案。
开启core dump功能:
执行指令: ulimit -c unlimited
这个命令只对当前终端有效,要想永久有效,修改配置文件/etc/security/limits.conf,格式如下:
* soft core unlimited
* soft nofile 100001
* hard nofile 100002
root soft nofile 100001
root hard nofile 100002
配置core记录程序PID:
默认生成的core文件保存在与可执行文件的同级目录下,名字就叫core;
通过修改/proc/sys/kernel/core_uses_pid : echo 1 > /proc/sys/kernel/core_uses_pid 就可以让生成的core文件名加上pid,其中pid为该挂掉进程的pid,那么这里,当有很多个进程同时存在的时候,哪个进程挂了,对应的core文件就会以该进程的PID作为文件后缀,形似:“core.PID”
配置core文件存储路径与名称格式:
通过修改/proc/sys/kernel/core_pattern开控制生成的core文件的位置以及文件名格式
echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
上面的配置的作用为将core文件保存在/tmp/corefile目录中,且格式为:"core-命令名-pid-时间戳";
笔者的线上服务器中/proc/sys/kernel/core_pattern 内容为core,则说明,保存在默认位置,无特殊格式,但/proc/sys/kernel/core_uses_pid中为1,所以pid记录功能功能是打开的,同时也在线上环境的bin目录下发现core文件,说明解释正确。
core文件的调试:
在core文件所在目录下键入:
gdb -c core (-c指定core文件)
它会启动GNU的调试器,来调试core文件,并且会显示生成此core文件的程序名,中止此程序的信号等等
如果你已经知道是由什么程序生成此core文件的,比如MySQL崩溃了生成core.12345,那么用此指令调试:
gdb ./mysql core.12345
以犀牛的线上例子为准:
[root@VM_200_97_centos bin]# gdb ./sdo_security -d core.22624
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
warning: /app/sdo/server/bin/core.22624 is not a directory.
Reading symbols from /app/sdo/server/bin/sdo_security...done.
(gdb)
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./sdo_security -d'.
Program terminated with signal 6, Aborted.
#0 0x00007fe3c8ceb625 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64 libgcc-4.4.7-16.el6.x86_64 libstdc++-4.4.7-16.el6.x86_64 zlib-1.2.3-29.el6.x86_64
(gdb) quit
这里截取了最后几行,其中最后面的Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64 libgcc-4.4.7-16.el6.x86_64 libstdc++-4.4.7-16.el6.x86_64 zlib-1.2.3-29.el6.x86_64
这里有个调试依赖的报错,提示你直接执行这个语句,也就是安装后面的那几个包,这里不做阐述。
注意:在线上环境部署中,一般我们设置有监控监本,进程core了之后,会有脚本自动拉起来,再分析coredump文件,有个问题:
如果此时发现core文件大小的上限设置的不够,导致coredump文件被截断了,下面具体的做法是?
1:更改文件大小上限(一般都是unlimited,由于core文件大多会很大,因此需要密切关注磁盘容量变化)
2:重启业务进程!这步需要注意,如果存在单点的话,需要规划时间执行重启操作,否则在下次crash的时候,得到的coredump文件依旧是不完整的!
core在C环境下的程序中常常用到!共勉。