版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanyuqiu/article/details/80420758
目前做一个项目,利用mfc做框架生成执行程序,在本机及实验室的机子里都能正常运行,但运用到远程的机器上就崩,而且好像不是程序算法的问题,不能重现很难定位,所以考虑利用dmp文件来分析。
1.dmp文件生成实现代码
头文件
#include <DbgHelp.h>
#include <tchar.h>
线程函数
LONG _stdcall ApplicationCrashHandler(PEXCEPTION_POINTERS pException)
{
CreateDumpFile(_T("test.dmp"),pException);
FatalAppExit(-1, _T("***Unhandled Exception!***"));
return EXCEPTION_EXECUTE_HANDLER;
}
void CreateDumpFile(LPCTSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException)
{
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if ((hDumpFile != NULL) && (hDumpFile != INVALID_HANDLE_VALUE))
{
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ExceptionPointers = pException;
dumpInfo.ClientPointers = TRUE;
::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hDumpFile, MiniDumpNormal,
&dumpInfo, NULL, NULL);
}
CloseHandle(hDumpFile);
}
在dialog初始化中调用函数ApplicationCrashHandler(PEXCEPTION_POINTERS pException)
BOOL CCutton_DlgDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// TODO: 在此添加额外的初始化代码
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
2. 工程配置
3.dmp文件分析
生成的dmp文件必须与之前的pdb文件相对应,双击dmp文件,利用vs打开
点击 使用仅限本机 进行调试,就会定位问题的所在了。