簡體   English   中英

用於登錄.NET的堆棧跟蹤

[英]Stack Trace for logging in .NET

我編寫了一個logger / exceptionfactory模塊,它使用System.Diagnostics.StackTrace來獲取調用方法及其聲明類型的屬性。 但是我注意到,如果我在發布模式下運行Visual Studio之外的代碼,我的一些較短的方法會從堆棧跟蹤中內聯並丟失。 現在我無法測試一個方法是否會在運行時內聯,但我不想[MethodImpl(MethodImplOptions.NoInlining)]每個重要的方法。 但是如果我的基類中的方法因此而丟失,我可能會誤讀層和操作信息,這可能導致錯誤的日志或錯誤參數化的異常。

是否有一條經驗法則是何時何地內聯? 虛方法,靜態方法,基類方法是否有任何不同? 我只需要擔心內部裝配內聯嗎? 內部名稱空間

是的,有一些規則,但它們是JIT編譯器使用的啟發式方法,這些啟發式方法可能會在瞬間發生變化。

  1. 無法內聯虛擬方法。
  2. 另一方面,接口方法可能是內聯的,盡管我不能100%確定這是否會使堆棧跟蹤崩潰。
  3. 當然可以內聯靜態方法和非虛擬實例方法。
  4. 內聯可能跨越名稱空間(當然)和程序集(不那么明顯),因為它發生在運行時,當JIT編譯方法調用時。
  5. “重”方法不會被內聯。 這取決於“重”的定義,並且是JIT適用的啟發式的一部分。

我所知道的一些“沉重”的啟發式:

  • 不使用異常處理(即try-catch或try-finally塊)的方法。
  • 沒有內聯使用大代碼(大約32個IL字節,但我可能記得這個錯誤)的方法。
  • 沒有內聯循環的方法(除非循環可以完全展開或消除)。

啟發式算法都是抖動的實現細節,這意味着它們沒有正式記錄,並且可能隨時會發生變化。

話雖如此,這里有一些你可能會感興趣的文章(雖然其中一些現在有點長):

暫無
暫無

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

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