博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux C++下捕获崩溃日志
阅读量:5108 次
发布时间:2019-06-13

本文共 2641 字,大约阅读时间需要 8 分钟。

#include 
#include
#include
#include
#include
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

你可能感兴趣的文章
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
C++函数基础知识
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>
报表服务框架:WEB前端UI
查看>>
java自学基础、项目实战网站推荐
查看>>
软件包的使用
查看>>
linux中启动与终止lnmp的脚本
查看>>
gdb中信号的处理[转]
查看>>
学习Javascript闭包(Closure)
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
Jzoj4757 树上摩托
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>