• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

linuxC++下捕获崩溃日志

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
#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,使用时需要自行更改成自己的程序名。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#如何设置richTextBoxr的边距发布时间:2022-07-13
下一篇:
C#-*.dllvs*.lib(动态链接库vs静态链接库)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap