admin管理员组文章数量:1631139
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文件(两种注册表和写代码三种方式实现) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729087463a1185783.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论