ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC设置和使用dump在release模式下查找闪退位置《转》亲测有效!

2022-05-17 00:33:42  阅读:328  来源: 互联网

标签:MFC dump NULL dmp hDumpFile cpp release include stLocalTime


本文是讲 用VS如何调试.dmp(比较高版本的VS,本文是vs2017):
人为制造一个崩溃,先直接看效果图:

下面是实现过程,本文是VS2017为例:
dump.h:

点击查看代码
#pragma once
// dump.h
#include <windows.h>
extern LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo);

dump.cpp:

点击查看代码
// dump.cpp
#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>
#include <stdlib.h>
#include "pch.h" //这行看你工程设置,可以去掉

#pragma comment(lib, "Dbghelp.lib")

#include <DbgHelp.h>

//Creatte DUMP File
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
{
	BOOL bOwnDumpFile = FALSE;
	HANDLE hDumpFile = hFile;
	MINIDUMP_EXCEPTION_INFORMATION ExpParam;

	typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
		HANDLE,
		DWORD,
		HANDLE,
		MINIDUMP_TYPE,
		PMINIDUMP_EXCEPTION_INFORMATION,
		PMINIDUMP_USER_STREAM_INFORMATION,
		PMINIDUMP_CALLBACK_INFORMATION
		);


	MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
	HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
	if (hDbgHelp)
		pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

	if (pfnMiniDumpWriteDump)
	{
		if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
		{
			TCHAR szFileName[MAX_PATH] = { 0 };
			TCHAR dwBufferSize = MAX_PATH;
			SYSTEMTIME stLocalTime;
			GetLocalTime(&stLocalTime);
			CreateDirectory(szFileName, NULL);

			wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
				L"v1.0",
				stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
				stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
				GetCurrentProcessId(), GetCurrentThreadId());
			hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
				FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
			bOwnDumpFile = TRUE;
			OutputDebugString(szFileName);
		}
		if (hDumpFile != INVALID_HANDLE_VALUE)
		{
			ExpParam.ThreadId = GetCurrentThreadId();
			ExpParam.ExceptionPointers = pExceptionPointers;
			ExpParam.ClientPointers = FALSE;
			pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
				hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);
			if (bOwnDumpFile)
				CloseHandle(hDumpFile);
		}
	}
	if (hDbgHelp != NULL)
		FreeLibrary(hDbgHelp);
	return EXCEPTION_EXECUTE_HANDLER;
}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
	if (IsDebuggerPresent())
	{
		return EXCEPTION_CONTINUE_SEARCH;
	}
	return GenerateMiniDump(NULL, lpExceptionInfo, PWCHAR("test"));
}

//用到的地方加入这个头文件
#include "dump.h"

//程序初始化时,加入这个代码:
::SetUnhandledExceptionFilter(ExceptionFilter);

人为制造一个崩溃:
int *pTest = NULL; (*pTest) = 1;

Release版设置:


VS 工具(T) ->选项(O)…:

把这个.dmp文件,直接用VS打开:

定位到了出错的代码行:

发布时,主要是 4个要素:
1、.exe文件(或.dll)
2、对应的.pdb文件
3、崩溃后的.dmp文件
4、对应的结点代码(当时编译出这个exe/dll的代码,提前留个备份,比如 SVN / git 上的结点、代码打包rar/zip的备份、代码文件夹备份……)

本文主体内容至此已完结,下面有兴趣可以研究一下,那 4个要素 的对应过程:
首先,一个独立的.dmp,用vs打开,使用调试,会发生什么?

好,然后把这个 .exe放到.dmp同目录下,再调试:

好,然后再把这个.pdb放到.dmp同目录下,再调试:

找到这个.cpp,并把这个文件小改动一下保存:

在刚VS的打开.cpp对话框中,打开这个.cpp:
先选择否,把刚.cpp还原至发布时(即去掉刚加入的那个空格,再保存),再用VS重新打开这个.cpp:

这下明白了那 4要素 的作用了吧?

————————————————
版权声明:本文为CSDN博主「maoyeahcom」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/maoyeahcom/article/details/108583124

标签:MFC,dump,NULL,dmp,hDumpFile,cpp,release,include,stLocalTime
来源: https://www.cnblogs.com/dengzhekaihua/p/16279233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有