Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到dump文件中。Dump 文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,如:WinDbg , VisualStudio。当我们的程序发布出去之后,在客户机上是无法跟踪自己代码的 BUG 的,我们可以通过 .dmp 文件把出现 BUG 的情况再现,然后再现客户环境 (包括堆栈调用等情况),设置源码调试路径,可以找到出现 BUG 的语句。
1、准备数据,生成dump
1)在VS中编译以下代码,生成EXE程序
#include <stdio.h>
#include <afxwin.h>
#include <dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")
LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
TCHAR szFileName[64];
SYSTEMTIME st;
::GetLocalTime(&st);
sprintf_s(szFileName, _T("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand() % 100);
HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = lpExceptionInfo;
ExInfo.ClientPointers = false;
// write the dump
BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
if (bOK)
{
printf("Create Dump File Success!\n");
}
else
{
printf("MiniDumpWriteDump Failed: %d\n", GetLastError());
}
::CloseHandle(hFile);
}
else
{
printf("Create File %s Failed %d\n", szFileName, GetLastError());
}
return ret;
}
int main()
{
::SetUnhandledExceptionFilter(MyUnhandledFilter);
int a = 0;
int b = 2;
int c = b / a;
return 0;
}
2)执行EXE程序
image.png
3)执行完后DEBUG目录下有DMP文件(保证EXE、DMP、PDB在相同目录并使用相同版本)
image.png
2、调试Dump文件
1)使用visual studio打开上图中的dump文件,选择本地调试
image.png
2)可以定位到发生crash的代码位置
image.png
欢迎关注【技术型项目经理】公众号。可获取软件行业动态、技术积累和项目管理理念文章分享。选择「考试经验」菜单「PMP」、「高项」(信息系统项目管理师)、「CISSP」、「GoLang」可获取学习资料。
网友评论