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

背景

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

CrashRpt工具简单介绍

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

CrashRpt控制台demo测试程序

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

#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <assert.h>
#include <process.h>
#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\n"), buff); // and output it to the screen
        return FALSE;
    }

    printf("Press Enter to simulate a null pointer exception or any other key to exit...\n");
    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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值