一, gdb 查看core文件
gdb exe-file core-file
二, SIGSEGV 信号捕捉
注意: nm, map 只能找到函数地址,不能找到代码行地址。
map 文件生成选项 gcc c.c -Wl,-Map=mapname.map
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void Backtrace(int signo) {
printf("error:%d
", signo);
void *arr[5];
size_t size = backtrace(arr, 5);
backtrace_symbols_fd(arr, size, STDERR_FILENO);
exit(1);
}
static int count = 0;
int main() {
__sync_fetch_and_add(&count, 1);
printf("res:%d
", count);
signal(SIGSEGV, Backtrace);
int *p = (int *)5;
*p = 1;
}
- 信号处理函数捕捉 SIGSEGV 信号
$./a.out
res:1
error:11
./a.out(+0x120e)[0x559610cbd20e]
/lib/x86_64-linux-gnu/libc.so.6(+0x46210)[0x7f46c14c9210]
./a.out(+0x1281)[0x559610cbd281]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x7f46c14aa0b3]
./a.out(+0x110e)[0x559610cbd10e]
- addr2line从代码地址找到错误代码所在行
$addr2line -e a.out -f 0x1281
main
/home/ims/c.c:29
三,catchsegv
命令执行exe文件,找出段错误代码的地址
- catchsegv
- addr2line
$catchsegv ./a.out
Backtrace:
./a.out(+0x1250)[0x5629f743e250]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x7f8f5f4060b3]
./a.out(+0x10ee)[0x5629f743e0ee]
出错代码地址是:0x1250,根据addr2line 找到代码行。
dmesg 只能找到被赋值内存的地址,不能找到出错代码的地址。