背景

在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 headerLPVOID lpvState = NULL; // Not used, deprecatedint main(int argc, char* argv[])
{argc; // this is to avoid C4100 unreferenced formal parameter warningargv; // this is to avoid C4100 unreferenced formal parameter warning// Install crash reportingCR_INSTALL_INFO info;memset(&info, 0, sizeof(CR_INSTALL_INFO));info.cb = sizeof(CR_INSTALL_INFO);             // Size of the structureinfo.pszAppName = _T("CrashRpt Console Test"); // App nameinfo.pszAppVersion = _T("1.0.0");              // App versioninfo.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 handlersint nInstResult = crInstall(&info);            assert(nInstResult==0);// Check resultif(nInstResult!=0){TCHAR buff[256];crGetLastErrorMsg(buff, 256); // Get last error_tprintf(_T("%s\n"), buff); // and output it to the screenreturn 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_FUNCSUninstall(lpvState); // Uninstall exception handlers
#elseint nUninstRes = crUninstall(); // Uninstall exception handlersassert(nUninstRes==0);nUninstRes;
#endif //TEST_DEPRECATED_FUNCS// Exitreturn 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

捕获Windows C/C++程序异常奔溃工具CrashRpt相关推荐

  1. 「视频版」当线程池溢出之后,程序会奔溃吗?面试突击 007 期

    哈喽,大家好,我是老王,欢迎来到第 7 期的 Java 面试突击. 本文的面试题是,当线程池的任务溢出之后,程序会奔溃吗? 这个问题问的是关于线程池的任务数超过线程池的承载能力之后,会出现什么情况? ...

  2. 程序Crash(奔溃)记录和分析工具——Crashlytics

    摘自:http://www.infoq.com/cn/articles/crashlytics-crash-statistics-tools 简介 Crashlytic 成立于2011年,是专门为移动 ...

  3. Windows切换同一个程序窗口的小工具

    Mac上通常我们可以cmd+`在不同窗口之间进行切换,但是windows上默认不支持这种切换.有时我们开2个pdf文档,需要快速切换时,这两个文档很可能在alt+tab列表中不是相邻的,此时有快速切换 ...

  4. 对Windows桌面应用程序进行UI自动化测试

    所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种:VS自带的CodedUI ...

  5. python 桌面程序自动化测试_对Windows桌面应用程序进行UI自动化测试

    题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...

  6. Windows 平台Qt 程序发布

    Windows 平台Qt 程序发布 使用 windeployqt 工具查找依赖库 打包程序 Enigma Virtual Box 生成单执行文件 Inno Setup 打包 资源 Qt Creator ...

  7. C#【自动化测试】对Windows桌面应用程序进行UI自动化测试

    文章目录 1.文章一: 题记 UI自动化测试 参考 2.文章二: 3.重要资源[实例]: 1)已验证可用[非常好的例子,便于理解] 关键代码 2)未验证 1.文章一: 题记 本文简述如何利用appiu ...

  8. Windows程序奔溃后,禁止弹出“停止工作”对话框

    在Win7及以后的系统中,如果一个程序发生了奔溃,系统会弹出一个"XX已停止工作"的对话框,如果不去这个窗口上点击"关闭程序",那么这个窗口会一直存在,最为关键 ...

  9. Android之网络请求通过协程+okhttp的没有做网络异常处理导致程序奔溃问题

    1 问题 app里面的网络请求是通过协程+okhttp来实现的,但是没有做网络异常处理(域名无法解析.502错误等等一系列),导致程序奔溃 2 尝试 因为app基本上做好了,外面有大几十个地方调用,然 ...

最新文章

  1. 深度学习最常用的10个激活函数!(数学原理+优缺点)
  2. 如何看待Spring下单例模式与线程安全的矛盾
  3. Use the Shapes window to organize and find shapes
  4. using语句之-释放资源和异常处理
  5. 打开AzureRay园子的大门,欢迎大家串门哟~
  6. qDebug格式化输出类型
  7. pip指定源安装_几种python安装简单方法
  8. c语言的时间函数的介绍,c语言中时间函数介绍
  9. python定义变量类型_一、python基础之数据类型与变量
  10. Arcpy 实现NDVI最大值合成/平均值合成
  11. wacom数位板怎么调压感_wacom手绘板_wacom手绘板的钢笔压力怎么设置?
  12. 为什么你不能体面地做自己
  13. 数据结构之B树、B+树、B*树
  14. 4分用计算机算,4分制绩点换算(4分制绩点计算器)
  15. PS怎么快速把多个图层形状以中心点缩放
  16. 衣服裤子染色了怎么办
  17. 设计原则:里式替换原则(LSP)
  18. Graphql中我们应该用什么姿势来实现Resolver?
  19. AMBA总线协议(三)——一文看懂AHB总线所有协议总结(AHB2 AHB-Lite AHB5 )
  20. BIM技术在住宅园区物业管理中的应用及其优势

热门文章

  1. MATLAB计算并显示h的64×64点的频率响应
  2. 如何让公司变得更美好
  3. python 标量_python – 什么是numpy中的“标量”?
  4. SGame 简单客户端
  5. Otsu Thresholding
  6. 超市进销存系统管理源码
  7. unity运行之自动暂停——作死
  8. 22021年高考成绩查询时间,来了!21省公布高考分数线
  9. 辽宁移动梦网短信新增业务申报流程
  10. darknet识别车辆案例