linux c/c++ 程序崩潰時打印調用棧

本文章是在總結前人的帖子後實現的,經過驗證是可以使用的。

但是在個別信號下,還是不能詳細的打印有效信息。


void dump(void)
{
        char szLog[MAX_LOG_LEN] = {0};
        int j, nptrs;
        const int BACKTRACE_SIZE = 16; 
        void *buffer[BACKTRACE_SIZE];
        char **strings;


        nptrs = backtrace(buffer, BACKTRACE_SIZE);


        snprintf(szLog, MAX_LOG_LEN, "backtrace() returned %d addresses", nptrs);
        CLogError(szLog);
        strings = backtrace_symbols(buffer, nptrs);
        if (strings == NULL) {
                perror("backtrace_symbols");
                exit(EXIT_FAILURE);
        }   


        for (j = 0; j < nptrs; j++) 
        {   
                snprintf(szLog, MAX_LOG_LEN, "  [%02d] %s", j, strings[j]);
                CLogError(szLog);
        }   
                                                                                                                                                                                                                                                             


        free(strings);
        char buff[128] = { 0x00 };
        snprintf(buff, 128, "cat /proc/%d/maps", getpid());
        CLogError(buff);
        system((const char*)buff);
}


void signal_handler(int signo)
{
        char szLog[MAX_LOG_LEN] = {0};
        snprintf(szLog, MAX_LOG_LEN, "\n=========>>>catch signal %d <<<=========\n", signo);
        CLogError(szLog);


        CLogError("Dump stack start...\n");
        dump();
        CLogError("Dump stack end...\n");


        signal(signo, SIG_DFL);
        raise(signo);

}

在主函數終註冊信號回調函數

        signal(SIGSEGV, signal_handler);

        signal(SIGABRT, signal_handler);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章