Исключительная разница в трассе между режимами Debug и Release
В приведенном ниже коде генерируется трассировка стека исключений в обоих режимах отладки и выпуска:
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
Обратите внимание, что первая строка из результата в режиме Release отсутствует. Как вернуть строку нарушения в режим выпуска.
Ответы
Ответ 1
Вероятно, вы видите результат inlining. Когда вы компилируете в режиме отладки, inlining всегда отключается (так что отладка имеет смысл). Когда вы компилируете в режиме выпуска, компилятор удалит определенные методы (с учетом множества правил) и вставляет их содержимое во все сайты вызовов. Это улучшает общую производительность этих методов, удаляя служебные данные вызова метода.