异常堆栈跟踪调试和释放模式之间的差异

本文关键字:之间 模式 释放 堆栈 跟踪 调试 异常 | 更新日期: 2023-09-27 18:10:01

下面的代码在调试和释放模式下生成不同的异常堆栈跟踪:

static class ET
{
    public static void E1()
    {
        throw new Exception("E1");
    }
    public static void E2()
    {
        try
        {
            E1();
        }
        catch (Exception e)
        {
            throw;
        }
    }
    public static void Entry()
    {
        try
        {
            E2();
        }
        catch (Exception e)
        {           
            Console.WriteLine(e.StackTrace);
        }
    }
}

调试模式的结果:

at ET.E1() in D:'myStudio'CSharp'CSharp4.0'MyCSharp'ExceptionHandling.cs:line 47

at ET.E2() in D:'myStudio'CSharp'CSharp4.0'MyCSharp'ExceptionHandling.cs:line 58

at ET.Entry() in D:'myStudio'CSharp'CSharp4.0'MyCSharp'ExceptionHandling.cs:line 68

Result in Release Mode:

at ET.E2() in D:'myStudio'CSharp'CSharp4.0'MyCSharp'ExceptionHandling.cs:line 55

at ET.Entry() in D:'myStudio'CSharp'CSharp4.0'MyCSharp'ExceptionHandling.cs:line 68

请注意,在发布模式下,结果的第一行丢失了。如何在释放模式下返回违规行。

异常堆栈跟踪调试和释放模式之间的差异

您可能正在看到内联的结果。在调试模式下编译时,内联总是关闭的(这样调试才有意义)。在发布模式下编译时,编译器将删除某些方法(受许多规则的约束),并将其内容插入所有调用站点。这通过消除方法调用开销来提高这些方法的总体性能。