8.3 C#创建Mini dump
8.3.1 概述DbgHelp库
Microsoft提供了DbgHelp库,它包含了一系列关于辅助调试PE格式的API。其相关的dll是DbgHelp.dll,这个文件包含在了操作系统里面,但是早期的操作系统里面(我映像中是在Win7版本之前)这个Dll文件是不可用的。所以如果你的客户还有一些Win XP用户或早期版本的Windows OS用户的话,如果需要使用该类库,还需要把最新的DbgHelp.dll包含在你的程序包里面。其中每个DbgHelp不同的版本,所支持的API也是不一样的,具体的信息可以参见dbghelp.chm文档,这个文档你不需要额外从网上下载,因为在你安装Debugging tools的时候,这个文档就包含在了Windbg.exe的同目录下。
8.3.2 MiniDumpWriteDump函数
在本节中,着重介绍利用DbgHelp库中的MiniDumpWriteDump函数,其定义如下:
BOOL WINAPI MiniDumpWriteDump( __in HANDLE hProcess, __in DWORD ProcessId, __in HANDLE hFile, __in MINIDUMP_TYPE DumpType, __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); |
在这里大致解释一下每个参数的意思:
hProcess:需要创建Mini dump的进程(目标进程)句柄
ProcessId:目标进程ID
hFile:需要创建的dump文件句柄。
DumpType:需要创建的MiniDump类型,这是一个枚举类型,可以传递一个或多个值的组合。具体参数结构参考dbghelp文档或者下文中对应的C#结构。
ExceptionParam:引起创建Dump行为的Exception指针,可以传null。具体数据结构参考dbghelp文档。
UserStreamParam:包含在MiniDump自定义的一些信息的指针,可以传null。具体数据结构参考dbghelp文档。
CallbackParam:创建Dump的时候会有一些额外的信息生成,可以通过这个参数传递一个回调函数的指针。具体数据结构参考dbghelp文档。
在这里需要注意的是DumpType和ExceptionParam参数:
1.首先说DumpType,这是必须在C#中必须声明的结构,在这里贴出它对应的C#定义:
[Flags] publicenumMiniDumpType :uint { // From dbghelp.chm: MINIDUMP_TYPE Enumeration MiniDumpNormal = 0x00000000, MiniDumpWithDataSegs = 0x00000001, MiniDumpWithFullMemory = 0x00000002, MiniDumpWithHandleData = 0x00000004, MiniDumpFilterMemory = 0x00000008, MiniDumpScanMemory = 0x00000010, MiniDumpWithUnloadedModules = 0x00000020, MiniDumpWithIndirectlyReferencedMemory = 0x00000040, MiniDumpFilterModulePaths = 0x00000080, MiniDumpWithProcessThreadData = 0x00000100, MiniDumpWithPrivateReadWriteMemory = 0x00000200, MiniDumpWithoutOptionalData = 0x00000400, MiniDumpWithFullMemoryInfo = 0x00000800, MiniDumpWithThreadInfo = 0x00001000, MiniDumpWithCodeSegs = 0x00002000, MiniDumpWithoutAuxiliaryState = 0x00004000, MiniDumpWithFullAuxiliaryState = 0x00008000, MiniDumpWithPrivateWriteCopyMemory = 0x00010000, MiniDumpIgnoreInaccessibleMemory = 0x00020000, MiniDumpValidTypeFlags = 0x0003ffff, }; |
在这里我挑几个重要的值描述一下:
MiniDumpNormal: 基本的参数,值为0,也就是说不包含额外的信息的一种情况,创建出来的Mini Dump仅包含所有线程的栈回溯信息。
MiniDumpWithDataSegs:指定MiniDump包含进程加载的所有模块的节区的信息,例如A.dll的.text的节区信息
MiniDumpWit