簡體   English   中英

如何在堆棧中獲取本地和參數的當前值?

[英]How can I get current values of locals and parameters on the stack?

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

如何獲取這些局部和參數的當前 (至少是原始類型)?

我無法手動將任何調試器附加到應用程序,但應用程序可以在需要時生成新進程。

反射,您用來獲取MethodInfo和其他細節,使用在編譯時創建的元數據 - 也就是說,您訪問的數據與運行時數據無關,這是您想要的。

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

這里重要的是,根據.NET體系結構,一旦運行程序集,“jitter”就會運行並將您的IL代碼轉換為本機代碼; 結果是內存中加載的內容是純機器代碼,您無法輕易獲取以獲取值(盡管理論上可行 )。 提到的另一點是優化 - 只要它們打開,您可以預期方法消失( 內聯 ),執行順序可能會更改,變量會被文字替換。 編譯器做了很多事情來讓你的代碼運行得更快。


雖然我無法看到在運行時獲取本地值的好方法,但我認為有一些方法可以使用攔截技術獲取參數值。 看看PostSharp可以為您做些什么。

您是否能夠將變量的值寫入控制台或日志文件?

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

您必須在所涉及的方法上使用此方法,以便內聯不會阻止您看到您想要查看的內容。

MethodImplOptions.NoInlining

通常,對於其他本地信息,您使用記錄器來訪問db或flat文件或其他類似的東西。

記錄應該相當簡單。 創建日志文件或執行WriteLine()。

本文檔可能有所幫助 - http://msdn.microsoft.com/en-us/library/tss153kw.aspx

一個很好的選擇是使用Postsharp。 它基於面向方面編程和代碼注入。 它讓你在方法中獲取參數值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM