C++开发的应用程序崩溃时生成Dump文件分析(附Demo)

1. Dump文件介绍

  Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 WinDbg , VisualStudio打开;


  当我们的程序发布出去之后 , 在客户机上是无法跟踪自己代码的 BUG 的 , 所以 Dump 文件对于我们来说特别有用 ; 我们可以通过 .dmp 文件把出现 BUG 的情况再现 , 然后再现客户环境 (包括堆栈调用等情况) , 设置源码调试路径 , 可以找到出现 BUG 的语句;

2. C++例子

用VS新建一个控制台项目DumpTest后,将如下代码拷贝到DumpTest.cpp

// DumpTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Windows.h"
#include <direct.h>
#include <string>
using namespace std;

#include "DbgHelp.h"
#pragma comment(lib, ".\\Lib\\Dbghelp.lib")

std::string current_working_directory()
{
	char buff[250];
	_getcwd(buff, 250); 
	std::string current_working_directory(buff);
	return current_working_directory;
}


LONG WINAPI ExpFilter(struct _EXCEPTION_POINTERS *pExpInfo)
{
	string sAppDirectory = ::current_working_directory();
	string sDumpDirectory;
	SYSTEMTIME tm;
	GetLocalTime(&tm);

	char pszText[512] = {0};
	sprintf_s(pszText, "\\_Err%d%02d%02d%02d%02d%02d_.dmp", tm.wYear, 
		tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond);

	sDumpDirectory = sAppDirectory + "\\Crash";
	CreateDirectory(sDumpDirectory.c_str(), NULL);

	string sDumpFile = sDumpDirectory + string(pszText);	
	HANDLE hFile = CreateFile(sDumpFile.c_str(), 
		GENERIC_WRITE, 
		0, 
		NULL, 
		CREATE_ALWAYS, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL);

	if(INVALID_HANDLE_VALUE != hFile)
	{
		MINIDUMP_EXCEPTION_INFORMATION einfo;
		einfo.ThreadId			= GetCurrentThreadId();
		einfo.ExceptionPointers	= pExpInfo;
		einfo.ClientPointers	= FALSE;

		MiniDumpWriteDump(
			GetCurrentProcess(), 
			GetCurrentProcessId(), 
			hFile, 
			MiniDumpNormal, 
			&einfo, 
			NULL, 
			NULL);

		CloseHandle(hFile);
	}

	MessageBox(NULL, "软件即将停止工作,请将运行目录下Crash文件夹下的dmp文件发送给我们作进一步分析,谢谢。",
		"崩溃了", MB_OK|MB_ICONERROR);

	return EXCEPTION_EXECUTE_HANDLER;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//crash后生成dmp文件机制
	::SetUnhandledExceptionFilter(ExpFilter);

	char *p = NULL;
	*p = 1;

	return 0;
}

3. C++例子调试Dump文件

上述程序Release下编译后(为什么要Release呢,因为实际发布版本都是Release版本),会生成DumpTest.exe,点击该程序,会在Crash目录下产生一个dump文件比如:_Err20220630163217_.dmp

 

用VS打开该文件,并且设置路径(路径为刚才编译生成.pdb文件的路径):

 

设置完后点击“使用 仅限本机 进行调试”,效果如下:

上述代码在VS2010和VC6.0验证过,如需下载,请点击如下链接:

VS2010C++程序生成Dump文件例子-C++文档类资源-CSDN文库

VC6.0C++程序生成Dump文件例子-C++文档类资源-CSDN文库

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值