崩溃系统检测利器

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

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.exe崩溃系统检测利器_第1张图片

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("[email protected]"));
	// 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解压之后:
崩溃系统检测利器_第2张图片
将crashdump.dmp文件拖到VS中,出现如下显示,点击本机调试
崩溃系统检测利器_第3张图片
可定位到错误代码
崩溃系统检测利器_第4张图片

你可能感兴趣的:(C++技术,c++,集成测试,visualstudio)