软件调试技巧(一)

一、如何生成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
);
这是它的原型,下面介绍一下它的参数:
hprocess  : 顾名思义,进程的句柄
processid : 进程ID
dumptype :生成dump的类型
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;

MiniDumpNormal: 包含了必要的信息,以及所有线程的堆栈信息
MiniDumpWithDataSegs:包含所有模块数据段的加载,全局变量等,比小型转存储更大。
MiniDumpWithFullMemory:包含所有存储器的访问处理。RAW数据的存储器包含在端部,初始结构可以直接映射存储器原始信息,该选项可以导致转存储文件非常大。
MiniDumpWithHandleData包含有关在创建小型转储时处于活动状态的操作系统句柄的高级信息。
MiniDumpFilterMemory

写入到小型转储文件的堆栈和后备存储器内存应该被过滤掉,除去重建堆栈跟踪所需的所有指针值。

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 可以查看当前局部作用域(函数体)内部的局部变量 4. lm 可以查看加载的所有模块 5. 改天继续写。。。



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部