Dump文件数据存储格式(七)
九、模块列表流(ModuleListStream
)
ModuleListStream
流包含进程已加载模块信息。它紧跟随在ThreadInfoListStream
后面。ThreadInfoListStream信息如下:
0x15f4+0n5068=0x29c0
而ModuleListStream如下
可知ModuleListStream的RVA 为0x29c0,所以
ModuleListStream
紧挨着ThreadInfoListStream
,大小为26680字节。数据如下:
这些数据按如下结构组织在一起:
typedef struct_MINIDUMP_MODULE_LIST {
ULONG32 NumberOfModules;
MINIDUMP_MODULE Modules[0];
} MINIDUMP_MODULE_LIST,*PMINIDUMP_MODULE_LIST;
Windbg的快捷键
窗口切换
项 | 效果 |
---|---|
CTRL+TAB |
调试信息窗口之间切换。 通过重复使用此密钥,你可以扫描通过的所有窗口,而不考虑是否浮动、 停靠本身,或选项卡式停靠窗口的集合的一部分。 |
Alt+Tab |
目前,在您的桌面上的窗口之间切换。 此外可以使用此键盘快捷方式的 WinDbg 帧和已创建任何其他停靠之间进行切换。 |
菜单命令
您可以使用以下键盘快捷方式而不是鼠标来选择菜单命令。
项 | 等效的菜单 |
---|---|
F1 |
|
F3 |
|
SHIFT+F3 |
与相同编辑 |查找下一个,但按反向执行搜索。 |
Alt + F4 |
|
CTRL+F4 |
|
F5 |
|
SHIFT+F5 |
|
CTRL+SHIFT+F5 |
|
F6 |
|
F7 |
|
F8 |
|
F9 |
如果活动窗口的源或反汇编窗口:在当前行中插入断点。 (如果已没有当前行上设置断点,此按钮将移除该断点。) 否则:此时将打开断点像那样的对话框编辑 |断点。 |
ALT+F9 |
|
F10 |
|
Ctrl+F10 |
|
F11 |
|
SHIFT+F11 |
|
ALT+1 |
|
ALT+SHIFT+1 |
关闭命令窗口。 |
ALT+2 |
此时将打开监视窗口 (与相同视图 |观看)。 |
ALT+SHIFT+2 |
关闭监视窗口 |
ALT+3 |
|
ALT+SHIFT+3 |
关闭局部变量窗口。 |
ALT+4 |
|
ALT+SHIFT+4 |
关闭寄存器窗口。 |
ALT+5 |
|
ALT+SHIFT+5 |
关闭内存窗口。 |
ALT+6 |
|
ALT+SHIFT+6 |
关闭调用窗口 |
ALT+7 |
|
ALT+SHIFT+7 |
关闭反汇编窗口。 |
ALT+8 |
打开草稿板 (与相同视图 |Scratch Pad)。 |
ALT+SHIFT+8 |
关闭草稿板。 |
ALT+9 |
|
ALT+SHIFT+9 |
关闭进程和线程窗口中。 |
CTRL + A |
|
CTRL + C |
|
CTRL + D |
|
CTRL+E |
|
Ctrl+F |
|
CTRL + G |
|
CTRL+I |
|
CTRL+SHIFT+I |
|
CTRL + K |
|
Ctrl+L |
|
Ctrl+O |
|
Ctrl+P |
|
CTRL+R |
|
Ctrl+S |
|
CTRL + V |
|
CTRL+SHIFT+V |
|
Ctrl+W |
|
CTRL+X |
|
CTRL + SHIFT + Y |
|
ALT +\* (数字键盘) |
|
SHIFT + DELETE |
|
SHIFT + INSERT |
|
CTRL + INSERT |
|
CTRL + BREAK |
|
ALT+DEL |
控制键
以下键盘快捷方式是等效于 KD / CDB 控制键。
项 | 等效的菜单 | KD / CDB 控制密钥 |
---|---|---|
CTRL+ALT+A |
CTRL + A |
|
CTRL + ALT + D |
||
CTRL+ALT+K |
CTRL + K |
|
CTRL + ALT + R |
CTRL+R |
|
CTRL+ALT+V |
CTRL + V |
|
CTRL + ALT + W |
Ctrl+W |
插入符控制
您可以使用以下键盘快捷方式移动插入符号 (^) 中的大多数调试的信息窗口。
插入符号移动 | 键 |
---|---|
向左一个字符 |
左侧 |
右一个字符 |
右侧 |
左移字 |
CTRL+LEFT |
正确的单词 |
CTRL + 向右键 |
向上移动一行 |
UP |
向下移动一行 |
向下 |
向上翻页 |
Page Up |
向下翻页 |
Page Down |
当前行的开头 |
Home |
在行尾 |
End |
该文件的开头 |
CTRL + HOME |
文件的末尾 |
CTRL + END |
请注意 中调试器命令窗口、 向上和向下键浏览通过命令历史记录。 可以使用 INSERT 键以将插入模式下打开和关闭。
文本选择
使用以下键盘快捷方式选择文本。
选择 | 项 |
---|---|
左侧的字符 |
SHIFT+LEFT |
右侧的字符 |
SHIFT + 向右键 |
左侧的单词 |
SHIFT+CTRL+LEFT |
右侧文字 |
SHIFT + CTRL + 向右键 |
当前行 |
SHIFT + 向下插入符号是否在第 1 列 |
上述行 |
SHIFT + 向上如果插入点在第 1 列 |
至行尾 |
SHIFT + END |
到行首 |
SHIFT + HOME |
启动屏幕 |
SHIFT + PAGE UP |
屏幕上向下 |
SHIFT + Page Down |
到文件的开头 |
SHIFT + CTRL + HOME |
到文件的末尾 |
SHIFT+CTRL+END |
文本删除
使用以下键盘快捷方式删除文本。
DELETE | 键 |
---|---|
插入符号右边的字符 |
DELETE |
插入符号左边的字符 |
退格符 |
所选的文本 |
DELETE |
为什么".loadby sos clrjit"在有的dmp文件执行成功,在另外的dmp文件执行不成功?
在日常分析dmp文件工作中,我发现用".loadby sos clrjit"指令来加载sos扩展库在有的dmp文件成功有的不成功,都是报如下错误:
0:036> .loadby sos clrjit
The call to LoadLibrary(sos.dll) failed, Win32 error 0n2
"系统找不到指定的文件。"
Please check your debugger configuration and/or network access.
今日有得闲,于是就仔细分析下这个问题。
首先,我们知道".loadby sos clrjit"是根据clrjit的路径去加载sos,出现这个问题自然而然有两个可能性:
- 一是dmp文件里没有包含clrjit模块信息
- 二是clrjit路径问题
我们先看看是不是第一种情况,执行lm列出dmp文件包含的模块信息
没有问题的dmp如下:
0:000> lm
start end module name
01250000 0126f000 clrcompression (deferred)
...
692b0000 6933a000 clrjit (deferred)
....
有问题的dmp如下:
0:036> lm
start end module name
00230000 0023e000 mxml1 (deferred)
0:036> lm
start end module name
00230000 0023e000 mxml1 (deferred)
....
50100000 5017d000 clrjit (deferred)
......
可以看到都有clrjit模块信息。也就证明不是第一种情况,那就是第二种情况了,为了求证,要查看模块的详细信息了
没有问题的dmp如下:
0:000> lmDvmclrjit
Browse full module list
start end module name
692b0000 6933a000 clrjit (deferred)
Image path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
Image name: clrjit.dll
Browse all global symbols functions data
Timestamp: Tue Jul 7 06:46:31 2020 (5F03A9C7)
CheckSum: 00095382
ImageSize: 0008A000
File version: 4.8.4220.0
Product version: 4.0.30319.0
File flags: 8 (Mask 3F) Private
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
Information from resource tables:
CompanyName: Microsoft Corporation
ProductName: Microsoft® .NET Framework
InternalName: clrjit.dll
OriginalFilename: clrjit.dll
ProductVersion: 4.8.4220.0
FileVersion: 4.8.4220.0 built by: NET48REL1LAST_C
PrivateBuild: DDBLD507
FileDescription: Microsoft .NET Runtime Just-In-Time Compiler
LegalCopyright: © Microsoft Corporation. All rights reserved.
Comments: Flavor=Retail
有问题的dmp如下:
0:036> lmDvmclrjit
Browse full module list
start end module name
50100000 5017d000 clrjit (deferred)
Image path: clrjit.dll
Image name: clrjit.dll
Browse all global symbols functions data
Timestamp: Sat Apr 12 09:19:13 2014 (53489491)
CheckSum: 0007D3A1
ImageSize: 0007D000
File version: 4.0.30319.34209
Product version: 4.0.30319.34209
File flags: 8 (Mask 3F) Private
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
Information from resource tables:
CompanyName: Microsoft Corporation
ProductName: Microsoft® .NET Framework
InternalName: clrjit.dll
OriginalFilename: clrjit.dll
ProductVersion: 4.0.30319.34209
FileVersion: 4.0.30319.34209 built by: FX452RTMGDR
PrivateBuild: DDBLD354
FileDescription: Microsoft .NET Runtime Just-In-Time Compiler
LegalCopyright: © Microsoft Corporation. All rights reserved.
Comments: Flavor=Retail
我相信大家都看出问题之所在了吧。对,能执行成功的模块是全路径,而另外一个只有文件名,那么当然会报"系统找不到指定的文件。"的错误了。看来两种dmp文件抓取的类型标志肯定不一样。
有问题dmp文件标志如下
果然去掉了模块路径信息。下面是这个标志的说明:
MiniDumpFilterModulePaths
过滤内存信息中的模块路径,只保留模块名称。此选项可以保护用户的隐私比如用户名、重要的目录等,但可能阻止系统定位Image文件,应当谨慎应用在特殊环境。
该选项要求DbgHelp 5.1以上版本。
Windbg Command Browser(命令浏览器)窗口的使用
命令浏览器窗口显示并存储调试器命令的文本结果。此窗口创建命令引用,使您可以查看特定命令的结果,而无需重新输入该命令。命令浏览器窗口还提供了对存储的命令的导航,因此您可以比使用调试器命令窗口更快地访问命令。
命令浏览器的打开
- 通过菜单Veiw--->Command Browser
- 通过快捷键Ctrl+N
- 通过工具栏
使用命令浏览器
用上面的方式打开的窗口如下:
在命令浏览器窗口中,可以执行以下操作:
若要输入命令时,其在命令框键入。
若要查看以前输入的命令的结果,请使用Start, Prev, 和Next按钮来滚动查看命令列表,从“命令”菜单中选择前20个命令之一。要查找不是前20个命令之一的命令,请使用“Next”按钮。
命令浏览器窗口具有带其他命令的快捷菜单。 若要访问菜单,请右键单击标题栏或单击窗口 (在右上角附近的图标)。 以下列表介绍了一些菜单命令:
Start, Prev, 和 Next将光标分别移到命令历史记录的开头或上一个或下一个命令。。
Add to Recent Commands将当前命令放入WinDbg窗口中“视图”菜单的“最近使用的命令”菜单中。最近使用的命令保存在工作区中。
Toolbar工具栏,开启和关闭。
移到新停靠关闭命令浏览器窗口并将其打开新的平台中。
始终浮点将使窗口停靠,即使仍拖到停靠位置。
移动与帧将使窗口移动时移动的 WinDbg 帧,即使在窗口已解除固定。
其他说明
在命令浏览器窗口中输入的命令由调试器引擎执行,而不是由WinDbg用户界面执行。这意味着您不能在命令浏览器窗口中输入像.cls这样的用户界面命令。如果用户界面是远程客户端,则服务器(而不是客户端)执行该命令。在命令浏览器窗口中输入的命令将同步执行,因此在完成输出之前不会显示输出。命令浏览器窗口保存在WinDbg工作区中,但不保存命令历史记录。工作空间中仅保存每个命令浏览器窗口的当前命令。
Dump文件数据存储格式(六)
八、线程信息列表流(ThreadInfoListStream
)
ThreadInfoListStream
包含了线程状态信息,在ThreadListStream
的后面就是ThreadInfoListStream
了。
ThreadListStream
如下:
0x720+0n3796=0x15F4
而ThreadInfoListStream
如下:
所以ThreadInfoListStream
紧挨着ThreadListStream
,大小为5068字节。数据如下:
ThreadInfoListStream
的数据由两个结构组成,一个是MINIDUMP_THREAD_INFO_LIST,另一个是MINIDUMP_THREAD_INFO。
MINIDUMP_THREAD_INFO_LIST包含数据大小的信息,相当于头部结构,如下:
typedef struct_MINIDUMP_THREAD_INFO_LIST {
ULONG SizeOfHeader;
ULONG SizeOfEntry;
ULONG NumberOfEntries;
} MINIDUMP_THREAD_INFO_LIST,*PMINIDUMP_THREAD_INFO_LIST;