捕获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 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相关推荐
- 「视频版」当线程池溢出之后,程序会奔溃吗?面试突击 007 期
哈喽,大家好,我是老王,欢迎来到第 7 期的 Java 面试突击. 本文的面试题是,当线程池的任务溢出之后,程序会奔溃吗? 这个问题问的是关于线程池的任务数超过线程池的承载能力之后,会出现什么情况? ...
- 程序Crash(奔溃)记录和分析工具——Crashlytics
摘自:http://www.infoq.com/cn/articles/crashlytics-crash-statistics-tools 简介 Crashlytic 成立于2011年,是专门为移动 ...
- Windows切换同一个程序窗口的小工具
Mac上通常我们可以cmd+`在不同窗口之间进行切换,但是windows上默认不支持这种切换.有时我们开2个pdf文档,需要快速切换时,这两个文档很可能在alt+tab列表中不是相邻的,此时有快速切换 ...
- 对Windows桌面应用程序进行UI自动化测试
所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种:VS自带的CodedUI ...
- python 桌面程序自动化测试_对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- Windows 平台Qt 程序发布
Windows 平台Qt 程序发布 使用 windeployqt 工具查找依赖库 打包程序 Enigma Virtual Box 生成单执行文件 Inno Setup 打包 资源 Qt Creator ...
- C#【自动化测试】对Windows桌面应用程序进行UI自动化测试
文章目录 1.文章一: 题记 UI自动化测试 参考 2.文章二: 3.重要资源[实例]: 1)已验证可用[非常好的例子,便于理解] 关键代码 2)未验证 1.文章一: 题记 本文简述如何利用appiu ...
- Windows程序奔溃后,禁止弹出“停止工作”对话框
在Win7及以后的系统中,如果一个程序发生了奔溃,系统会弹出一个"XX已停止工作"的对话框,如果不去这个窗口上点击"关闭程序",那么这个窗口会一直存在,最为关键 ...
- Android之网络请求通过协程+okhttp的没有做网络异常处理导致程序奔溃问题
1 问题 app里面的网络请求是通过协程+okhttp来实现的,但是没有做网络异常处理(域名无法解析.502错误等等一系列),导致程序奔溃 2 尝试 因为app基本上做好了,外面有大几十个地方调用,然 ...
最新文章
- 深度学习最常用的10个激活函数!(数学原理+优缺点)
- 如何看待Spring下单例模式与线程安全的矛盾
- Use the Shapes window to organize and find shapes
- using语句之-释放资源和异常处理
- 打开AzureRay园子的大门,欢迎大家串门哟~
- qDebug格式化输出类型
- pip指定源安装_几种python安装简单方法
- c语言的时间函数的介绍,c语言中时间函数介绍
- python定义变量类型_一、python基础之数据类型与变量
- Arcpy 实现NDVI最大值合成/平均值合成
- wacom数位板怎么调压感_wacom手绘板_wacom手绘板的钢笔压力怎么设置?
- 为什么你不能体面地做自己
- 数据结构之B树、B+树、B*树
- 4分用计算机算,4分制绩点换算(4分制绩点计算器)
- PS怎么快速把多个图层形状以中心点缩放
- 衣服裤子染色了怎么办
- 设计原则:里式替换原则(LSP)
- Graphql中我们应该用什么姿势来实现Resolver?
- AMBA总线协议(三)——一文看懂AHB总线所有协议总结(AHB2 AHB-Lite AHB5 )
- BIM技术在住宅园区物业管理中的应用及其优势