Minidump方式保留程序崩溃现场

news/2024/11/24 13:59:37/

介绍部分转自https://www.cnblogs.com/lisuyun/p/5245609.html

程序部分为原创。

 

Minidump方式保留程序崩溃现场

在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了。因为release版本来就少了很多调试信息,更何况一般都是发布出去由用户使用,crash的现场很难保留和重现。目前有一些方法可以解决:崩溃地址 + MAP文件;MAP文件;SetUnhandledExceptionFilter + Minidump。本文重点关注SetUnhandledExceptionFilter + Minidump方式。

一、Minidump文件生成

  1、Minidump概念

    minidump(小存储器转储)可以理解为一个dump文件,里面记录了能够帮助调试crash的最小有用信息。实际上,如果你在系统属性 -> 高级 -> 启动和故障恢复 -> 设置 -> 写入调试信息中选择“小内存转储(64 KB)”的话,当系统意外停止时都会在C:\Windows\Minidump\路径下生成一个.dmp后缀的文件,这个文件就是minidump文件,只不过这个是内核态的minidump。

   我们要生成的是用户态的minidump,文件中包含了程序运行的模块信息、线程信息、堆栈调用信息等。而且为了符合其mini的特性,dump文件是压缩过的。

2、生成minidump文件

通过drwtsn32、NTSD、CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。根据MiniDumpWriteDump接口,完全可以程序自动生成Dump文件。MiniDumpWriteDump是MS DbgHelp.dll中的一个API,用于导出当前运行程序的dump。

 

3、  自动生成Minidump文件

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

 因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。 

 

#include <DbgHelp.h>
#pragma comment(lib,"DbgHelp.lib")//main函数中调用SetUnhandledExceptionFilter
SetUnhandledExceptionFilter(DumpCallback);LONG WINAPI DumpCallback(_EXCEPTION_POINTERS* excp) {boost::mutex::scoped_lock lock(g_dump_mutex);CreateDump(excp);return EXCEPTION_EXECUTE_HANDLER;
}VOID CreateDump(struct _EXCEPTION_POINTERS *pExceptionPointers) {//收集信息CStringW strBuild;strBuild.Format(L"Build: %s %s", __DATE__, __TIME__);CStringW strError;WCHAR* szModuleName = L"my_module_name";strError.Format(L"%s %d , %d ,%d.", szModuleName, pExceptionPointers->ExceptionRecord->ExceptionCode, pExceptionPointers->ExceptionRecord->ExceptionFlags, pExceptionPointers->ExceptionRecord->ExceptionAddress);//生成 mini crash dumpBOOL bMiniDumpSuccessful;WCHAR* szPath = L"./";WCHAR szFileName[MAX_PATH];WCHAR* szAppName = L"DumpFile";WCHAR* szVersion = L"v1.0";DWORD dwBufferSize = MAX_PATH;HANDLE hDumpFile;SYSTEMTIME stLocalTime;MINIDUMP_EXCEPTION_INFORMATION ExpParam;GetLocalTime(&stLocalTime);//GetTempPathW(dwBufferSize, szPath);StringCchPrintfW(szFileName, MAX_PATH, L"%s%s", szPath, szAppName);CreateDirectoryW(szFileName, NULL);//std::wcout << szFileName;StringCchPrintfW(szFileName, MAX_PATH, L"%s%s//%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",szPath, szAppName, szVersion,stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,GetCurrentProcessId(), GetCurrentThreadId());hDumpFile = CreateFileW(szFileName, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);MINIDUMP_USER_STREAM UserStream[2];MINIDUMP_USER_STREAM_INFORMATION UserInfo;UserInfo.UserStreamCount = 1;UserInfo.UserStreamArray = UserStream;UserStream[0].Type = CommentStreamW;UserStream[0].BufferSize = strBuild.GetLength()*sizeof(WCHAR);UserStream[0].Buffer = strBuild.GetBuffer();UserStream[1].Type = CommentStreamW;UserStream[1].BufferSize = strError.GetLength()*sizeof(WCHAR);UserStream[1].Buffer = strError.GetBuffer();ExpParam.ThreadId = GetCurrentThreadId();ExpParam.ExceptionPointers = pExceptionPointers;ExpParam.ClientPointers = TRUE;MINIDUMP_TYPE MiniDumpWithDataSegs = (MINIDUMP_TYPE)(MiniDumpNormal| MiniDumpWithHandleData| MiniDumpWithUnloadedModules| MiniDumpWithIndirectlyReferencedMemory| MiniDumpScanMemory| MiniDumpWithProcessThreadData| MiniDumpWithThreadInfo);bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);return;
}

 

 

 

 

