.NET高级调试 - 3.12 sosex实用的几个命令介绍
简介
sosex是sos的一个拓展,主要目的是将一些繁琐的排查过程脚本化,比如探测死锁,设置断点等。更加方便快捷协助我们排查问题.
比较可惜的是,在.net core中不可用,作者已经不更新了。
更多的命令可以使用!sosex.help 查看帮助
断点加强
原来的bp命令操作起来优点麻烦,还有区分jit有没有编译等因素。而sosex可以管理断点列表,并且可以在任一行上设置断点
!mbl 列出所有断点
sosex维持了一张断点列表,如果断点是通过sosex来设置的,那么它将会被记录在案
- !mbc清除指定断点或者所有断点
- !mbd禁用指定断点或者所有断点
- !mbe启用指定断点或者所有断点
!mbl 设置断点
!mbm 无源码设置断点
如果是动态生成的代码,无法确切知道代码地址。那么该命令可以在特定类型指定IL便宜处设置一个断点。
观察对象布局
一般用!do(DumpObj)命令观察一个对象的时候,只能看到一层。如果你的对象是嵌套了好几层。那就一层一层的敲命令。很不方便
!mdt
相对于使用do,嵌套越深,就越方便
使用!sosex.help mdt 来查看更多用法
搜索托管堆中的字符串
!strings /m:xxxxxx
搜索元数据
使用name2ee 搜索比较麻烦 ,需要模块名+方法名。 我们需要准确的信息。如果我们想模糊搜索呢?
!mx
两者孰优孰劣,一目了然
并且数据也比较全,避免自己敲太多命令
!mln
调用栈加强
!mk
k命令显示非托管代码调用栈,clrstack显示托管代码调用栈。dumpstack同时显示托管与非托管。sos的mk命令是对k命令的加强。
除了会显示托管代码调用栈外,还会显示栈帧的编号
观察Free块
!mfrag
主要用于分析内存碎片化
死锁检测
!dlk
一键检测死锁,方便快捷
否则要先用!syncblk查看同步块,然后再看!clrstack 查看调用堆栈。再判断是否形成死锁。这中间需要自己换算,比较麻烦
总结
sosex是对sos的加强,由于.net core中无法使用。所以主要还是熟练掌握sos命令为主。