1. 程式人生 > >VS2012中使用SOS調試CLR

VS2012中使用SOS調試CLR

工具 進制 mars jpg font for 通過 check bject

之前看了《用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底層的世界其樂無窮,期待有心人去探索

來源於

http://www.cnblogs.com/marsblog/p/3275650.html

VS2012中使用SOS調試CLR