Window C++ Postmortem Debugger
开发出一款应用在上线运行可能会出现突然暴毙崩溃的情况,这时候该如何排查出原因呢,
如果可以"开棺验尸"的话,就应该可以轻松找出原因并改正。
异常钩子 SetUnhandledExceptionFilter
#include <Windows.h>
#include <cstdint>
#include <DbgHelp.h>
LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* pExp)
{
HANDLE hFile = CreateFile(L"Crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION mdei = { GetCurrentThreadId(), pExp, FALSE };
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,
static_cast<MINIDUMP_TYPE>(MiniDumpWithFullMemory | MiniDumpWithHandleData),
&mdei, NULL, NULL);
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter(ExceptionFilter);
DebugBreak(); // 触发一次崩溃
return 0;
}
运行程序后在程序目录中会有一个Crash.dmp文件
使用WinDbg打开
可以看到这是一个MiniDump文件,并成功打开了
现在使用!analyze -v
简单分析下
很容易找到引发崩溃的位置
WinDbg -I
以管理员权限打开CMD,然后cd到WinDbg的目录下,执行windbg.exe -I
看到这样界面就是WinDbg注册为默认的Postmortem Debugger 成功了
如果想取消注册可以使用命令windbg.exe -IU
现在有程序
#include "stdafx.h"
#include <Windows.h>
#include <DbgHelp.h>
int main()
{
DebugBreak();
return 0;
}
运行后立即弹出
简单看一下调用堆栈