#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "Dbghelp.lib")
void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException) {
// 创建Dump文件
HANDLE hDumpFile = CreateFileA(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException) {
// 获取时间
SYSTEMTIME syst;
GetLocalTime(&syst);
CHAR strDateTime[256];
sprintf_s(strDateTime, 256, ".%d.%.2d.%.2d.%.2d.%.2d.%.2d.%.3d.dmp", syst.wYear, syst.wMonth, syst.wDay, syst.wHour, syst.wMinute, syst.wSecond, syst.wMilliseconds);
// 获取文件完整路径
CHAR szFilename[MAX_PATH];
GetModuleFileNameA(NULL, szFilename, MAX_PATH);
// 输出文件名称
std::string outfilename;
outfilename += szFilename;
outfilename += strDateTime;
MakeSureDirectoryPathExists(outfilename.c_str());
CreateDumpFile(outfilename.c_str(), pException);
FatalAppExitA(NULL, "*** Unhandled Exception! ***\0");
return EXCEPTION_EXECUTE_HANDLER;
}
> 注意:需要在部署机器上需要放入符号文件 *.pdb,程序崩溃时才会导出调用堆栈详细信息。
/*!
测试程序:
1. 生成该程序,运行该程序,非 IDE 调试器运行,会自动在程序目录生成 .dmp 后缀的文件。
2. 使用 使用 winDbg 调试工具打开 .dmp 文件
输入 !analyze –v 指令即可看到详细的分析信息
*/
int main() {
// 设置异常处理钩子
SetUnhandledExceptionFilter(ApplicationCrashHandler);
// 异常测试
*(int*)nullptr = 0;
}
C++ 崩溃时导出堆栈信息并使用调试工具定位问题 ?
于 2022-03-12 14:10:39 首次发布