2010-08-06 56 views
12

由於某種原因,我有時會發現它對查看函數的優化編譯器輸出有用或有意思。如何查看優化的jitted .NET代碼的反彙編?

對於非託管C/C++代碼,我最喜歡的方式是在發佈模式下進行編譯,在感興趣的函數中插入一個斷點,運行並查看Visual Studio中的反彙編到達斷點時的反彙編。

我最近試過這個與C#項目,並發現該技術不起作用。即使在發佈模式下,我看到的反彙編顯然沒有優化。我發現並禁用了(在Visual Studio 2010中)「調試...選項和設置...調試...常規...抑制模塊加載時的JIT優化」選項,這可以讓我更接近我想要的,只有現在,當我嘗試運行它時,它會發出警告,然後我無法在斷點處停下來,以便看到反彙編。因此,如果我想查看CLR(4.0)抖動的反彙編優化輸出,那麼最好的方法是什麼?爲了清楚起見,我希望看到x86(或最好是x86_64)反彙編,而不僅僅是IL反彙編(你可以在Reflector中看到)。

回答

11

當然,經過半天尋找這個答案的答案,我找到了答案我問5分鐘後問。

我很接近;我在問題中唯一缺失的一步是,「啓用只是我的代碼」也必須在選項中取消選中。

完整指南,請訪問:http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

+0

當這種情況發生時,你不喜歡(而且討厭)它嗎? :) – leppie 2010-08-06 12:19:00

+0

@leppie:非常。這是一個需要知道解決方案的案例,以便知道要找到解決方案的詞組... – 2010-08-06 13:02:25

0

您可以嘗試檢查NGEN'd程序集,但是由於沒有元數據,因此這會非常困難。但它可以工作:)

3

我相信當你在調試器下運行JIT知道,併產生更多的「調試器友好的」 x86代碼,這可以解釋爲什麼在x86代碼,你看到的未被優化。

您可能會嘗試運行獨立應用程序,至少執行一次您感興趣的代碼(因此它沒有附加調試器的JIT),然後將調試器附加到進程並設置斷點。

0

無論您是否處於Debug或Release模式,在VisualStudio下運行仍將在Debugger下運行。由於它在調試器下運行,因此無法使用優化的代碼。

+1

這是真的嗎?如果是這樣,那麼爲什麼您可以將調試器附加到獨立於調試器運行的進程?不要忘記,VS也可以調試本地應用程序,但您只能看到反彙編(彙編指令)而不是C#或IL,並且您看到的是寄存器而不是本地的。我不知道如果你可以加載SOS.dll來深入挖掘內存,如果你附加到一個未使用調試器啓動的進程。還要注意,他們用.NET 4,iirc改變了本地調試/測試API的一些東西。 – 2011-03-02 00:01:24

1

優化代碼中的斷點在內聯函數中不起作用。如果你想查看內聯函數的反彙編,你可以在你的源代碼中插入命令System.Diagnostics.Debugger.Break();