当前位置:   article > 正文

捕获Windows C/C++程序异常奔溃工具CrashRpt_windows 第三方库捕获崩溃

windows 第三方库捕获崩溃

背景

在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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

运行程序后,程序所在目录会生成名字为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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/245767
推荐阅读
相关标签
  

闽ICP备14008679号