2. 使用SOS前,确保项目的非托管调试选项(右击项目-->属性-->Debug页-->Enable unmanaged code debugging)被选中。之后在immediate window(菜单Debug-->windows-->immediate)使用.load sos命令加载sos,当你看到信息“extension C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll loaded”时,表示你可以使用SOS了。
3.具体SOS命令信息可以参考MSDN和这篇博客SOS使用详解。
4. 当你执行命令后,如果看到“PDB symbol for clr.dll not loaded”的信息,可以通过选中‘Microsoft Symbol Servers’ checkbox(Tools > Option > Debugging > Symbols)来解决。
5. SOS主要应用于以下场景:查看动态方法内容;检测内存泄露;线上调试编译好的dll;
6. !ClrStack –l 显示local变量无法获取变量名称,而且只是值类型的变量;如果想查看引用类型的变量需要通过DumpStackObjects找到对象,然后使用DumpObj来查看。
7. Running !GCRoot <object address> will tell us the root chain of any rooted object, in other words, if your object is not being collected because it is linked, directly or indirectly from a thread, a static object, a ref counted object etc. it will give you this link chain so that you can determine which links you need to break in order to make your object collectable.
8. 查看动态方法的IL:DSO并找到name为DynamicMethod的对象地址,然后!dumpIL <addr>就可以了,不过我使用的时候发现只有动态方法对象执行完CreateDelegate之后才可以看。