使用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这样最快
345 0
|
7月前
|
Linux C++
【代码片段】Linux C++打印当前函数调用堆栈
【代码片段】Linux C++打印当前函数调用堆栈
216 0
|
存储 API C++
dump系列(2)C++程序异常或内存错误,导致闪退的解决办法:分析dump文件
dump系列(2)C++程序异常或内存错误,导致闪退的解决办法:分析dump文件
1818 0
特殊堆栈
数据结构栈的使用
|
C++ API 数据建模
Windbg查看调用堆栈(k*)
https://www.52pojie.cn/thread-664189-1-1.html       无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈。
1890 0
|
Linux C语言
函数堆栈,共享库,打印出被调用函数【笔记】
函数堆栈,共享库,打印出被调用函数, 此文转自Linux man手册,仅做学习笔记使用 DL_ITERATE_PHDR(3) Linux Programmer's Manual ...
878 0
下一篇
DataWorks