Linux生成dumpcore并进行调试,以及addr2line的用法

1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump。
2) 使用ulimit -c unlimited命令,开启core dump功能,并且不限制生成core dump文件的大小。如果需要限制,加数字限制即可。ulimit - c 1024
3) 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel/core_uses_pid文件,可以将进程的pid作为扩展名,生成的core文件格式为core.xxx,其中xxx即为pid

4) 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

首先生成可执行程序时加-g 表示启动gdb调试功能.生成core文件后,开始调试core:

gdb a.out core

开始进行调试,运气好的话,现在就能找到断错误的地方了:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000401355 in test1 (ptr=0x0) at main.cpp:14
14	        cout << arr[i] << "\t";
[Current thread is 1 (Thread 0x7f0902258700 (LWP 25272))]

bt //查看线程堆栈信息backtrace

#0  0x0000000000401355 in test1 (ptr=0x0) at main.cpp:14
#1  0x00000000004017be in callback () at Pthreadpool.cpp:48
#2  0x00007f09046ce6ba in start_thread (arg=0x7f0902258700)
    at pthread_create.c:333
#3  0x00007f0903e6c41d in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

thread apply all bt //查看所有线程堆栈信息

除了用core文件,我们也可以通过addr2line获取断错误地点:

dmesg //查看程序诊断信息,在最下面有我们刚刚挂掉的程序的信息:

[25567.116811] a.out[25662]: segfault at 10 ip 0000000000401283 sp 00007f166f145ea0 error 4 in a.out[400000+3000]

其中的ip即是我们所需要的诊断地址.

threadpool# addr2line -e a.out 0000000000401355
/home/peng/myTest/xue/mypool/threadpool/main.cpp:14 (discriminator 2)


addr2line应该是从elf文件中获取的行号和地址,可以通过readelf -w a.out查看相关信息.

扫描二维码关注公众号,回复: 3072770 查看本文章

使用strip  a.out擦除这个文件关于a.out的信息后,addr2line也就无能为力了.

猜你喜欢

转载自blog.csdn.net/qq_39937902/article/details/79569121