linux C++下捕获崩溃日志

#include <stdio.h>#include <signal.h>#include <time.h>#include <execinfo.h>#include <string>const int MAX_STACK_FRAMES = 128;
void sig_crash(int sig)
{
    FILE* fd;
    struct stat buf;
    stat("./crash.log", &buf);
    if(buf.st_size > 10*1000*1000){ // 超过10兆则清空内容
        fd = fopen("./crash.log", "w");
    } else {
        fd = fopen("./crash.log", "at");
    }

    if (NULL == fd)
    {
        exit(0);
    }
    try
    {
        char szLine[512] = {0, };
        time_t t = time(NULL);
        tm* now = localtime(&t);
        int nLen1 = sprintf(szLine,
                            "#########################################################\n[%04d-%02d-%02d %02d:%02d:%02d][crash signal number:%d]\n",
                            now->tm_year + 1900, 
                            now->tm_mon + 1, 
                            now->tm_mday, 
                            now->tm_hour, 
                            now->tm_min, 
                            now->tm_sec, 
                            sig);
        fwrite(szLine, 1, strlen(szLine), fd);
#ifdef __linux
        void* array[MAX_STACK_FRAMES];
        size_t size = 0;
        char** strings = NULL;
        size_t i, j;
        signal(sig, SIG_DFL);
        size = backtrace(array, MAX_STACK_FRAMES);
        strings = (char**)backtrace_symbols(array, size);
        //fprintf(stderr, "oncrash;\n");
        for (i = 0; i < size; ++i)
        {
            char szLine[512] = {0, };
            sprintf(szLine, "%d %s\n", i, strings[i]);
            fwrite(szLine, 1, strlen(szLine), fd);

            std::string symbol(strings[i]);
            size_t pos1 = symbol.find_first_of("[");
            size_t pos2 = symbol.find_last_of("]");
            std::string address = symbol.substr(pos1 + 1, pos2 - pos1 -1);
            char cmd[128] = {0, };
            sprintf(cmd, "addr2line -e test %s", address.c_str()); // test为应用程序名称,需要改为用户自己的应用程序名
            FILE *fPipe = popen(cmd, "r");
            if(fPipe != NULL){
                char buff[1024];
                memset(buff, 0, sizeof(buff));
                char* ret = fgets(buff, sizeof(buff), fPipe);
                pclose(fPipe);
                fwrite(ret, 1, strlen(ret), fd);
            }
        }
       free(strings);
#endif // __linux
   }
   catch (...)
   {
       //
   }
   fflush(fd);
   fclose(fd);
   fd = NULL;
   exit(0);
}int main(){   // 捕捉崩溃日志   signal(SIGSEGV, sig_crash);

signal(SIGABRT, sig_crash);

int* a = NULL;

a[10] = 0; // crash

return 0;}

说明:上面的程序名称为test,使用时需要自行更改成自己的程序名。
原文链接: https://www.cnblogs.com/ziyu-trip/p/7099596.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/256124

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午9:48
下一篇 2023年2月14日 上午9:50

相关推荐