生成dmp文件用来分析软件出错信息
Posted 卑微的小李
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成dmp文件用来分析软件出错信息相关的知识,希望对你有一定的参考价值。
demo 代码:
#include <QtCore/QCoreApplication>
// 必要的头文件, 并且需要添加 Dbghelp.lib 库 与 Dbghelp.dll
// 详情请见: MiniDumpWriteDump: https://docs.microsoft.com/zh-cn/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump
// SetUnhandledExceptionFilter: https://docs.microsoft.com/zh-cn/windows/win32/api/errhandlingapi/nf-errhandlingapi-setunhandledexceptionfilter
#include "tchar.h"
#include "Windows.h"
#include "Dbghelp.h"
#pragma comment(lib, "dbghelp.lib")
// *.dmp 使用方法: (以 VS2019 为例)
/*
* 文件 → 打开 → 文件(找到 转储文件) → 打开 → 使用 仅限本机 进行调试
* * 注意:
* * 1: 需要相同版本的代码, 否则会提示 没有兼容的代码在线程上运行
* * 2: 转储文件(*.dmp) 依赖于 *.pdb 文件进行调试, 如果两个文件不在相同目录中需要点击 设置符号路径进行添加
* * 3: 发布版生成调试文件(*.pdb)
* * * 1) 右键项目 → 属性 → C/C++ → 常规 → 调试信息格式 (程序数据库 / 编辑并继续)
* * * 2) 右键项目 → 属性 → 连接器 → 调试 → 生成调试信息 (生成调试信息)
*
**/
/*!
* @brief
* @param exception_pointers 异常上下文信息
* @return 处理状态
*/
INT generateMiniDump(PEXCEPTION_POINTERS exception_pointers) {
// 建议针对不同软件进行更改 文件名头部信息
TCHAR programName[] = _T("SmartSolo_SW_DCC_Crash");
TCHAR fileName[MAX_PATH]{};
SYSTEMTIME localTime{};
GetLocalTime(&localTime);
_stprintf_s(fileName, MAX_PATH, _T("%s - %04d%02d%02d-%02d%02d%02d.dmp"),
programName,
localTime.wYear, localTime.wMonth, localTime.wDay,
localTime.wHour, localTime.wMinute, localTime.wSecond);
HANDLE hFile = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE,
nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
return EXCEPTION_CONTINUE_EXECUTION;
MINIDUMP_EXCEPTION_INFORMATION exceptionInformation{};
exceptionInformation.ThreadId = GetCurrentThreadId();
exceptionInformation.ExceptionPointers = exception_pointers;
exceptionInformation.ClientPointers = FALSE;
// 建议 MiniDumpWithFullMemory(将会很大!!!) 或者 MiniDumpNormal(文件小,功能够用)
// 转储文件类型见: https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/ne-minidumpapiset-minidump_type
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, (exception_pointers ? &exceptionInformation : nullptr), nullptr, nullptr);
CloseHandle(hFile);
// EXCEPTION_EXECUTE_HANDLER 表示我已经处理了异常,可以优雅地结束了
return EXCEPTION_EXECUTE_HANDLER;
}
/*!
* @brief 顶级异常处理回调函数
* @param lpExceptionInfo 异常上下文信息
* @return 处理状态
*/
LONG WINAPI handleException(LPEXCEPTION_POINTERS lpExceptionInfo) {
// 生成小型转储文件
auto res = generateMiniDump(lpExceptionInfo);
// #TODO: 可以尝试做一些事情
return res;
}
/*!
* @brief 异常测试
*/
void throwTest() {
throw 1;
}
int main(int argc, char* argv[]) {
// 注册顶级异常处理程序
SetUnhandledExceptionFilter(handleException);
QCoreApplication a(argc, argv);
// 产生异常
throwTest();
return a.exec();
}
设置:
文件 → 打开 → 文件(找到 转储文件dmp) → 打开 → 使用 仅限本机 进行调试
以上是关于生成dmp文件用来分析软件出错信息的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段