一、概述:
当程序在运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做core dump。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息,主要格式是ELF格式。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core 文件可以再现程序出错时的情景。
core 文件一般都很大,如果core文件很多占用硬盘空间太大,最终可能导致死机。
二、配置:
1、查看是否开启core dump:
ulimit -c
如果输出:0,说明是关闭的,如果输出:unlimited,说明是开启的。
2、开启core dump,并且不限制core文件大小,只限当前会话有效:
ulimit -c unlimited
3、开启core dump,限制core文件大小,单位是KB,只限当前会话有效:
ulimit -c 30000000
4、关闭core dump,只限当前会话有效:
ulimit -c 0
5、如果需要长久有效,有两种方式:
①在/etc/profile中,将0改为unlimited,然后source /etc/profile生效;
②在/etc/security/limits.conf设置:
6、core文件默认保存的位置是程序被执行的可执行文件的目录,修改/proc/sys/kernel/core_pattern内容则可以改变目录和文件名,默认是:core,可以改为:
/tmp/corefile/core-%e-%p-%t
常用格式有:
1>%%:单个%字符
2>%p:所dump进程的进程ID
3>%u:所dump进程的实际用户ID
4>%g:所dump进程的实际组ID
5>%s:导致本次core dump的信号
6>%t:core dump的时间 (由1970年1月1日计起的秒数)
7>%h:主机名
8>%e:程序文件名
7、默认文件名是core,修改/proc/sys/kernel/core_uses_pid,内容改为1,则文件名变为core.xxx,其中 xxx为进程pid。
三、查看:
一般使用gdb进行查看,gdb中常用命令有:
1、l(list):显示源代码,并且可以看到对应的行号;
2、b(break)x:x是行号,表示在对应的行号位置设置断点;
3、p(print)x:x是变量名,表示打印变量x的值;
4、r(run):表示继续执行到断点的位置;
5、n(next):表示执行下一步;
6、c(continue):表示继续执行;
7、q(quit):表示退出gdb;
8、info share:查看已加载的动态库;
9、bt:查看程序堆栈信息;
四、Singal含义:
1、SIGABRT:调用abort函数时产生此信号。进程异常终止。
2、SIGBUS:指示一个实现定义的硬件故障。
3、SIGEMT:指示一个实现定义的硬件故障。EMT这一名字来自PDP-11的emulator trap 指令。
4、SIGFPE:此信号表示一个算术运算异常,例如除以0,浮点溢出等。
5、SIGILL:此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。SIGABRT现在被用于此。
6、SIGIOT:这指示一个实现定义的硬件故障。IOT这个名字来自于PDP-11对于输入/输出TRAP(input/outputTRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号。SIGABRT现在被用于此。
7、SIGQUIT:当用户在终端上按退出键(一般采用Ctrl-/)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。
8、SIGSEGV:指示进程进行了一次无效的存储访问。名字SEGV表示“段违例(segmentationviolation)”。
9、SIGSYS:指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。
10、SIGTRAP:指示一个实现定义的硬件故障。此信号名来自于PDP-11的TRAP指令。
11、SIGXCPUSVR4和4.3+BSD支持资源限制的概念。如果进程超过了其软CPU时间限制,则产生此信号。
12、SIGXFSZ:如果进程超过了其软文件长度限制,则SVR4和4.3+BSD产生此信号。