Windows Dump转储文件
Dump是什么?
程序运行时在内存中的数据是动态和易失的,当程序发生崩溃的时候,把这些数据转储为静态的dump文件,这样我们就可以得到这些运行时数据。
如何生成windows dump文件
1. 注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
DumpFolder = %LOCALAPPDATA%\CrashDumps
DumpCount = 10
DumpType = 1
2. 手动转储
- 打开任务管理器(Task Manager)
- 选中进程(Process)
- 右键转储为(Create Dump File)
3. 代码 (推荐)
应用崩溃时(Unhandled Exception),调用MiniDumpWriteDump 函数生成dump文件。
-
SetUnhandledExceptionFilter (使能应用取代进程中的每个线程的顶层异常处理)
-
MiniDumpWriteDump (写入用户模式的minidump到指定文件)
#include <windows.h>
#include <tchar.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
// dump的文件句柄
HANDLE hDumpFile = CreateFile(_T("mydump.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// dump的异常信息
MINIDUMP_EXCEPTION_INFORMATION dumpExInfo;
dumpExInfo.ExceptionPointers = pException;
dumpExInfo.ThreadId = GetCurrentThreadId();
dumpExInfo.ClientPointers = TRUE;
// 写入dump文件
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, (MINIDUMP_TYPE)MiniDumpNormal, &dumpExInfo, NULL, NULL);
CloseHandle(hDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
//注册异常处理函数
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
//模拟异常产生dump
int* p = NULL;
*p = 0;
return 0;
}
参考
Collecting User-Mode Dumps
SetUnhandledExceptionFilter Function
MiniDumpWriteDump Function
总结
Dump是程序运行崩溃时非常重要的一种调试手段,通过dump文件和编译产生的pdb或者源文件,我们可以定位异常发生的位置。
分析dump文件可以配合winDbg进行解析,但是需要同一版本的pdb文件,如果没有pdb文件,那么我们需要通过计算内存的偏移量来分析故障原因。