Linux中Core Dump问题

在linux下开发时,如果程序突然崩溃了,也没有任何日志。这时可以查看core文件。从core文件中分析原因,通过gdb看出程序挂在哪里,分析前后的变量,找出问题的原因。

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

ulimit

ulimit命令用来限制系统用户对shell资源的访问。限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

ulimit相关选项:

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

1、Core Dump文件生成在哪里?

可以通过以下命令: cat /proc/sys/kernel/core-pattern 查看Core Dump文件的生成路径和格式。 
默认Core Dump文件为core,在一些linux版本下,生成的core文件带有进程号,比如core.7715。 
也可以设置为如下格式: core-%e-%p-%t 
其中%e表示程序名称,%p表示进程PID,%t表示触发Core Dump的时间(单位为秒,从 1970-01-01 00:00:00 开始计算)。

2、如何使用Core Dump文件?

可以采用Linux中的gdb进行调试分析Core Dump文件。

gdb [exec file] [core file]

加载完成后,即可以在GDB中查看程序异常时的各种运行信息了(查看变量值、线程信息、调用栈、反汇编等等) 
调试命令可以采用where或者bt(backtrace)查看程序崩溃时的堆栈信息。

3、实例分析

TEST_CORE.C

#include <stdio.h>

void core_test1()
{
    int i = 0;
    //below will call segmentfault
    scanf("%d", i);
    printf("%d", i);
}

int main()
{
    core_test1();
    return 0;
}

编译生成可执行文件:gcc TEST_DUMP.c -o test_dump 

运行./test_dump 
测试结果为: 
这里写图片描述

分析:

生成core文件为: 
gdb ./test_dump core 
gdb调试如下:

这里写图片描述

发布了161 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/104942691