使用backtrace打印程序crash堆栈

简介: 使用backtrace打印程序crash堆栈

利用backtrace可以在程序crash退出之前,打印出crash时的堆栈信息,有助于我们分析crash问题。下面,教大家如何在linux下利用backtrace打印crash堆栈信息。

1. 引入头文件

# include <signal.h>

2. 初始化backtrace

struct sigaction newAct;
newAct.sa_handler = NaviBackTrace;
sigemptyset( &newAct.sa_mask );
sigaction(SIGABRT, &newAct, NULL);
sigaction(SIGSEGV, &newAct, NULL);
sigaction(SIGBUS, &newAct, NULL);
sigaction(SIGFPE, &newAct, NULL);
sigaction(SIGILL, &newAct, NULL);
sigaction(SIGTRAP, &newAct, NULL);

其中NaviVackTrace为程序发生crash,退出之前的回调函数,在此函数中可以做一些事情,例如打印crash堆栈,通知其它程序该程序crash等。

3. NaviBackTrace函数

static void NaviBackTrace(int signalNum)
{
    printf("NaviBackTrace signalNum[%d]", signalNum);
    usleep(1000 * 1000);
    if (signalNum == SIGABRT)
    {
        printf("Start print stack information(SIGABRT).");
    }
    else if (signalNum == SIGSEGV)
    {
        printf("Start print stack information(SIGSEGV).");
    }
    else if (signalNum == SIGBUS)
    {
        printf("Start print stack information(SIGBUS).");
    }
    else if (signalNum == SIGFPE)
    {
        printf("Start print stack information(SIGFPE).");
    }
    else if (signalNum == SIGILL)
    {
        printf("Start print stack information(SIGILL).");
    }
    else if (signalNum == SIGTRAP)
    {
        printf("Start print stack information(SIGTRAP).");
    }
    void * array[100];
    int nSize = backtrace(array, 100);
    char ** symbols = backtrace_symbols(array, nSize);
    printf("process id(%d), thread id(%u)", getpid(), (unsigned int)pthread_self());
    for (int i = 1; i < nSize; i++)
    {
        printf("%s", symbols[i]);
    }
    printf("End print stack information.");
    free(symbols);
    signal(SIGABRT, SIG_DFL);
    signal(SIGSEGV, SIG_DFL);
    signal(SIGBUS, SIG_DFL);
    signal(SIGFPE, SIG_DFL);
    signal(SIGILL, SIG_DFL);
    signal(SIGTRAP, SIG_DFL);
}
相关文章
打印全部异常堆栈、ExceptionUtils.getFullStackTrace这样最快
打印全部异常堆栈、ExceptionUtils.getFullStackTrace这样最快
241 0
|
4天前
|
Linux C++
【代码片段】Linux C++打印当前函数调用堆栈
【代码片段】Linux C++打印当前函数调用堆栈
15 0
|
存储 运维 安全
基于VS调试分析 + 堆栈观察问题代码段
面对眼前两段有问题的代码,你会通过什么去解决这个问题?本文将通过调试进行逐步分析💻,带你步步观察程序的运行逻辑
21362 0
基于VS调试分析 + 堆栈观察问题代码段
|
监控 Java Android开发
RxJava 异常时堆栈显示不正确?解决方法都在这里
RxJava 异常时堆栈显示不正确?解决方法都在这里
120 0
RxJava 异常时堆栈显示不正确?解决方法都在这里
【Linux】直接打印堆栈调试信息
【Linux】直接打印堆栈调试信息
【Linux】直接打印堆栈调试信息
|
C++ API 数据建模
Windbg查看调用堆栈(k*)
https://www.52pojie.cn/thread-664189-1-1.html       无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈。
1785 0