当前位置: 首页 > >

捕获Windows C/C++程序异常奔溃工具CrashRpt

发布时间:

背景

在Windows环境下做C/C++程序开发有段时间了,经常遇到程序奔溃时缺无法捕获,经同事推荐,知道了CrashRpt这个捕获C/C++程序异常的工具,让我省去了通过增加打印调试去查询程序异常的繁琐方式。下面记录下使用这个工具的一些方法。


CrashRpt工具简单介绍

CrashRpt是一个功能很强大的错误报告生成、发送以及分析工具,我是在Windows下使用VS2017开发C++项目使用这个工具的,把这个工具作为第三方库引入到我的项目中。使用方式和其他引用第三方库的方式是一样的,由于我使用的比较简单,就简单介绍我是如何用的。


CrashRpt控制台demo测试程序

为了测试这个工具,我用一个VS控制台的demo做测试,直接贴源码。


#include
#include
#include
#include
#include
#include "CrashRpt.h" // Include CrashRpt header

LPVOID lpvState = NULL; // Not used, deprecated

int main(int argc, char* argv[])
{
argc; // this is to avoid C4100 unreferenced formal parameter warning
argv; // this is to avoid C4100 unreferenced formal parameter warning

// Install crash reporting

CR_INSTALL_INFO info;
memset(&info, 0, sizeof(CR_INSTALL_INFO));
info.cb = sizeof(CR_INSTALL_INFO); // Size of the structure
info.pszAppName = _T("CrashRpt Console Test"); // App name
info.pszAppVersion = _T("1.0.0"); // App version
info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS;
info.dwFlags |= CR_INST_DONT_SEND_REPORT;
info.pszErrorReportSaveDir = TEXT("./errlog");
//info.pszEmailSubject = _T("CrashRpt Console Test 1.0.0 Error Report"); // Email subject
//info.pszEmailTo = _T("test@hotmail.com"); // Email recipient address

// Install crash handlers
int nInstResult = crInstall(&info);
assert(nInstResult==0);

// Check result
if(nInstResult!=0)
{
TCHAR buff[256];
crGetLastErrorMsg(buff, 256); // Get last error
_tprintf(_T("%s
"), buff); // and output it to the screen
return FALSE;
}

printf("Press Enter to simulate a null pointer exception or any other key to exit...
");
int n = _getch();
if(n==13)
{
int *p = NULL;
*p = 13; // Access violation
}

#ifdef TEST_DEPRECATED_FUNCS
Uninstall(lpvState); // Uninstall exception handlers
#else
int nUninstRes = crUninstall(); // Uninstall exception handlers
assert(nUninstRes==0);
nUninstRes;
#endif //TEST_DEPRECATED_FUNCS

// Exit
return 0;
}

运行程序后,程序所在目录会生成名字为errlog文件夹,是用来后续程序发送异常的时候存成dump文件的目录。
demo中模拟一处导致内存越界的代码:“*p = 13;”,当程序走到这步是整个程序异常退出,errlog文件夹下面会生成crashdump.dmp和crashrpt.xml。

我们只需关心crashdump.dmp文件、ConsoleDemo.exe文件、ConsoleDemo.pdb文件,把这三个文件放在一次,用VS2017打开dump文件,如下:

然后点击使用仅限本机进行调试,会开始进入到调试界面,如下:


可以看出,直接定位到了我刚刚设置内存越界的那个代码段。
注:
使用这种方式,必须保证ConsoleDemo.exe和ConsoleDemo.pdb这两个程序存在的情况下,不然会出现找不到这两个文件的情况,就分析不了异常了。
如果没有PDB文件,那就只能看到错误发生的汇编地址,以及各堆栈地址,无法查看函数名,变量值等信息,如果有PDB文件就能看的错误的位置,调用函数堆栈,各种变量等等。


在项目中使用

运用在项目中,就跟引用第三方库是一样的,引用下include和lib,并且需要把以下三个文件程序运行的目录,否则运行会出错。


下载

测试项目和库文件下载链接:https://download.csdn.net/download/qq_22633333/12347769



友情链接: