开发出一款应用在上线运行可能会出现突然暴毙崩溃的情况,这时候该如何排查出原因呢,
如果可以"开棺验尸"的话,就应该可以轻松找出原因并改正。
异常钩子 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;
}
运行后立即弹出
简单看一下调用堆栈