.NET高级调试 - 3.9~3.11代码审查以及杂项命令
简介
代码审查就是观察代码,代码形态分为三种C#代码>IL代码》汇编代码。通过代码审查,可以从原始代码的字节流中推测出逻辑详情
高级调试本质上属于逆向分析,更多的是以汇编为主。
反汇编代码
u(unassemble)
命令u把字节流反汇编为汇编指令
还有一个变种ub,uf。 u是向下反汇编,ub是向上反汇编
uf是显示整个函数的返汇编代码
!U
由于sos拓展更清楚CLR的内部细节,因此!U的能够对程序集进行标注(给内存地址打上注释).从而使得反汇编指令更加可读
我们可以看到,同一段代码。!U命令反汇编的可读性更加高
获取方法描述符
有时候使用
!ip2md (instruction pointer to method descriptor)
除了方法的名字外,还额外显示了其他一些信息。方法描述符,方法表,JIT状态,代码地址等。要想快速找出汇编代码位于哪个函数中,会很方便
!name2ee
格式为 模块的名字和方法的全名
同样可以获取方法描述符
观察IL代码
!dumpil
sos提供了!dumpil 命令将托管函数的汇编反编译成IL代码,但不适用内存地址作为参数。而是以方法描述符为参数
观察C#代码
!savemodule
参数为module address.可以使用之前介绍的!ip2md或者!name2ee 来获取module地址
结论
dump文件不要轻易给别人分析,可以从任何角度反编译你的代码。
杂项命令
!eeversion 获取CLR版本
不仅能看到clr版本,还能看到sos版本以及CLR当前的运作模式(服务器模式还是工作站模式)
!gcroot 引用关系
这个命令非常实用,用来判断某一个对象的引用以及为什么没有被GC回收
!FinAppDomain 找出对象的应用程序域
!ProcInfo 转储进程信息
在调试过程中,有时候获得被调试的进程更多信息会非常有用。比如内存使用量,环境变量,处理时间等
有三个变种
- -env
- -time
- -men