2011-09-18 23 views
0

我想監視(或放置一個斷點)靜態字段的每個變化,這個變量是駐留在外部程序集中的內部類的成員, t代碼:監視外部程序集中私有字段的變化(無源代碼)

Assembly: PresentationCore.dll 
Class : MS.Internal.MemoryPressure 
Field : private static long _totalMemory 

理想情況下,我應該能夠看到觸發更改的堆棧軌跡。

這是可能與VS,如果是的話,我該如何設置VS才能做到這一點?或者我是否需要一些外部分析工具?

+0

你可以使用像反射器這樣的smth反編譯它,然後使用VS來調試它。但是,我不確定它會起作用。 –

回答

1

你不能設置一個斷點上的字段。你很幸運,只有一個方法可以修改這個值,叫做AddToTotal。調試+新斷點+打破功能。鍵入「MS.Internal.MemoryPressure.AddToTotal」並取消「使用IntelliSense」選項。一旦調用該方法,調試器就會中斷,通常在代碼創建位圖時。你只會看機器碼。

一旦發生故障,您可以添加MS.Internal.MemoryPressure._totalMemory的手錶。調整反彙編中的斷點,使其突破字段分配。

+0

斷點已添加並在斷點窗口中可見,但調試器永遠不會停在那裏。 (只是我的代碼已被禁用) – springy76

+0

通過將Image控件添加到具有有效Source屬性值的窗口來測試它。當我嘗試時可靠地觸發了斷點。該領域只跟蹤Milcore資源。 –

+0

我的應用程序包含顯式調用'WriteableBitmap.ctor(width,height,[..])'所以這絕對應該停在那裏。但是我必須找出爲什麼這個計數器似乎總是> 1MB(並且經常觸發'GC.Collect(2)')可能是由某個第三方組件(Actipro,xceed,...)引起的。 – springy76

1

由於PresentationCore是.NET的一部分,你可以debug the framework source
看看this question

+0

好的,我可以加載模塊的符號,但是如何找到希望調試器停止的地方? – springy76

+0

來源在你的計算機上(假設你使用的是VS 2008/2010),你只需要找到正確的文件,看看我添加的問題鏈接到 –

+0

我沒有運氣:雖然符號爲大多數沒有用於PresentationCore.dll的框架程序集(System.Data.dll,System.Data.Entity.dll等)加載:「無法找到或打開PDB文件」 - 手動觸發「加載來自 - > Microsoft Symbol服務器的符號「不會改變任何內容。 – springy76

0

兩個展鵬Reflector以及JetBrains的Resharper可以幫助你做到這一點。他們都反編譯程序集並生成C#源代碼,之後它們允許您像使用它一樣使用它,包括放置斷點,觀察堆棧等。

我開始使用反射器,但現在(從v開始.6)我改用resharper,現在看起來更加健壯。 ReSharper的有曾經是一個免費試用30天,反射我不知道現在是什麼

+0

R#能夠顯示/下載源代碼,但斷點不會命中(很可能是因爲調試器仍然無法找到PresentationCore.dll的pdbs)。順便說一句:R#有30天的試用期。 – springy76

+0

感謝您指出輸入錯誤 - 修復了 – mfeingold