如何告诉编译器忽略堆栈跟踪中的方法?

时间:2011-01-27 16:08:36

标签: c# .net exception stack-trace

我是否可以将任何属性应用于样板方法,以便此类方法不会出现在堆栈跟踪中?我有很多它们,在某些情况下它们有几个层次。这只是混乱的事情。

示例代码:

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行

3 个答案:

答案 0 :(得分:7)

将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进行编码。

答案 1 :(得分:5)

您可以使用DebuggerHiddenAttribute

答案 2 :(得分:0)

如果您的方法不够简单以至于无法自动内联,则可以使用[MethodImpl(MethodImplOptions.AggressiveInlining)]属性为编译器提供强烈的提示,以使其成为内置对象。

您仍然必须以发布模式进行编译。