C++/Qt/Qml程序使用Camel_CrashReport捕获异常崩溃并定位问题代码行

来源:互联网 发布:python 访问局域网 编辑:程序博客网 时间:2024/06/05 22:44

组件介绍:


Camel_CrashReport:

程序异常崩溃时生成Dump文件和日志, 非开源 属于CamelSoft系列基础开发组件.

Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

支持平台:Windows



CamelCrashReportTest: 崩溃报告开发组件测试程序

Camel_CrashReport的调用非常简单, 提供了三个接口:

int Cls_funCrashReportInitialize();//初始化
int Cls_funCrashReportTerminate();//销毁
int Cls_funGetException(PEXCEPTION_POINTERS pExceptPtrs, WORD srtParam);//捕获崩溃

首先引用接口文件和定义函数指针, 这是加载dll动态库的过程

//Camel_CrashReport函数指针#include <Windows.h>#include "../../include/CamelCrashReportDll/Camel_CrashReport.h"HINSTANCE hCrashReport;lpCls_funCrashReportInitialize funInitialize;lpCls_funCrashReportTerminate funTerminate;lpCls_funGetException funGetException;

然后初始化组件:

    //初始化Camel_CrashReport    hCrashReport = LoadLibrary(L"Camel_CrashReport.dll");    funInitialize = NULL;    funGetException = NULL;    funTerminate = NULL;    if (hCrashReport != NULL)    {        funInitialize = (lpCls_funCrashReportInitialize)GetProcAddress(                            hCrashReport, "Cls_funCrashReportInitialize");        funGetException = (lpCls_funGetException)GetProcAddress(                              hCrashReport, "Cls_funGetException");        funTerminate = (lpCls_funCrashReportTerminate)GetProcAddress(                           hCrashReport, "Cls_funCrashReportTerminate");        funInitialize();    }

使用__try __except 包裹主函数

    __try    {#endif    init(argc, argv);#ifdef WIN32    }    __except (funGetException(                  GetExceptionInformation(), clsCrashReport_intParam_Normal))    {        ;    }

程序执行结束时卸载组件

    if (hCrashReport != NULL)    {        funTerminate();        funInitialize = NULL;        funGetException = NULL;        funTerminate = NULL;        FreeLibrary(hCrashReport);        hCrashReport = NULL;    }

就这三步就ok了
然后程序运行时, 执行异常崩溃的代码 就会触发写dump文件和日志的过程

    //运行异常代码    char* chr = NULL;    memset(chr, 0, 10);

这里写图片描述

生成的dump文件可以直接用VS打开并调试

异常崩溃时生成的dump文件, 在VisualStudio下调试直接定位到代码行, 当然也可以使用WinDbg调试

生成的txt日志文件包含很多有用的信息
这里写图片描述

注意: 如果是Qt/Qml工程要正确的定位到崩溃代码行, 工程需要使用VisualStudio编译
参看 Qt/Qml工程转VS工程

需要完整代码请访问Camel_FileManagerCExamples

阅读全文
0 0
原创粉丝点击