崩溃系统检测利器

本文介绍了C++中处理程序崩溃的方法,由于C++标准库缺乏崩溃报告系统,通常需要自定义代码或使用第三方库来收集崩溃信息。BugTrap是一个用于Windows平台的第三方库,它能在程序崩溃时生成包含堆栈信息、截图和内存dump的压缩包。通过设置各种标志,可以定制崩溃报告的内容并将其发送到服务器。文章详细阐述了BugTrap的编译和使用步骤,并提供了崩溃捕获的示例代码。
摘要由CSDN通过智能技术生成

由于 C++ 没有标准的崩溃报告系统,而且未处理的异常都会导致程序崩溃。最后操作系统会弹出丑丑的“已停止工作”对话框,也不能存下什么有用的信息。为了解决这个问题,我们一般都会自写代码处理崩溃信息,或像我一样采取第三方库或平台。
通常在程序崩溃时,我们要保存崩溃时程序的运行信息,如导出包含运行栈的 Mini Dump、保存最后一瞬间的截图等,最后如果可以的话将收集的信息传输到自己的服务器上。如果自写代码实现这些功能,工作量会比较大;对于第三方,根据我搜索的资料,实现了类似功能的第三方平台有 BugSplat (付费服务),第三方库有 CrashRptBugTrap

BugTrap

bugTrap git 地址 https://github.com/bchavez/BugTrap

BugTrap在C++应用程序或者SDK崩溃的之后会生成一个崩溃信息的压缩包,里面有三个文件。

  1. xml文件 应用程序的调用堆栈信息。
  2. 图片文件 崩溃时的整个桌面的场景截图
  3. dump文件 崩溃之后的内存dump文件,可以通过VS还原调试现场

bugTrap代码只对windows有效,C++的编译只要编译BugTrap,其报告程序CrashExplorer内部依赖了Boost库,编译相对比较麻烦。BugTrap有客户端SDK和服务端程序(服务端程序由C#编写,用于收集客户端的崩溃报告),同时发布程序之后需要保留对应的源代码和PDB文件,否则通过dump文件无法还原调试现场。

编译

基本上是一次性通过(vs2017),在客户端使用bugTrapU-x64.dll ,服务端生成BugTrapServer.exeimage.png

BugTrap的使用

由于该库的接口比较少,也为了在某些情况下可以删除该库的依赖,也可以使用动态链接的方式调用。
需要注意的是该崩溃系统只能在非调试状态下使用。

static void SetupExceptionHandler()
{
	LOG_TRACER();
	
	BT_InstallSehFilter();
 
	// 配置信息
    BT_SetAppName(_T("bug_info"));
	BT_SetDialogMessage(BTDM_INTRO1, _T("对不起,程序已经崩溃"));
	BT_SetDialogMessage(BTDM_INTRO2, _T("本程序会尝试收集仅与此次异常崩溃相关的数据,请将此报告发送给我们以便帮助我们开发体验更好的产品,给您造成的不便之处敬请谅解!"));
    //发送邮件;
    BT_SetSupportEMail(_T("futures_bugreport@tsingfun.com"));
	// BTF_DETAILEDMODE:崩溃时记录dump文件,不设置的话报告中没有dump文件
	// BTF_ATTACHREPORT:点”发送到“可以通过带附件的邮件发送报告
	// BTF_SCREENCAPTURE:错误报告中附带一张崩溃时屏幕截图
 
	// BTF_EDITMAIL:点”发送到“可以发送邮件到指定地址(没有附件,不可更改目的地址)
	// BTF_LISTPROCESSES:列出崩溃时所有的进程信息(速度较慢)
	// BTF_SHOWADVANCEDUI:崩溃后默认显示详细对话框(不设置的话,先显示简单对话框,有查看详细的按钮)	
	// BTF_DESCRIBEERROR:发送报告之前弹出问题描述对话框,让用户输入错误描述信息
	BT_SetFlags(BTF_DETAILEDMODE | BTF_ATTACHREPORT | BTF_SCREENCAPTURE);
    //服务器地址;
    BT_SetSupportServer(_T("//127.0.0.1"), 9999);
    
    

}

//崩溃捕获异常函数;
LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionPointers)
{
	//编写崩溃时需要处理的自定义操作;
 
	SetupExceptionHandler();
	return EXCEPTION_CONTINUE_EXECUTION;
}

void main()
{
    //开启程序崩溃通知;
    
   SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    
    //崩溃测试用例
    int*p=NULL;
    *p=3;
}

生成的zip解压之后:
image.png
将crashdump.dmp文件拖到VS中,出现如下显示,点击本机调试
image.png
可定位到错误代码
image.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

揽月凡尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值