1.dump的作用
在没办法调试程式的情况下,只能通过程式打印的log来排除异常,但有时候log也不行的时候可以导入dump文件,能快速定位到程式崩溃处代码。
2.调用dump操作
(1)我采用在MFC项目【Test】里创建一个按钮【Button2_DumpTest】来实现我的验证:
(2)代码
需要包含头文件:
#include <Windows.h>
#include <DbgHelp.h> //Dump头文件
#include <iostream>
#include <vector>
#pragma comment(lib,"dbghelp.lib") //微软提供,每台电脑都有
函数声明,TestDlg.h:
class CTestDlg : public CDialogEx
{
public:
afx_msg void OnBnClickedButton2();
//dump 20240620
void DumpTest()
{
Crash();
}
private:
void Crash()
{
int i = 13;
int j = 0;
int k = i / j; //除数不能为0,人为制造冲突
}
};
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
void CreateDumpFile(LPCWSTR lpstrDumpFileName, EXCEPTION_POINTERS *pException);
处理未处理异常的回调函数,ApplicationCrashHandler:
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
CreateDumpFile(_T("Test.dmp"), pException); //指定路径下生成dmp
FatalAppExit(-1, _T("Error: Unhandled Exception!")); //or MessageBox, or AfxMessageBox
return EXCEPTION_EXECUTE_HANDLER;
}
创建Dump文件函数,CreateDumpFile:
void CreateDumpFile(LPCWSTR lpstrDumpFileName, EXCEPTION_POINTERS *pException)
{
//创建Dump文件
HANDLE hDumpFile = CreateFile(lpstrDumpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//写入Dunm文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
调用SetUnhandledExceptionFilter(DbgHelp中的函数):
void CTestDlg::OnBnClickedButton2()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
CTestDlg test;
test.DumpTest();
}
(3)生成dmp操作
编译后点击【Test_d.exe】程式,选择【Button2_DumpTest】按钮:
就会有Error弹窗提示,同时exe【Test_d.exe】同目录下会生成dmp文件【Test.dmp】:
(4)查看dmp文件
用VS2010打开dmp文件后,可查看“Exception Information”消息判断异常原因,
点击【Actions】里的【Debug with Native Only】可以在本机调试,会主动跳到异常位置:
注:dmp文件需要放到.exe文件和.pdb文件下,同时最后一版程式不能再编译(编译后.pdb文件会改变,导致找不到准确的异常位置)
3.生成dump异常
在MFC项目中,在Debug下能监测到程式的冲突有弹窗提示和生成dmp文件,但是在Release下不能监测到这个冲突并且生成dmp文件。
可能是因为在Release下默认配置了“优化”:【Property Pages--->C/C++--->Optimization--->Optimization:Maximize Speed(/O2)】,此时将【Maximize Speed(/O2)】改成【Disabled/Od】就可生成dmp文件了。
但需注意的是,如果是在正常运行程式时,Release还是需要默认配置【Maximize Speed(/O2)】(优化),改成【Disabled/Od】的操作仅可在验证中开启用于DOE。
(1)Debug默认配置【Disabled/Od】:
(2)Release默认配置【Maximize Speed(/O2)】:
(3)修改Release默认配置【Maximize Speed(/O2)】为【Disabled/Od】:
参考:1.mC++程序生成dump文件并分析dump_release工程不能使用dump吗-CSDN博客