windows程序异常产生dump文件(两种注册表和写代码三种方式实现)

16 篇文章 1 订阅
7 篇文章 0 订阅

1.注册表(方式1)

添加注册表程序崩溃时自动生成dump
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

在这里插入图片描述

Auto:1开始  0停止
Debugger:"D:\Windows Kits\10\Debuggers\x64\windbg.exe"是调用产生dump的程序可以用windbg
			也可以用vs自带的调试工具C:\Windows\System32\vsjitdebugger.exe
				".dump -ma D:\dumpWindbg\CrashDump.dmp"这句是使用windbg产生dmp的命令
图中数据("D:\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld –c ".dump -ma D:\dumpWindbg\CrashDump.dmp" -e %ld –g)

(默认值:"D:\software\windbg\install\windbg.exe" -p %ld -e %ld)---直接启动WinDbg调试

UserDebuggerHotKey:

2.注册表(方式2)

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
在这里插入图片描述

DumpCount:文件数量
DumpFolder:存储位置
DumpType:dmp文件类型 0:custom 1:mini 2:full

这里有必要做一下方式1和方式2的说明:
通过实际测试(win10环境)方式1和方式2互斥:也就是说两个方式同存时只有一个生效
关闭方式1只需将Auto数值改为0,关闭方式2只需将数量DumpCount改为0
方式1和2都不需要写代码,比较方便。
方式1文件名自己用windbg命令(我还不熟悉,只写了这个,后续知道了增加一个可变的名字)
方式2文件名会以程序名加进程号出现(应用程序名称全称.进程号.dmp)

3.通过代码设置异常回调函数(方式3)

测试工具vs2008+windbg

dump类:myDump.h

/*
	$file:		myDump.h
	$date:		2020年9月7日
	$author:	hehl
	$describe:	dump文件产生测试程序
	$other:
*/
#ifndef __MYDUMP_H__ 
#define __MYDUMP_H__
#include <iostream>
#include <Windows.h>
#include <string>
#include <atltime.h>
#include <DbgHelp.h>
using namespace std;

#pragma comment(lib, "Dbghelp.lib")	// 链接MiniDumpWriteDump该函数

class MyDump
{
public:
	// 设置异常函数
	static void m_SetExceptionFilter(unsigned int nFileSize, unsigned int nKeepDay);

private:
	// 异常处理回调函数
	static long m_MyExcptionCallFunc(EXCEPTION_POINTERS *pExcep);
private:
};


#endif

dump类实现:myDump.cpp

/*
	$file:		myDump.cpp
	$date:		2020年9月7日
	$author:	hehl
	$describe:	dump文件产生测试程序
	$other:
*/

#include "myDump.h"

// 设置异常函数
void MyDump::m_SetExceptionFilter(unsigned int nFileSize, unsigned int nKeepDay)
{
	LPTOP_LEVEL_EXCEPTION_FILTER ret = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)m_MyExcptionCallFunc);
	cout << "ret:" << ret << endl;
}

// 异常处理回调函数
long MyDump::m_MyExcptionCallFunc(EXCEPTION_POINTERS* pExcep)
{
	cout << "m_MyExcptionCallFunc callBack" << endl;

	// 创建dump文件
	HANDLE hDumpFile = CreateFile(".\\test.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, \
		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(hDumpFile == INVALID_HANDLE_VALUE)
	{
		cout << "CreateFile INVALID_HANDLE_VALUE ErrorNumber:" << GetLastError() << endl;

		int a;
		cin >> a;
		return EXCEPTION_EXECUTE_HANDLER;
	}

	// Dump信息
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ExceptionPointers = pExcep;
	dumpInfo.ThreadId = GetCurrentThreadId();
	dumpInfo.ClientPointers = TRUE;

	MINIDUMP_CALLBACK_INFORMATION mci;
	mci.CallbackRoutine = NULL;
	mci.CallbackParam = NULL;

	// 写入Dump文件内容
	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, &mci);

	CloseHandle(hDumpFile);

	return 0;
}

主函数头文件:main.h

/*
	$file:		main.h
	$date:		2020年9月4日
	$author:	hehl
	$describe:	dump文件产生测试程序
	$other:
*/

#ifndef __MAIN_H__
#define __MAIN_H__

#include <iostream>
#include <Windows.h>
#include "myDump.h"
using namespace std;


#endif

主函数:main.cpp

/*
	$file:		main.cpp
	$date:		2020年9月4日
	$author:	hehl
	$describe:	dump文件产生测试程序
	$other:
*/

#include "main.h"

void fun(char *me)
{
	me[0] = 'a';
}

// 主函数入口
int main(int argc, char **argv)
{
	MyDump dum;
	// 设置处理异常函数
	dum.m_SetExceptionFilter(0, 0);

	// 产生异常
	fun(NULL);


	int a;
	cin >> a;
	return 0;
}

Windows程序崩溃时,操作系统会生成一个崩溃转储(Dump文件,用于帮助开发人员诊断和调试程序故障。这个Dump文件记录了程序崩溃时的内存状态,包括堆栈信息、寄存器状态、变量值等关键数据。 生成Dump文件的方法有多种,例如: 1. 使用Windows上自带的任务管理器。打开任务管理器,在“进程”选项卡中找到崩溃的程序进程,右键点击选择“创建转储文件”即可生成Dump文件。 2. 使用Windows上自带的Dr.Watson工具(仅适用于旧版本)。Dr.Watson是一种活动监视工具,它会在程序崩溃时自动记录信息,生成.DMP文件。可以在Windows注册表中启用Dr.Watson功能。 3. 使用Windows Debugging Tools。这是一套由微软提供的调试工具,其中包括了生成Dump文件的命令行工具Dumpchk、Msdia.dll等。使用这些工具可以对Dump文件进行详细的调试和分析。 一旦生成了Dump文件,开发人员可以使用各种调试工具来分析这个文件,以寻找程序崩溃的原因。比如,可以使用Visual Studio自带的调试器或WinDbg调试器来打开Dump文件,并逐步调试程序,查看导致崩溃的代码行。 Dump文件对于故障排除非常有用,可以帮助开发人员定位和解决程序中的错误。通过分析Dump文件,我们可以获得崩溃时的内存状态,从而找到导致崩溃的具体代码,修复问题,提升软件的稳定性和可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值