二、调试Minidump文件

  1. 双击minidump文件(*.dmp)。默认会启动VisualStudio。
  2. 菜单Tools/Options, Debugging/Symbols,增加PDB文件路径。注:如果minidump文件与pdb文件在同一目录,就不用设置这个了。
  3. 若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:http://msdl.microsoft.com/download/symbols
  4. 在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。 注:如果本地已存储过微软基础库的pdb,就直接按照此步操作设置本地路径,不必执行上一步操作了。
  5. 设置代码路径:刚打开的dmp工程,进入解决方案的属性。在这里输入源程序的代码路径。注:一定是sln所在的路径,而不是vcproj的路径!

                                            

          6. 按F5,debug吧。

 

 

 

 

 

 


http://www.ppmy.cn/news/574800.html

相关文章

MiniDump文件的生成(二)

在《MiniDump文件生成&#xff08;一&#xff09;》中简单的介绍了一下怎样在程序崩溃的时候生成供调试使用的DMP文件&#xff0c;本文将详细的介绍一下MINIDUMP_TYPE中的每一种类型以及针对每一种类型所生成的DMP文件中将包含哪些特定信息。 首先来看一下&#xff0c;Windows…

写入的dump文件为0kb (1、MiniDumpWriteDump 简单理解)

1、了解下MiniDumpWriteDump MiniDumpWriteDump (vs2008) MSDN ImageHlp.h 文件 // …… 4647-4657BOOL WINAPI MiniDumpWriteDump(IN HANDLE hProcess,IN DWORD ProcessId,IN HANDLE hFile,IN MINIDUMP_TYPE DumpType,IN CONST PMINIDUMP_EXCEPTION_INFORMATION Excepti…

处理minidump文件用到的“工具”的分享

前言 最近崩溃平台有BUG&#xff0c;native的崩溃堆栈解析不出来&#xff0c;只能自己线下人肉解堆栈了。本着能善用工具提高工作效果的习惯&#xff0c;最终收获了如下的zshe脚本&#xff08;方法&#xff09;用于后续的工作&#xff0c;借此笔记跟大家分享与交流&#xff0c…

简单分析minidump

转载自&#xff1a;http://91dengdeng.cn/2019/05/07/%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90minidump-1/ 简单分析minidump(1) 有了前几节的准备工作&#xff0c;我们的程序已经可以自动捕获异常了&#xff0c;那么我们开始通过windbg来分析dump解决实际问题。先从简单入手&am…

Minidump 文件分析工具

Minidump 文件分析工具 microsoft, 解决问题, 计算机, 操作系统, 存储器 许多人可能经常遇见计算机频繁重新启动的问题&#xff0c;总是难于解决问题&#xff0c;最后只能重新安装操作系统&#xff0e;我介绍的这篇文章应该能解决许多人这样的痛苦&#xff0e;   通常在荡机…

异常处理与MiniDump详解(4) MiniDump

异常处理与MiniDump详解(4) MiniDump write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一、 综述 总算讲到MiniDump了。 Dump有多有用我都无法尽数&#xff0c;基本上属于定位错误修复BUG的倚天剑。&#xff08;日志可以算是屠龙刀&#xff09;这…

操作系统——银行家算法的模拟与实现

一&#xff1a;实验题目 银行家算法的模拟与实现 二&#xff1a;实验目的 (1) 进一步了解进程的并发执行。 (2) 加强对进程死锁的理解&#xff0c;理解安全状态与不安全状态的概念。 (3) 掌握使用银行家算法避免死锁问题。 三、总体设计&#xff08;含背景知识或基本原…

亚马逊云科技数据库市场份额提升迅速,合作伙伴和开发者生态系统为其赋能

对比常规的基础设施上云和应用上云,企业对于数据上云一直保持最为慎重的态度。不过也不是一成不变的,Gartner前不久公布的一组数据显示,在2022年全球数据库管理系统的市场份额排名中,作为纯云厂商的亚马逊云科技,超越了老牌传统数据库厂商甲骨文和微软,首次位居第一。 降低企业…