2010-04-21 74 views
5

我有一個死的簡單的單線程方法,我不希望在堆棧跟蹤中看到:是否有可能?也許用一個屬性來標記它?爲了澄清,我沒有試圖在調試器中打印跟蹤,重新拋出或自動逐步掃描。我希望方法不首先顯示在跟蹤中,因爲跟蹤是由一些第三方代碼處理的。我想在運行時控制,我對調試不感興趣。 我在說這是因爲我在StackTrace上閱讀的大部分內容似乎都是關於這些主題的。C#:如何從堆棧跟蹤隱藏一個方法?

+0

如果它是一個簡單的單線程,那麼它是自動的。 JIT優化器將內聯它。但是,當你連接調試器時不行。 – 2010-04-21 13:08:12

+0

漢斯,看我對史蒂文的回答的評論。 – benblo 2010-04-22 11:14:11

+0

不要忘了標記你最喜歡的答案;-) – Steven 2010-06-22 11:27:57

回答

2

這隻能在你的方法被內聯時完成。 JIT執行它,或者你自己做(更改代碼)。然而,對於內聯方法,JIT是非常保守的,實際上只有當方法非常小或者當方法用於循環時纔會這樣做。

+0

嗯......說實話,我懷疑它:即使它被內聯,StackTrace不會跟蹤某種方式嗎? 而且,它不會在實踐中檢查出來,因爲我的方法在調試和發佈時都是這樣,它只是一個單行包裝器。 – benblo 2010-04-22 11:13:25

+1

否。當內聯方法時,它確實消失了。因此沒有方法調用,棧走並不會顯示它。由於堆棧跟蹤是使用堆棧散步構建的,堆棧跟蹤不會再顯示您的方法。 – Steven 2010-04-22 12:25:57

-1

正如在回答其他問題Most Useful Attributes時所述,您需要爲您的方法指定System.Diagnostics.DebuggerHidden屬性。

+0

不幸的是,在這裏不適用,顧名思義(和文檔狀態)它只是一個調試器屬性,取決於調試器篩選標記的方法,但該方法仍然在第一個堆棧跟蹤中註冊地點。 我的上下文不是調試時間,這是針對Unity(遊戲引擎)的,它輸出完整的日誌或異常堆棧,因此Unity必須有意地過濾掉這些方法。我害怕我想要做的事情(根本不在堆棧跟蹤中)根本不可能。 – benblo 2014-05-13 18:48:57