簡體   English   中英

如何告訴編譯器忽略堆棧跟蹤中的方法?

[英]How can I tell the compiler to ignore a method in stack traces?

是否有任何屬性可以應用於樣板方法,以便這些方法不會出現在堆棧跟蹤中? 我有很多它們,在某些情況下它們有幾個層次。 這只是混亂的事情。

示例代碼:

class Program
{
    public static void ThrowMe()
    {
        throw new NotImplementedException();
    }

    public static void HideMe()
    {
        ThrowMe();
    }
    static void Main(string[] args)
    {
        try
        {
            HideMe();
        }
        catch (Exception e)
        {

        }
    }
}

這將拋出此堆棧跟蹤:

在Spork.Program.ThrowMe()在C:\\ Projects \\ XXX \\ Testing Sandbox \\ ConsoleTesting \\ Program.cs:第58行

在Spork.Program.HideMe()在C:\\ Projects \\ XXX \\ Testing Sandbox \\ ConsoleTesting \\ Program.cs:第64行

在Spork.Program.Main(String [] args)中的C:\\ Projects \\ XXX \\ Testing Sandbox \\ ConsoleTesting \\ Program.cs:第70行

將Console.WriteLine(e)放在catch塊中。 切換到發布版本並按Ctrl + F5。 你會看到這個:

System.NotImplementedException: The method or operation is not implemented.
   at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9
   at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 

請注意,HideMe()方法在堆棧跟蹤中可見。 任務完成。

跟蹤中未顯示方法調用,因為JIT優化器內聯了該方法 :這是隱藏堆棧跟蹤中方法的唯一方法。

它不是你能控制好的東西,方法必須是'小'而不是拋出任何異常本身。 否則通常認為這是一個問題,而不是一個功能。 很難弄清楚如何編碼從A到B.

您可以使用DebuggerHiddenAttribute

如果您的方法不夠簡單,無法自動內聯,您可以為編譯器提供一個強大的提示,您希望它與[MethodImpl(MethodImplOptions.AggressiveInlining)]屬性一起使用。

您仍然需要在發布模式下編譯。

暫無
暫無

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

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