2013-05-27 29 views
23

在.NET應用程序中,我有一些要點需要收集有關當前線程狀態的調試信息。我可以獲得一些信息new StackTrace()的構造函數。特別是,我可以得到當前堆棧幀的列表,包括對應的MethodInfo對象,它們可以提供IL代碼,局部變量和參數的數量以及參數名稱。我怎樣才能獲得堆棧上當地人和參數的當前值?

我怎樣才能得到當前值這些當地人和參數的(至少是基本類型的)?

我不能手動附加任何調試器到應用程序,但應用程序可以產生新的進程,如果需要的話。

+1

看看http:// stackoverflow。COM /問題/ 75076 /獲得參數值從 - 的StackFrame-在網?RQ = 1。 –

+6

這是不可能的,局部變量和方法參數被抖動嚴重優化。反思無法實現。只有調試人員才能檢查他們的值,它知道在哪裏讀取它們。通常,它仍然不適用於發佈版本。 –

+0

@ X.C。您可以將它們保存到運行數據類中,然後將其打印到文件中。 –

回答

0

您能夠將變量的值寫入控制檯或日誌文件嗎?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable); 
Console.WriteLine("Value of my variable: "+myvariable); 
0

你必須在涉及的方法上使用這種方法,這樣內聯不會阻止你看到你想看到的東西。

MethodImplOptions.NoInlining

通常情況下,對於其他地方的信息,您使用記錄到數據庫或平面文件或類似這種事情。

2

思考,你正在使用獲得的MethodInfo和其他細節的東西,用在編譯時創建的元數據 - 也就是說,你正在訪問的數據沒有任何關係運行 - 時間數據,這是你想要的。

你提到你不能使用調試器,而你是對的,因爲在生產代碼中通常沒有調試符號加載到你的程序集中;一個調試器在那裏沒用。

這裏的一個重要事情是,在.NET架構中,一旦運行程序集,就會運行「抖動」並將IL代碼轉換爲本地代碼;其結果是,內存中加載的內容是純粹的機器代碼,您無法輕易入侵以獲取值(儘管理論上可能爲)。提到的另一點是優化 - 只要它們處於打開狀態,您可以預期方法消失(內嵌),執行順序可能會更改,變量將被文字替換。編譯器做了很多事情來讓你的代碼運行得更快。


雖然我不能看到當地人取得了良好的解決方案在運行時的值,我覺得有辦法獲取參數的使用截取等技術的價值。看看PostSharp能爲你做什麼。

0

一個很好的選擇是使用Postsharp。 它基於面向方面編程和代碼注入。 它允許您採取方法中的參數值。

也許可以解決您的一部分需求。