生成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文件用来分析软件出错信息的主要内容,如果未能解决你的问题,请参考以下文章

生成dmp文件用来分析软件出错信息

生成dmp文件用来分析软件出错信息

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

leguiglobal打开软件出现dmp文件

linux下使用dmp输出堆栈信息方法说明

Oracle 导入DMP 出错