-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathwindbg.h
More file actions
101 lines (86 loc) · 2.97 KB
/
Copy pathwindbg.h
File metadata and controls
101 lines (86 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef WINDBG_H
#define WINDBG_H
#include <windows.h>
#include <QDateTime>
#include <QDir>
#include <dbghelp.h>
// 链接dbghelp库
#pragma comment(lib, "dbghelp.lib")
typedef BOOL(WINAPI *MINIDUMPWRITEDUMP)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
// 自定义异常处理函数
LONG WINAPI createMiniDump(EXCEPTION_POINTERS *exceptionPointers)
{
// 创建dump文件目录
QDir dumpDir(QDir::currentPath() + "/dumps");
if (!dumpDir.exists())
{
dumpDir.mkpath(".");
}
// 生成带时间戳的文件名
QString dumpFileName =
QString("%1/crash_%2.dmp")
.arg(dumpDir.absolutePath())
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss"));
// 创建文件
HANDLE hFile = CreateFile(dumpFileName.toStdWString().c_str(),
GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return EXCEPTION_CONTINUE_SEARCH;
}
// 加载dbghelp.dll
HMODULE dbgHelp = LoadLibrary(L"dbghelp.dll");
if (!dbgHelp)
{
CloseHandle(hFile);
return EXCEPTION_CONTINUE_SEARCH;
}
// 获取MiniDumpWriteDump函数地址
MINIDUMPWRITEDUMP miniDumpWriteDump =
(MINIDUMPWRITEDUMP)GetProcAddress(dbgHelp, "MiniDumpWriteDump");
if (!miniDumpWriteDump)
{
FreeLibrary(dbgHelp);
CloseHandle(hFile);
return EXCEPTION_CONTINUE_SEARCH;
}
// 配置异常信息
MINIDUMP_EXCEPTION_INFORMATION exInfo;
exInfo.ThreadId = GetCurrentThreadId();
exInfo.ExceptionPointers = exceptionPointers;
exInfo.ClientPointers = FALSE;
// 设置dump类型
MINIDUMP_TYPE dumpType =
(MINIDUMP_TYPE)(MiniDumpWithFullMemory | // 包含完整内存
MiniDumpWithFullMemoryInfo | // 包含内存信息
MiniDumpWithHandleData | // 包含句柄数据
MiniDumpWithThreadInfo | // 包含线程信息
MiniDumpWithUnloadedModules // 包含卸载的模块
);
// 写入dump文件
BOOL success = miniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hFile, dumpType, &exInfo, NULL, NULL);
// 清理资源
FreeLibrary(dbgHelp);
CloseHandle(hFile);
// 显示通知
if (success)
{
std::wstring message =
QString("程序遇到错误已退出,崩溃转储文件已保存到:\n%1")
.arg(dumpFileName)
.toStdWString();
MessageBoxW(nullptr, message.c_str(), L"程序崩溃",
MB_OK | MB_ICONERROR);
}
return EXCEPTION_EXECUTE_HANDLER;
}
#endif // WINDBG_H