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

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

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行

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

释放模式中的结果:

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

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

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

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