0%

CoreDump的使用

在linux下开发的工程师们对CoreDump肯定都不陌生,但凡有些许经验的工程师都或多或少使用过CoreDump文件定位过崩溃问题。之前工作中,在Android系统下开发C++程序时, 经常用到CoreDump。 中间转行去搞iOS已经五年了, 最近换了新工作,遇到程序宕掉同事让我看一下coredump文件,一时还没有反应过来, 今天好好复习一下。

coredump文件是在程序出错而异常中断时,系统保存的状态文件。工程师可以通过gdb相应的程序,跟上coredump文件,还原程序崩溃时的状态,正常都可以从中查看到崩溃时的调用栈。

如何使系统创建coredump文件

默认系统时不会开启coredump功能的, 需要我们使用命令打开

1
2
3
4
5
6
7
8
9
10
11
12
// 使用ulimit -c 查看是否打开coredump, 如果返回为0则没有打开
Keep:raw_blog keep$ ulimit -c
0

// 我们可以使用ulimit -c unlimited 打开coredump功能,并且不限制文件大小。 也可以指定一个数值, 单位为KB

Keep:raw_blog keep$ ulimit -c unlimited
Keep:raw_blog keep$
Keep:raw_blog keep$ ulimit -c
unlimited
Keep:raw_blog keep$

使用命令打开的话, 只有当前终端生效。 如果要使系统生效的话, 需要修改/etc/security/limits.conf文件

相关配置

默认coredump文件在程序所在目录下生成,并且文件名为core。 可以通过修改/proc/sys/kernel/core_pattern来控制生成的路径及文件名。

1
/temp/core-%e-%p-%t  // 在temp目录下, 文件名为 core-程序名-pid-时间

还可以通过在程序中,调用系统函数设置coredump的文件大小

1
int setrlimit(int resource, const struct rlimit *rlimt);

调试命令

1
2
3
// 生成core文件后, 使用gdb查看信息

gdb program corefile

macos 的core文件默认生成到/cores/目录下

示例

由于mac上面没有安装gdb, 就用lldb来演示了

问题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>


void errorFunction() {
int i = 9;
int sum = 100;

while (i>0) {
i--;
sum /= i;
}
}


int main() {

errorFunction();
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
Keep:temp keep$ lldb ./m -c /cores/core.1172 
(lldb) target create "./m" --core "/cores/core.1172"
Core file '/cores/core.1172' (x86_64) was loaded.
(lldb) bt
* thread #1, stop reason = signal SIGSTOP
* frame #0: 0x0000000101497f84 m`errorFunction + 52
frame #1: 0x0000000101497fa4 m`main + 20
frame #2: 0x00007fff6f43d3d5 libdyld.dylib`start + 1
frame #3: 0x00007fff6f43d3d5 libdyld.dylib`start + 1
(lldb)

我们从中可以看到栈顶函数是errorFunction, 结合代码分析一下,很容易发现问题。

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。