标题: Net 高级调试之八:代码审查及杂项命令 [打印本页] 作者: 张国伟 时间: 2023-12-19 11:36 标题: Net 高级调试之八:代码审查及杂项命令 一、简介
今天是《Net 高级调试》的第八篇文章。这篇文章设计的内容挺多的,比如:如何查看方法的汇编代码,如何获取方法的描述符,对象同步块的转储,对象方法表的转储,托管堆和垃圾回收器信息的转储,CLR 的版本,GC 模式,等等,内容挺多的。内容虽然挺多,但是这些都是高级调试的基础。虽然这些都是基础,如果这些掌握不好,以后的高级调试的道路,也不好走。当然了,第一次看视频或者看书,是很迷糊的,不知道如何操作,还是那句老话,一遍不行,那就再来一遍,还不行,那就再来一遍,俗话说的好,书读千遍,其意自现。
如果在没有说明的情况下,所有代码的测试环境都是 Net Framewok 4.8,但是,有时候为了查看源码,可能需要使用 Net Core 的项目,我会在项目章节里进行说明。好了,废话不多说,开始我们今天的调试工作。
调试环境我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。 操作系统:Windows Professional 10 调试工具:Windbg Preview(可以去Microsoft Store 去下载) 开发工具:Visual Studio 2022 Net 版本:Net Framework 4.8 CoreCLR源码:源码下载
二、基础知识 1、代码审查 1.1、简介
代码审查就是观察代码,代码由三种心态:机器代码、IL代码、C#代码。高级调试属于逆向分析,更多的是以 汇编代码 为主,如果对汇编无感,想学好 Net 高级调试,也是比较困难的。
1.2、观察汇编代码 1)u命令
这个命令用来将非托管函数的机器代码转成汇编代码,当然,我们想要查看汇编代码,不一定非要使用 Windbg,我们也可以使用 Visual Studio IDE 的反汇编窗口。我们可以通过点击菜单【调试】--》【窗口】----》【反汇编】,打开反汇编窗口。 2)!u命令
这个命令是由 SOS 提供的,专门用于观察 托管函数 的汇编表示,接下来,我们查看一下 Main 方法的汇编代码。
1.3、观察 IL 代码
SOS 提供了一个叫 !dumpil 的命令用来将托管函数的汇编指令转成可读的 IL 代码。