分类 调试 下的文章

九、模块列表流(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;

窗口切换

可以使用以下键盘快捷方式窗口之间进行切换。

效果

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 + 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

在日常分析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以上版本。

命令浏览器窗口显示并存储调试器命令的文本结果。此窗口创建命令引用,使您可以查看特定命令的结果,而无需重新输入该命令。命令浏览器窗口还提供了对存储的命令的导航,因此您可以比使用调试器命令窗口更快地访问命令。

命令浏览器的打开

  • 通过菜单Veiw--->Command Browser
  • 通过快捷键Ctrl+N
  • 通过工具栏

使用命令浏览器

用上面的方式打开的窗口如下:

 

 

在命令浏览器窗口中,可以执行以下操作:

  • 若要输入命令时,其在命令键入。

  • 若要查看以前输入的命令的结果,请使用Start, Prev,Next按钮来滚动查看命令列表,从“命令”菜单中选择前20个命令之一。要查找不是前20个命令之一的命令,请使用“Next”按钮。

命令浏览器窗口具有带其他命令的快捷菜单。 若要访问菜单,请右键单击标题栏或单击窗口 (在右上角附近的图标该按钮将显示命令浏览器窗口中工具栏快捷方式菜单的屏幕截图)。 以下列表介绍了一些菜单命令:

 

 

  • Start, Prev, 和 Next将光标分别移到命令历史记录的开头或上一个或下一个命令。

  • Add to Recent Commands将当前命令放入WinDbg窗口中“视图”菜单的“最近使用的命令”菜单中。最近使用的命令保存在工作区中。

  • Toolbar工具栏,开启和关闭。

  • 移到新停靠关闭命令浏览器窗口并将其打开新的平台中。

  • 始终浮点将使窗口停靠,即使仍拖到停靠位置。

  • 移动与帧将使窗口移动时移动的 WinDbg 帧,即使在窗口已解除固定。 

其他说明

在命令浏览器窗口中输入的命令由调试器引擎执行,而不是由WinDbg用户界面执行。这意味着您不能在命令浏览器窗口中输入像.cls这样的用户界面命令。如果用户界面是远程客户端,则服务器(而不是客户端)执行该命令。在命令浏览器窗口中输入的命令将同步执行,因此在完成输出之前不会显示输出。命令浏览器窗口保存在WinDbg工作区中,但不保存命令历史记录。工作空间中仅保存每个命令浏览器窗口的当前命令。

八、线程信息列表流(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;