admin 管理员组文章数量: 1184232
1.1 DUMP文件类型
Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。完整Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Minidump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。
1.2 DUMP文件的创建
本节讲述几种常用的DUMP文件创建方法。这里只讲述用户模式Dump文件创建,因为除部分专业开发人士(驱动开发)外,一般的开发人员只涉及应用程序的调试。
方法(1),通过调试工具创建。调试工具如Visual Studio,Windbg以及微软提供的ADplus都可以创建DUMP,在Windbg中通过.dump命令来生成。
方法(2),通过任务管理器创建。打开任务管理器,找到目标进程,右键——“创建转储文件”,即可保存DUMP。这种方式创建的DUMP文件为完整的Minidump,缺乏灵活性。不过,开发者的软件崩溃之后,又没有提供自动措施时,用户可以通过这种方法手动保存DUMP文件,然后提供给开发者分析,操作简单。不过,这种方法所产生的DUMP文件与其它几种方法产生的有差异,读者可以自己用windbg进行对比,这一点我在后面会详细讲到。
方法(3),通过编程自动创建。这是软件开发者使用的方式,例如,WPS中可以看到的对话框:
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilterlpTopLevelExceptionFilter即异常处理函数指针,如果设置为NULL,则默认使用UnhandledExceptionFilter。因此,我们对照UnhandledExceptionFilter的函数原型实现自己的异常处理函数:
LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{
AfxMessageBox("已成功创建崩溃转储!");
return EXCEPTION_EXECUTE_HANDLER;
}
然后在程序中设置该函数:
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
此时,再运行示例,如下:
LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{
HANDLE hFile = CreateFile("mini.dmp", GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE )
return EXCEPTION_EXECUTE_HANDLER;
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = ExceptionInfo;
mdei.ClientPointers = NULL;
MINIDUMP_CALLBACK_INFORMATION mci;
mci.CallbackRoutine = NULL;
mci.CallbackParam = 0;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);
CloseHandle(hFile);
AfxMessageBox("已成功创建崩溃转储!");
return EXCEPTION_EXECUTE_HANDLER;
}此时,运行程序,即可得到内存转储文件mini.dmp。需要注意的是,栈溢出类型的异常使用这种方法一般是捕捉不到的。为什么?我在栈溢出笔记中详细写过SEH,栈溢出会破坏SEH(结构化异常处理)框架,导致SEH失效。读者可以自己尝试。
1.3 小结
本节主要对DUMP文件进行了简单的介绍,并展示了创建DUMP文件的几种途径,其中,通过编程实现的应该是开发者应该掌握的方法。这样不仅仅给用户提供了比较友好的崩溃提示,还自动保存了DUMP文件,这对于那些不易重现的Bug将大大提高调试效率。
(本节的程序是一个简单的MFC程序,具体见第2节)
版权声明:本文标题:Minidump分析入门:Adobe Flash Player的隐秘代码解读技巧 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1772102504a3552157.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论