Глава.20 .Исключения.и.управление.состоянием
Строка, возвращаемая свойством
StackTrace
, не включает в себя имен методов,
расположенных в стеке вызова выше точки принятия исключения блоком
catch
.
Для отслеживания всего стека с самого начала до момента обработки исключения
используйте тип
System.Diagnostics.StackTrace
. Он определяет свойства и ме-
тоды, дающую разработчикам возможность программно управлять трассировкой
стека и составляющими его кадрами.
Существует несколько конструкторов, позволяющих получить объект
StackTrace
.
Некоторые из них строят кадры от начала потока до момента появления объекта
StackTrace
. Другие — инициализируют кадры объекта
StackTrace
, передавая ему
в качестве аргумента объект, производный от типа
Exception
.
Если CLR обнаруживает для ваших сборок символические имена отладки
(находящиеся в файлах с расширением
pdb
), строка, возвращаемая свойством
StackTrace
объекта
System.Exception
или методом
ToString
объекта
System.
Diagnostics.StackTrace
, содержит пути файлов исходного кода и номера строк.
Эта информация чрезвычайно полезна для отладки.
В результатах трассировки стека можно обнаружить, что имена некоторых из
вызывавшихся методов отсутствуют. Такая ситуация может возникнуть по двум
причинам. Во-первых, в стеке содержится информация о том, куда должен вернуть
управление поток, а не откуда произошло обращение. Во-вторых, JIT-компилятор
может выполнять подстановку (inline) кода методов в вызывающий код, чтобы из-
бежать слишком большого числа вызовов, и возвращать результат вызова только
одного метода. Многие компиляторы (в том числе C#) предлагают переключатель
командной строки
/debug
. При его использовании компилятор включает в ре-
зультирующую сборку информацию, заставляющую JIT-компилятор прекратить
подстановку методов. В результате трассировка стека становится более полной
и содержательной в процессе отладки.
ПриМеЧание
JIT-компилятор. проверяет. назначенный. сборке. атрибут. System Diagnostics
DebuggableAttribute .Компилятор.C#.назначает.этот.атрибут.автоматически .Уста-
новка.флага.DisableOptimizations.заставляет.JIT-компилятор.прекратить.подстановку.
методов.сборки .В.C#.флаг.устанавливается.переключателем.командной.строки.
/debug .Применив.к.методу.настраиваемый.атрибут.System Runtime CompilerServices
MethodImplAttribute,.вы.можете.запретить.подстановку.как.для.отладочной,.так.и.для.
рабочей.конфигурации .Вот.пример.определения.метода,.запрещающего.подста-
новку:
using System;
using System.Runtime.CompilerServices;
internal sealed class SomeType {
[MethodImpl(MethodImplOptions.NoInlining)]
public void SomeMethod() {
...
}
}
Do'stlaringiz bilan baham: |