做 Linux 相关的开发工作,core 文件是一定会接触到的。Linux 小白对 core 文件可能会一筹莫展,这里就系统的讲解一下 core 文件的生成,以及怎么利用 core 文件分析问题。

注:本文所用的环境是嵌入式 Linux,相对于 PC 会有一些精简。

1. 基本原理

Core dump 文件是系统收到特定信号时由操作系统生成的。信号可以是由程序运行过程的异常触发,或者由外部进程发送。导致的结果一般是某个进程生成 core dump 文件,文件包含了此进程当前的运行堆栈信息,方便开发人员用来分析问题。

2. 生成 core 文件

ulimit -a 命令查看系统是否已设置可以生成 core 文件。如果 core file size 项是 0,则说明当前系统已经关闭 core 文件生成。

Linux javacore linux javacore文件生成指令_Linux javacore


用 *ulimit -c * 命令开启生成 core 文件功能。

ulimit -c unlimited # 开启 core 文件生成,且不限 core 文件大小
ulimit -c 100 # 开启 core 文件生成,且限 core 文件大小为 100KB

Linux javacore linux javacore文件生成指令_文件名_02


那生成的 core 文件是放置在哪里呢?

这个同样可以设置,命令如下:

echo /data/core-%p > /proc/sys/kernel/core_pattern

命令中带 *% * 的是参数,可以指定文件名格式,在文件名加上我们想要的信息,可以帮助我们快速定位问题方向;同时也可以区分不同进程的 core 文件。可以使用的参数如下表格:

参数

说明

%e

所 dump 的文件名

%g

所 dump 的进程的实际组 ID

%h

主机名

%p

所 dump 的进程PID

%s

导致本次 coredump 的信号

%t

转储时刻 (由1970年1月1日起计的秒数)

%u

所 dump 进程的实际用户ID

如使用以下命令设定:

echo /data/core-%p-%s-%e > /proc/sys/kernel/core_pattern

生成的 core 文件如下:

Linux javacore linux javacore文件生成指令_linux_03


从 core 文件名就可以看出进程 ID,进程退出的原因,以及出现问题的函数等信息。这是一个 demo 进程,只有一个 main.c 文件,main 函数里面给空指针赋值,所以系统给进程发送 SIGSEGV (11) 信号,使进程退出。

3. 分析 core 文件

Linux 平台常用的 core dump 文件分析工具是 gdb。

我们将以上的 demo 程序稍微改一下,增加一层函数调用,然后我们再分析 core 文件,看能不能定位到出问题的函数。

Linux javacore linux javacore文件生成指令_嵌入式_04


经过上面一顿操作之后,生成 core 文件,然后我们再用 gdb 工具来分析。

我所有的 gdb 工具是用交叉工具链编译好,可以直接在嵌入式 linux 上运行的,所以生成 core 文件后,可以直接在运行环境上分析,而不需要拷贝到 PC 上。

用 gdb 分析 core 文件,就可以定位到具体的问题点。

Linux javacore linux javacore文件生成指令_嵌入式_05


这里只是简单提到 gdb 的使用,我将在另外一篇详细讲一下 gdb 的使用。