zoukankan      html  css  js  c++  java
  • 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 只能找到被赋值内存的地址,不能找到出错代码的地址。

  • 相关阅读:
    redis
    docker :no such file or directory
    删除Linux的用户
    lunux系统安全
    centos7.4yum错误
    POI2014 HOT-Hotels
    POI2009 KON-Ticket Inspector
    CF140E New Year Garland
    CF392B Tower of Hanoi
    落谷 P2401 不等数列
  • 原文地址:https://www.cnblogs.com/ims-/p/13759528.html
Copyright © 2011-2022 走看看