异常堆栈调试和发布模式之间的跟踪差异

时间:2011-09-28 14:40:44

标签: c#

以下代码在调试和发布模式下生成不同的异常堆栈跟踪:

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);
        }
    }
}

调试模式的结果:

  

在ET.E1()的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第47行

     

在ET:E2()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第58行

     

在ET.Entry()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第68行

发布模式中的结果:

  

在ET:E2()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第55行

     

在ET.Entry()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第68行

请注意,缺少发布模式中结果的第一行。如何在发布模式下返回违规行。

1 个答案:

答案 0 :(得分:15)

您可能会看到inlining的结果。在调试模式下编译时,内联始终处于关闭状态(因此调试很有意义)。在发布模式下编译时,编译器将删除某些方法(受a lot of rules限制)并将其内容插入所有调用站点。这通过删除方法调用开销来提高这些方法的整体性能。