软件调试技巧(一)
一、如何生成dump文件 dump是什么?是一个进程的内存数据的拷贝,程序可以通过一下命令对dump进程生产保存: 程序运行的时候如果产生崩溃,我们都是使用MiniDumpWriteDump生产一个mini dump
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 );这是它的原型,下面介绍一下它的参数:
typedef ENUM _MINIDUMP_TYPE { 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,MiniDumpWithTokenInformation = 0x00040000,MiniDumpWithModuleHeaders = 0x00080000,MiniDumpFilterTriage = 0x00100000,MiniDumpValidTypeFlags = 0x001fffff } MINIDUMP_TYPE;
写入到小型转储文件的堆栈和后备存储器内存应该被过滤掉,除去重建堆栈跟踪所需的所有指针值。
MiniDumpScanMemory应该扫描堆栈和后备存储器内存以查找模块列表中模块的指针引用。如果模块被堆栈或后备存储内存引用,则MINIDUMP_CALLBACK_OUTPUT结构的ModuleWriteFlags成员被设置为ModuleReferencedByMemory。
MiniDumpWithUnloadedModules如果信息由操作系统维护,则包含最近卸载的模块列表中的信息。
Windows Server 2003和Windows XP: 在Windows Server 2003 SP1和Windows XP SP2之前,操作系统不会保留已卸载模块的信息。
DbgHelp 5.1: 此值不受支持。
MiniDumpWithIndirectlyReferencedMemory包含带有当地人或其他堆栈内存引用的数据的页面。该选项可以显着增加小型转储文件的大小。
DbgHelp 5.1: 此值不受支持。
MiniDumpFilterModulePaths过滤用于用户名或重要目录等信息的模块路径。该选项可能会阻止系统查找映像文件,只能在特殊情况下使用。
DbgHelp 5.1: 此值不受支持。
MiniDumpWithProcessThreadData从操作系统中包含完整的每个进程和每个线程的信息。
DbgHelp 5.1: 此值不受支持。
MiniDumpWithPrivateReadWriteMemory扫描包含PAGE_READWRITE内存的虚拟地址空间。
DbgHelp 5.1: 此值不受支持。
MiniDumpWithoutOptionalData通过消除对于满足为转储指定的条件不重要的内存区域来减少转储的数据。这可以避免转储可能包含用户私有数据的内存。但是,这并不是保证不会有私人信息出现。
DbgHelp 6.1及更早版本: 此值不受支持。
MiniDumpWithFullMemoryInfo包含内存区域信息。有关更多信息,请参阅 MINIDUMP_MEMORY_INFO_LIST。
DbgHelp 6.1及更早版本: 此值不受支持。
MiniDumpWithThreadInfo包含线程状态信息。有关更多信息,请参阅 MINIDUMP_THREAD_INFO_LIST。
DbgHelp 6.1及更早版本: 此值不受支持。
MiniDumpWithCodeSegs包含来自已加载模块的所有代码和代码相关部分以捕获可执行的内容。对于每个模块的控制,使用ModuleWriteCodeSegs从枚举值MODULE_WRITE_FLAGS。
DbgHelp 6.1及更早版本: 此值不受支持。
MiniDumpWithoutAuxiliaryState关闭辅助辅助支持的内存收集。
MiniDumpWithFullAuxiliaryState请求辅助数据提供者在转储映像中包含它们的状态; 包含的状态数据依赖于提供程序。此选项可能会导致大型转储映像。
MiniDumpWithPrivateWriteCopyMemory扫描包含PAGE_WRITECOPY内存的虚拟地址空间。
DbgHelp 6.1之前: 此值不受支持。
MiniDumpIgnoreInaccessibleMemory如果指定了MiniDumpWithFullMemory,如果函数无法读取内存区域,则 MiniDumpWriteDump函数将失败; 但是,如果包含MiniDumpIgnoreInaccessibleMemory,则 MiniDumpWriteDump函数将忽略内存读取失败并继续生成转储。请注意,不可访问的内存区域不包含在转储中。
DbgHelp 6.1之前: 此值不受支持。
MiniDumpWithTokenInformation添加安全令牌相关数据。这将在处理用户模式转储时使“!token”扩展工作。
DbgHelp 6.1之前: 此值不受支持。
MiniDumpWithModuleHeaders添加模块头相关的数据。
DbgHelp 6.1之前: 此值不受支持。
MiniDumpFilterTriage添加过滤器分类相关数据。
DbgHelp 6.1之前: 此值不受支持。
MiniDumpValidTypeFlags指示哪些标志有效。
二、dump 分析 1. 命令 !analyze - v 这个是windbg基本分析命令,一般程序崩溃首先要调用的,可以查看到崩溃原因 2. .ecxr 命令定位当前异常上下文,并显示寄存器,最重要一点它回到产生异常崩溃的地方。 3. .frame命令可以在局部作用域分析局部变量,显示当前局部栈回溯 在改名了之后输入x 可以查看当前局部作用域(函数体)内部的局部变量本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
