由于 C++ 没有标准的崩溃报告系统,而且未处理的异常都会导致程序崩溃。
最后 *** 作系统会d出丑丑的“已停止工作”对话框,也不能存下什么有用的信息。
为了解决这个问题,我们一般都会自写代码处理崩溃信息,或像我一样采取第三方库或平台。
通常在程序崩溃时,我们要保存崩溃时程序的运行信息,如导出包含运行栈的 Mini Dump、保存最后一瞬间的截图等,最后如果可以的话将收集的信息传输到自己的服务器上。
如果自写代码实现这些功能,工作量会比较大;对于第三方,根据我搜索的资料,实现了类似功能的第三方平台有 BugSplat (付费服务),第三方库有 CrashRpt 和 BugTrap。
bugTrap git 地址 https://github.com/bchavez/BugTrap
BugTrap在C++应用程序或者SDK崩溃的之后会生成一个崩溃信息的压缩包,里面有三个文件。
- xml文件 应用程序的调用堆栈信息。
- 图片文件 崩溃时的整个桌面的场景截图
- dump文件 崩溃之后的内存dump文件,可以通过VS还原调试现场
编译bugTrap代码只对windows有效,C++的编译只要编译BugTrap,其报告程序CrashExplorer内部依赖了Boost库,编译相对比较麻烦。
BugTrap有客户端SDK和服务端程序(服务端程序由C#编写,用于收集客户端的崩溃报告),同时发布程序之后需要保留对应的源代码和PDB文件,否则通过dump文件无法还原调试现场。
基本上是一次性通过(vs2017),在客户端使用bugTrapU-x64.dll ,服务端生成BugTrapServer.exe
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:发送报告之前d出问题描述对话框,让用户输入错误描述信息
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解压之后:
将crashdump.dmp文件拖到VS中,出现如下显示,点击本机调试
可定位到错误代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)