2012-03-26 19 views
1

我想知道是否可以安全地使用以下代碼來確定調用方法或對象的名稱(可能還有更多信息)當前執行代碼:使用StackTrace類安全地查找當前方法的調用方

StackTrace stackTrace = new StackTrace();   // get call stack 
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) 

更具體地說,有什麼特殊的/角落的情況下訪問幀將不工作或者拋出異常?

我已查看the MSDN page of StackTrace,但未發現任何可能的問題。

+2

堆棧跟蹤不會識別你去過的地方,它會告訴你下一步要去哪裏。 – asawyer 2012-03-26 13:04:24

+0

對不起,我喜歡在堆棧跟蹤處理代碼中進入一個遞歸循環來識別堆棧跟蹤錯誤的想法。 – KingCronus 2012-03-26 13:04:53

+0

@asawyer,那是不可能的,它怎麼能知道? – 2012-03-26 13:12:21

回答

3

與直接查看代碼相比,編譯器提供了不同視圖的方法可以內聯。您可以使用屬性,以確保你的方法是不是內聯:

[MethodImpl(MethodImplOptions.NoInlining)] 
public void MyMethod() { 
    // Get the stack trace. 
} 

否則,如果MyMethod內聯的堆棧跟蹤不包含你的代碼可能取決於對MyMethod框架。

+0

這可能不是100%安全==> http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx – sotto 2012-08-03 07:49:37

相關問題