2011-02-26 89 views
4

有沒有辦法在運行時轉儲堆棧的內容?有沒有辦法在C#中運行時檢查堆棧變量?

我對父函數信息(名稱,參數,行)感興趣,我知道我可以用StackTrace和StackFrame類獲得這些信息。但是,我還想獲取堆棧中的變量(在調用當前正在執行的方法中聲明的局部變量)。由於Visual Studio調試器可以執行此操作,因此我認爲可能有一種方法可以在代碼中的運行時執行此操作。有沒有這樣的方式?

+1

根據[此帖](http://stackoverflow.com/questions/75076/obtain-parameter-values-from-stackframe-in-net),它看起來像使用堆棧跟蹤和的StackFrame類它,你不能這樣做。 – 2011-02-26 23:33:27

+0

謝謝!這是一個非常類似的問題。我想知道是否有更簡單的方法來做到這一點,而不是使用攔截。 – cloudraven 2011-02-26 23:37:50

+2

只有調試器才能做到這一點,如果代碼沒有優化,它只會做可信的工作。當你發現一個程序不能自我調試時,這總是會導致死亡。 – 2011-02-27 00:08:40

回答

1

我想有兩種方法可以達到這個目的。

您的第一個選擇是使用AOP框架將檢測代碼作爲後編譯步驟進行注入。這可以非常有針對性地讓你做任何你想做的事情,但是當你能從其他代碼中分離出所需的附加行爲時效果最好。 PostSharp是這一領域的領先競爭者,但我相信還有其他人。

您的第二個選擇是掛接到Profiler API,這是TypeMock Isolator和Microsoft自己的Moles所做的。它基本上爲你提供了攔截所有事情的手段,但是它的程序非常具有侵略性,當然不是一項小任務。事實上,除了完整性之外,我不會向任何人推薦這種方法。

+0

謝謝。 PostSharp似乎非常強大,並且可以讓我免於手工截取。也許那麼我的問題應該是。我如何捕獲當前堆棧幀的整個狀態。儘管將它作爲單獨的問題發佈可能更有意義 – cloudraven 2011-02-27 20:46:17

相關問題