VS2012中使用SOS调试CLR

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2012中使用SOS调试CLR相关的知识,希望对你有一定的参考价值。

原文:VS2012中使用SOS调试CLR

之前看了《用WinDbg探索CLR世界》的一些列文章,发现SOS真的是一个非常好的调试.net的工具,

然后又惊喜的在http://blogs.msdn.com/b/mariohewardt/archive/2012/06/05/visual-studio-2012-and-windbg-integration.aspx 上看到原来windbg已经被集成

到VS2012的IDE中。本文主要讲解在VS2012中调用SOS的基本步骤

1 SOS是一个非托管的DLL,要使用SOS调试,首先需要打开本地的非托管代码调试选项,

Debug--->Options and Settings --->Suppress JIT optimization on module load(Managed only),将其取消

 

技术图片

 

然后需要打开项目的本地调试选项

project--->yourproname properties --->Debug--->Enable native code debugging

 

技术图片

2 按步骤一设置好以后,就可以开始我们的SOS之旅了。

首先我们需要定位到运行的某个时刻,F9在某条语句上设置断点,F5运行至Console.Read(),

然后我们打开immediate窗口,Debug--->Window--->Immediate

输入.load SOS

输入成功以后 会显示

技术图片

输入! help可以查看SOS的使用帮助,如果出现PDB symbol for clr.dll not loaded,可以通过选中

Tools ---> Option--- > Debugging ----> Symbols-->Microsoft Symbol Servers’ checkbox来解决

 

3 如果我们要查看某个对象的信息,可以输入!dumpstackobjects,查看所有在CLR中已经生成的对象信息,

技术图片

接下来我们看下object o的具体信息

输入!dumpobj(019f240f),没错,括号中的参数就是dumpstackobjects命令所显示的16进制数

技术图片

 

由此可以看到,一个空的对象在GC堆中占用的内存是12个bytes,在<CLR VIR C#>中提到,其中有8个bytes是对象类型指针和同步索引快,剩下4个bytes为空

很有意思的是,如果我们定义一个对象,只含有一个int型的私有字段,那么它所占用的内存也是12个bytes

本文就到这里,CLR底层的世界其乐无穷,期待有心人去探索

作者:Mars

出处:http://www.cnblogs.com/marsblog/

本文基于署名-非商业性使用 3.0中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 Mars (包含链接)

以上是关于VS2012中使用SOS调试CLR的主要内容,如果未能解决你的问题,请参考以下文章

MFC C++/CLI 项目:VS2012 中的 /CLR 开关导致调试问题

windebug

vs2005调试的时候老是弹出来“没有可用于当前位置可用的源代码”,这个问题怎么解决??

windbg在加载模块时下断点

Windbg SOS and CLR版本不一致的解决方案

vs2010调试时出现clr.dll的版本与生成mscordacwks.dll时针对的clr.dll的版本不匹配,请高手帮下忙?