Linux dump调试程序,Linux core dump 生成和调试

core dump

某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像。在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便。

更详细的文档参考 Linux Manual Page http://man7.org/linux/man-pages/man5/core.5.html.

生成 core 文件

这里只讲生成的方法,不能生成core的情况参考文档

ulimit -c -H 为查看core资源的命令 -c 为软资源限制(操作系统分配),-H 为操作系统资源的上限。

命令ulimit -c LIMIT, LIMIT为设置的core文件的大小,也可以设置为unlimited,当退出当前tty后设置便失效,资源限制成 0

修改 /etc/profile,增加ulimit -c LIMIT,同上

修改 /etc/security/limits.conf, 将 core 对应的 value 修改为要设置的值

调用函数 setrlimit()设置当前进程的软core资源限制

struct rlimit rlim;

rlim.rlim_cur = 1024 * 1024;

// rlim.rlim_max 不设置

setrlimit(RLIMIT_CORE, &rlim);

调试

1 // File:      lim.c

2 // Author:    xianhui (definezxh@163.com)

3 // Date:      2018/09/10 15:24:07

4

5 #include

6 #include

7 #include

8 #include

9

10 int main()

11 {

12        struct rlimit rlim;

13

14        getrlimit(RLIMIT_CORE, &rlim);

15        printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max);

16

17        rlim.rlim_cur = 1024 * 1024;

18        // rlim.rlim_max 不设置

19

20        setrlimit(RLIMIT_CORE, &rlim);

21

22        getrlimit(RLIMIT_CORE, &rlim);

23        printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max);

24

25        int *ptr = NULL;

26        for (int i = 0; i < 20; i++)

27                if (i == 10)

28                        *ptr = 12;

29 }

// 显然在第28行是错误的,这个用肉眼也能看的出来,但是如果是一个比较大的程序,就只顾首不顾尾了,有这个文件在,配合lldb

lldb a.out --core core_p20828_s11_t1536568024

·

·

·

Process 21168 stopped

* thread #1: tid = 21168, 0x0000000000400679 a.out`main + 169 at lim.c:28,name = 'a.out', stop reason = signal SIGSEGV: invalid address (faultaddress: 0x0)

frame #0: 0x0000000000400679 a.out`main + 169 at lim.c:28

25              int *ptr = NULL;

26              for (int i = 0; i < 20; i++)

27                      if (i == 10)

-> 28                          *ptr = 12;

29      }

// 直接定位到段错误的地方,这个刻意 i == 10 的时候才出的错,是为了监视i的值

(lldb) p i

(int) $0 = 10

// 监视段错误的时候 rlim.cur 的值

(lldb) p rlim.rlim_cur

(rlim_t) $1 = 1048576

具体的core文件生成限制,core文件名的显示,控制将哪些映射写入核心转储 等说明参考manual page。

其实说白了,就是一个内核分配生成core文件大小和将内存映像写入至那个文件中的操作。

刚开始这个core始终不能生成,是应为我抄了manual page中的那个示例,但是示例产生文件目录名和我当时的目录不一致,这就导致了core不能生成。

当前我的/proc/sys/kernel/core_pattern文件内容为core_p%p_s%s_t%t,产生的文件为core_p20828_s11_t1536568024

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值