我是靠谱客的博主 合适石头,最近开发中收集的这篇文章主要介绍C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

源程序

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>

void crashHandler(int signal)
{
    void *bt[20];
    int btSize = 20;
    char **btStrings;

    switch (signal)
    {
    case SIGINT:
        printf("SIGINT  Interactive attention signal.  n");
        break;
    case SIGILL:
        printf("SIGILL  Illegal instruction.  n");
        break;
    case SIGABRT:
        printf("SIGABRT  Abnormal termination.  n");
        break;
    case SIGFPE:
        printf("SIGFPE  Erroneous arithmetic operation.  n");
        break;
    case SIGSEGV:
        printf("SIGSEGV  Invalid access to storage.  n");
        break;
    case SIGTERM:
        printf("SIGTERM  Termination request.  n");
        break;
    case SIGHUP:
        printf("SIGHUP  Hangup.  n");
        break;
    case SIGQUIT:
        printf("SIGQUIT  Quit.  n");
        break;
    case SIGTRAP:
        printf("SIGTRAP  Trace/breakpoint trap.  n");
        break;
    case SIGKILL:
        printf("SIGKILL  Killed.  n");
        break;
    case SIGBUS:
        printf("SIGBUS  Bus error.  n");
        break;
    case SIGSYS:
        printf("SIGSYS  Bad system call.  n");
        break;
    case SIGPIPE:
        printf("SIGPIPE  Broken pipe.  n");
        break;
    case SIGALRM:
        printf("SIGALRM  Alarm clock.  n");
        break;
    case SIGURG:
        printf("SIGURG  Urgent data is available at a socket.  n");
        break;
    case SIGSTOP:
        printf("SIGSTOP  Stop, unblockable.  n");
        break;
    case SIGTSTP:
        printf("SIGTSTP  Keyboard stop.  n");
        break;
    case SIGCONT:
        printf("SIGCONT  Continue.  n");
        break;
    case SIGCHLD:
        printf("SIGCHLD  Child terminated or stopped.  n");
        break;
    case SIGTTIN:
        printf("SIGTTIN  Background read from control terminal.  n");
        break;
    case SIGTTOU:
        printf("SIGTTOU  Background write to control terminal.  n");
        break;
    case SIGPOLL:
        printf("SIGPOLL  Pollable event occurred (System V).  n");
        break;
    case SIGXCPU:
        printf("SIGXCPU  CPU time limit exceeded.  n");
        break;
    case SIGXFSZ:
        printf("SIGXFSZ  File size limit exceeded.  n");
        break;
    case SIGVTALRM:
        printf("SIGVTALRM  Virtual timer expired.  n");
        break;
    case SIGPROF:
        printf("SIGPROF  Profiling timer expired.  n");
        break;
    case SIGUSR1:
        printf("SIGUSR1  User-defined signal 1.  n");
        break;
    case SIGUSR2:
        printf("SIGUSR2  User-defined signal 2.  n");
        break;
    case SIGWINCH:
        printf("SIGWINCH  Window size change (4.3 BSD, Sun).  n");
        break;

    default:
        printf("unkown signal:%dn", signal);
        break;
    }

    btSize = backtrace(bt, btSize);
    btStrings = backtrace_symbols(bt, btSize);
    for (int i = 0; i < btSize; i++)
    {
        printf("%sn", btStrings[i]);
    }
    exit(signal);
}

void testCrash()
{
    int *a = 0;
    int aa = *a;
    printf("%dn", aa);
}

void main()
{
    signal(SIGSEGV, &crashHandler);
    printf("startn");
    testCrash();
    printf("donen");
}

编译指令

gcc -g crashHandle.c

运行结果

yeqiang@yeqiang-PC:~/tmp$ ./a.out 
start
SIGSEGV  Invalid access to storage.  
./a.out() [0x40136b]
/lib/x86_64-linux-gnu/libc.so.6(+0x37970) [0x7fab38850970]
./a.out() [0x4013db]
./a.out() [0x40141e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb) [0x7fab3883d09b]
./a.out() [0x4010ba]

获取0x4013db对应源码行

yeqiang@yeqiang-PC:~/tmp$ addr2line -e a.out -f 0x4013db
testCrash
/home/yeqiang/tmp/crashHandle.c:119

对应源码

注意事项:

编译时需要增加-g参数,否则addr2line不能得到对应源码行信息。但可以通过汇编分析代码大概位置。

汇编分析:

objdump -d a.out | grep 4013db -C10

 

最后

以上就是合适石头为你收集整理的C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line的全部内容,希望文章能够帮你解决C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部