Linux之core文件分析

一、概述:

        当程序在运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做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产生此信号。

推荐博客:https://www.jianshu.com/p/414a1bde76a2

发布了108 篇原创文章 · 获赞 31 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/lzghxjt/article/details/103174773