(八)core文件详解
项目线上频繁的产生core文件,运维同事都有意见了,刚开始以为设置ulimit -c 0
就可以了,但是ulimit只对当前会话有效,且这并不能真正解决程序崩溃的问题。
对于linux后台开发,经常会与core文件打交道。为了能够更好的分析其中的原理,就查阅一些资料来对core文件进行深入的学习。
参考:
- Linux上Core Dump文件的形成和分析
- 详解coredump
- linux下core dump【总结】
- 截取 SIGSEGV 将不会产生 core dump 文件
- 让/etc/profile文件修改后立即生效
- Linux系统调用--getrlimit()与setrlimit()函数详解
1. coredump文件
core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
core dump 对于编程人员诊断和调试程序是非常有帮助的,有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景.
[root@localhost]# cat /proc/sys/kernel/core_pattern
core
/proc/sys/kernel/core_pattern
文件, 用于控制Core文件的文件名. 默认情况下,只有一行:“core”.也支持定制,使用%配合不同的字符:
- %p Core进程的PID
- %u Core进程的UID
- %s 造成Core的signal号
- %t Core的时间,从1970-01-0100:00:00开始的秒数
- %e Core进程对应的可执行文件名
2. linux命令
ulimit –c
命令,可以查看和设置当前OS对于Core文件大小的限制
ld@ld-pc:~/workspace/cpp/net$ ulimit -c
0
ld@ld-pc:~/workspace/cpp/net$ ulimit -c unlimited
ld@ld-pc:~/workspace/cpp/net$ ulimit -c
unlimited
ld@ld-pc:~/workspace/cpp/net$ ulimit -c 1000
ld@ld-pc:~/workspace/cpp/net$ ulimit -c
1000
3. limit
cat /etc/security/limits.conf
#* soft core 0
4. getrlimit/setrlimit函数设置core dump
程序中开启core dump,可以通过函数查看和设置RLIMIT_CORE