linux 调试core文件的三个方法

一, 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;
}
  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]
  1. addr2line从代码地址找到错误代码所在行
$addr2line -e a.out -f 0x1281
main
/home/ims/c.c:29

三,catchsegv 命令执行exe文件,找出段错误代码的地址

  1. catchsegv
  2. 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 只能找到被赋值内存的地址,不能找到出错代码的地址。

原文地址:https://www.cnblogs.com/ims-/p/13759528.html