序言
当程序在运行的过程中出现异常中止或崩溃,系统会将程序当时的状态记录出来,保存在一个core文件中,这些机制称为CoreDump,又称“核心轮询”。Coredump机制记录了程序异常时的显存数据、寄存器状态以及运行堆栈等信息linux查看dump文件,开发人员可以使用调试工具剖析Core文件来快速定位程序异常缘由。
Coredump基本配置core文件的生成开关和大小限制
ulimit命令的-c选项专门用于控制core文件的生成以及对core文件大小进行限制:
使用ulimit命令打开core文件的生成开关,但是不限制core文件的生成大小:
命令执行完成后,系统还会在程序崩溃时,为其生成核心轮询文件。须要注意的,上述的配置是临时性的,在系统重启后才会遗失,为了配置永久有效,须要将更改保存到配置文件中。这儿更改形式有两种:
core文件的名称和生成路径
默认情况下,core文件生成在可执行文件运行命令的同一路径下。若系统生成的core文件不带其它任何扩充名称,则全部命名为core,但是新的core文件生成将覆盖原先的core文件。Linux在proc文件系统中提供了入口用以支持对core文件的名称以及生成路径进行配置:
为了配置core文件保存到特定的目录下,可以通过以下命令更改/proc/sys/kernel/core_pattern文件的内容(须要注意的是配置的路径必须是有效的,否则core文件难以生成):
上述的命令会让系统在进程崩溃时将core文件统一生成到/corefile目录下,而且形成的core文件名格式为core-命令名-pid-时间戳linux系统下载,其中使用到了一些低格参数。core_pattern文件支持的参数及其意义列举如下:
使用sysctl进行配置
sysctl命令用于运行时配置内核参数,这种参数坐落/proc/sys目录下,因而也可以使用sysctl配置core文件:
不仅直接使用命令的形式linux查看dump文件,sysctl支持使用/etc/sysctl.conf配置文件的形式对内核参数进行配置,对应的参数项依次为:
kernel.core_uses_pidkernel.core_patternCore文件的生成与使用
打算测试程序:
#include
#include
int crash()
{
char *crash_info = "crash!!!";
crash_info[1] = 'D';
return 0;
}
int main()
{
crash();
return 0;
}
因为程序访问了只读数据,执行上述程序会触发程序崩溃,程序的运行结果中出现了coredumped字眼,说明core文件早已生成:
查看生成的core文件以及信息如下:
coredump文件的使用
完成core文件的搜集后,后续就是调试工具对core文件进行剖析查找程序崩溃的缘由了。使用gdb工具读取core文件的命令如下:
对于gdb的使用linux应用程序,不是本文的重点,网上也有好多资料可以查找,在此跳过。
使用systemd的系统下获取core文件
在使用systemd的系统中,/proc/sys/kernel/core_pattern的文件内容可能是如下的结果:
这儿core_pattern被配置成以|管线字符开头的字符串,意味着程序的coredump信息将会作为标准输入交由systemd-coredump程序进行处理。systemd-coredump默认会为所有进程在/var/lib/systemd/coredump目录下以特定的压缩格式生成core文件。
使用coredumpctl获取core文件
systemd提供了专门的命令coredumpctl用于查找和获取coredump文件信息。使用coredumpctl列举系统已捕获的core信息:
systemd控制生成的core文件使用特定的格式进行了压缩,为了获取原生可调试的coredump文件,须要使用coredumpctl命令进行获取:
使用gdb生成coredump文件
在一些情况下,可能希望获取程序正常运行过程中的信息,gdb支持使用子命令generate-core-file在调试程序的过程中生成core文件,示例如下:
##相关参考