标题: Net 高级调试之九:SOSEX 扩展命令介绍 [打印本页] 作者: 种地 时间: 2023-12-22 10:06 标题: Net 高级调试之九:SOSEX 扩展命令介绍 一、介绍
今天是《Net 高级调试》的第九篇文章。这篇文章设计的内容挺多的,比如:扩展的断点支持,如何查找元数据,栈回溯,对象检查,死锁检测等等,内容挺多的。功能特别强大,使用特别方便,但是需要说明一点,这些功能不是 SOS 的功能,是 SOSEX 的扩展功能,但是,这一系列功能只是支持 Net Framework,在 Net Core 跨平台版本是不支持的。虽然这些都是基础,如果这些掌握不好,以后的高级调试的道路,也不好走。当然了,第一次看视频或者看书,是很迷糊的,不知道如何操作,还是那句老话,一遍不行,那就再来一遍,还不行,那就再来一遍,俗话说的好,书读千遍,其意自现。
如果在没有说明的情况下,所有代码的测试环境都是 Net Framewok 4.8,但是,有些项目需要使用 Net Core 的项目,我会在项目章节里进行说明。好了,废话不多说,开始我们今天的调试工作。
调试环境我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。 操作系统:Windows Professional 10 调试工具:Windbg Preview(可以去Microsoft Store 去下载) 开发工具:Visual Studio 2022 Net 版本:Net Framework 4.8 CoreCLR源码:源码下载
二、基础知识
1、SOSEX调试扩展
不得不说在调试 Net Framework 程序的时候,这个扩展调试组件的使用率是仅次于官方的 SOS 插件的,这个插件的一个特点就是能看到大量的命令是以 m 开头的,对应于 非托管命令的托管命令的表示。
2.1、我们使用【!mbp】命令给托管函数下断点(CLR没加载就可以下断点)。
调试代码:Example_9_1_1
我们的任务:给 Program 类的 Main 方法的第十行:int b = 11;下断点。 我们进入 Windbg 界面,不需要运行,就可以直接下断点,虽然这个时候 CLR 还没有加载。【!mbp】命令后是程序文件名,必须包含文件扩展名,否则无效。
1 0:000> !mbp Program.cs 10
2 <strong>The CLR has not yet been initialized in the process.(CLR还没有被初始化)
</strong>3 Breakpoint resolution will be attempted when the CLR is initialized.
5 02931254 0 94 E:\Visual Studio 2022\...\Example_9_1_1\bin\Debug\
6 02931320 0 118 E:\Visual Studio 2022\...\Example_9_1_1\bin\Debug\Example_9_1_1.exe.Config
7 0293148c 0 4 true
8 029314a4 0 32 PARTIAL_TRUST_VISIBLE_ASSEMBLIES
9 02931538 0 111 E:\Visual Studio 2022\..\Example_9_1_1\bin\Debug\Example_9_1_1.exe
10 ...(省略很多)
11 02933d8c 0 8 encoding
12 02933dac 0 6 stream
13 0293421c 0 5 bytes
14 02934234 0 5 chars
15 0293424c 0 9 charCount
16 0293426c 0 9 charIndex
17 0293428c 0 9 byteCount
18 029349fc 0 5 count
19 02934a14 0 6 offset
20 ---------------------------------------
21 167 strings
复制代码
上面的内容太多,我省略了,没必要全部显示出来。
1 0:006> !strings -m:河北*
2 Address Gen Length Value
3 ---------------------------------------
4 029324d8 0 3 河北省
5 ---------------------------------------
6 1 matching string
7 0:006> !strings /m:河北*
8 Address Gen Length Value
9 ---------------------------------------
10 029324d8 0 3 河北省
11 ---------------------------------------
12 1 matching string
复制代码
m 前的可以是英文横线-,也可以是英文/斜线,可以使用 * 进行模糊匹配。有一点要注意:值是:河北省,可以通过 -m:河北*,这个参数是有效的,如果是 -m:河北省* 就是找不到的,体会使用的细节吧,完整字符串不需要增加 * 星号,增加时找不到的。
1 0:006> !strings /m:河北省
2 Address Gen Length Value
3 ---------------------------------------
4 029324d8 0 3 河北省
5 ---------------------------------------
6 1 matching string
复制代码
2.4、我们在托管堆中使用【!mx】命令查找 Person 类型的 Show 方法。
调试代码:Example_9_1_1
我们进入到 Windbg 调试界面,如果有断点存在,我们可以使用【bc *】命令将所有的断点全部清除,然后再使用【g】命令,运行程序,会在【Console.ReadLine();】这样代码处暂停,然后我们点击【Break】按钮,就是调试程序了。