Поделиться через


Трассировка и инструментирование приложений

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Трассировка — это способ контроля работы вашего приложения во время его выполнения. Вы можете добавить инструментирование трассировки и отладки в приложение .NET Framework при его разработке, и вы можете использовать это инструментирование как во время разработки приложения, так и после его развертывания. Вы можете использовать System.Diagnostics.Trace, System.Diagnostics.Debug классы и System.Diagnostics.TraceSource классы для записи сведений об ошибках и выполнении приложения в журналах, текстовых файлах или других устройствах для последующего анализа.

Термин инструментации относится к способности наблюдать или измерять уровень производительности продукта, а также диагностировать ошибки. В программировании это означает способность приложения включать в себя:

  • Трассировка кода — получение информационных сообщений о выполнении приложения во время выполнения.

  • Отладка — отслеживание ошибок программирования и исправление ошибок программирования в приложении в процессе разработки. Дополнительные сведения см. в разделе "Отладка".

  • Счетчики производительности — компоненты, позволяющие отслеживать производительность приложения. Дополнительные сведения см. в статье Performance Counters.

  • Журналы событий — компоненты , позволяющие получать и отслеживать основные события в выполнении приложения. Дополнительные сведения см. в EventLog классе.

Инструментирование приложения путем размещения инструкций трассировки в стратегических расположениях в коде особенно полезно для распределенных приложений. С помощью инструкций трассировки можно инструментировать приложение не только для отображения сведений, когда происходит ошибка, но и для отслеживания того, насколько хорошо работает приложение.

Класс TraceSource предоставляет расширенные функции трассировки и может использоваться вместо статических методов старых Trace и Debug трассировок классов. Знакомые Trace и Debug классы по-прежнему широко используются, но TraceSource класс рекомендуется для новых команд трассировки, таких как TraceEvent и TraceData.

Классы Trace и Debug идентичны, за исключением того, что процедуры и функции класса Trace компилируются по умолчанию в сборки на выпуск, тогда как процедуры и функции класса Debug не компилируются.

Классы Trace и Debug предоставляют средства для мониторинга и анализа производительности приложений как во время разработки, так и после развертывания. Например, класс можно использовать Trace для отслеживания определенных типов действий в развернутом приложении по мере их возникновения (например, создания новых подключений к базе данных) и, следовательно, мониторинга эффективности приложения.

Трассировка кода и отладка

Во время разработки можно использовать выходные методы Debug класса для отображения сообщений в окне вывода интегрированной среды разработки Visual Studio (IDE). Рассмотрим пример.

Trace.WriteLine("Hello World!")
Debug.WriteLine("Hello World!")
System.Diagnostics.Trace.WriteLine("Hello World!");
System.Diagnostics.Debug.WriteLine("Hello World!");

Каждый из этих примеров будет отображать "Hello World!" в окне вывода при запуске приложения в отладчике.

Это позволяет выполнять отладку приложений и оптимизировать их производительность на основе их поведения в тестовой среде. Вы можете выполнить отладку приложения в сборке отладки с включенным условным атрибутом Debug , чтобы получить все выходные данные отладки. Когда приложение готово к выпуску, можно скомпилировать сборку выпуска без включения условного Debug атрибута, чтобы компилятор не включал код отладки в окончательный исполняемый файл. Дополнительные сведения см. в разделе "Компиляция условно с использованием трассировки и отладки". Дополнительные сведения о различных конфигурациях сборки для приложения см. в разделе "Компиляция и сборка".

Вы также можете отслеживать выполнение кода в установленном приложении, используя методы Trace класса. Процессом и масштабом трассировки можно управлять. Для этого добавьте в код переключатели трассировки. Это позволяет отслеживать состояние приложения в рабочей среде. Это особенно важно в бизнес-приложении, использующее несколько компонентов, работающих на нескольких компьютерах. Вы можете управлять тем, как коммутаторы используются после развертывания с помощью файла конфигурации. Дополнительные сведения см. в разделе "Практическое руководство. Создание, инициализация и настройка коммутаторов трассировки".

При разработке приложения, для которого планируется использовать трассировку, обычно в код приложения включаются как трассировочные, так и отладочные сообщения. Когда вы будете готовы к развертыванию приложения, можно скомпилировать финальную сборку без включения условного атрибута Debug. Однако можно включить условный атрибут Trace, чтобы компилятор включил код трассировки в исполняемый файл. Дополнительные сведения см. в разделе "Компиляция условно с использованием трассировки и отладки".

Этапы трассировки кода

Существует три этапа трассировки кода:

  1. Инструментирование — вы добавляете код трассировки в приложение.

  2. Трассировка — код трассировки записывает сведения в указанный целевой объект.

  3. Анализ — вы оцениваете информацию трассировки для выявления и понимания проблем в приложении.

Во время разработки все методы отладки и трассировки выходных данных записывают сведения в окно вывода в Visual Studio по умолчанию. В развернутом приложении методы записывают сведения трассировки в указанные целевые объекты. Дополнительные сведения об указании целевого объекта вывода для трассировки или отладки см. в разделе "Прослушиватели трассировки".

Ниже приведены общие сведения о основных шагах, которые обычно участвуют в использовании трассировки для анализа и исправления потенциальных проблем в развернутых приложениях. Дополнительные сведения о выполнении этих действий см. в соответствующей ссылке.

Использование трассировки в приложении
  1. Рассмотрим, какие выходные данные трассировки необходимо получить на сайте после развертывания приложения.

  2. Создайте набор коммутаторов. Дополнительные сведения см. в статье How to: Configure Trace Switches (Настройка переключателей трассировки).

  3. Добавьте инструкции трассировки в код приложения.

  4. Определите место отображения выходных данных трассировки и добавьте соответствующие прослушиватели. Дополнительные сведения см. в разделе "Создание и инициализация прослушивателей трассировки".

  5. Протестируйте и отладите приложение и код трассировки, который он содержит.

  6. Скомпилируйте приложение в исполняемый код с помощью одной из следующих процедур:

    • Используйте меню "Сборка " вместе со страницей отладки диалогового окна "Страницы свойств " в обозревателе решений. Используйте это при компиляции в Visual Studio.

      -или-

    • Используйте директивы компилятора trace и debug для метода компиляции командной строки. Дополнительные сведения см. в разделе Компиляция условно с помощью трассировки и отладки. Используйте это при компиляции из командной строки.

  7. Если проблема возникает во время выполнения, включите соответствующий переключатель трассировки. Дополнительные сведения см. в разделе "Настройка коммутаторов трассировки".

    Код трассировки записывает сообщения трассировки в указанный целевой объект, например экран, текстовый файл или журнал событий. Тип прослушивателя, который вы включили в Trace.Listeners коллекцию, определяет целевой объект.

  8. Проанализируйте сообщения трассировки, чтобы выявить и понять проблему в приложении.

Инструментирование выполнения трассировки и распределенные приложения

При создании распределенного приложения может оказаться трудно протестировать приложение таким образом, как оно будет использоваться. Несколько команд разработчиков могут протестировать все возможные сочетания операционных систем или веб-браузеров (включая все локализованные языковые параметры) или имитировать большое количество пользователей, которые будут получать доступ к приложению одновременно. В этих обстоятельствах невозможно проверить, как распределенное приложение будет реагировать на большие объемы, различные настройки и уникальное поведение конечных пользователей. Кроме того, многие части распределенного приложения не имеют пользовательского интерфейса, с которым можно взаимодействовать напрямую или просматривать действия этих частей.

Однако вы можете компенсировать это, позволяя распределенным приложениям описывать определенные события, интересующие администраторов системы, особенно когда что-то идет не так, внедряя средства диагностики в приложение, то есть путем размещения трассировочных инструкций в стратегических местах в коде. Затем, если во время выполнения возникает что-то неожиданное (например, чрезмерно медленное время отклика), можно определить причину.

С помощью инструкций трассировки можно избежать сложной задачи изучения исходного исходного кода, изменения его, перекомпиляции и попытки создать ошибку во время выполнения в среде отладки. Помните, что вы можете инструментировать приложение не только для отображения ошибок, но и для мониторинга производительности.

Стратегическое размещение инструкций трассировки

При размещении инструкций трассировки для использования во время выполнения необходимо особое внимание. Необходимо учитывать, какие сведения трассировки могут потребоваться в развернутом приложении, чтобы все вероятные сценарии трассировки были достаточно охвачены. Тем не менее, так как приложения, использующие трассировку, отличаются широко, общие рекомендации по стратегическому размещению трассировки отсутствуют. Дополнительные сведения о размещении инструкций трассировки см. в статье "Практическое руководство. Добавление инструкций трассировки в код приложения".

Выходные данные трассировки

Выходные данные трассировки собираются объектами, называемыми прослушивателями. Прослушиватель — это объект, который получает результаты трассировки и записывает их на выходное устройство (обычно окно, журнал или текстовый файл). Когда создаётся прослушиватель трассировки, его обычно добавляют в коллекцию Trace.Listeners, что позволяет прослушивателю получать все результаты трассировки.

Информация трассировки всегда записывается по крайней мере в целевой объект вывода по умолчанию Trace, DefaultTraceListener. Если по какой-то причине вы удалили DefaultTraceListener, не добавив других слушателей в сборку Listeners, вы не получите никаких сообщений логирования. Дополнительные сведения см. в разделе «Прослушиватели трассировки».

Debug Шесть элементов и Trace методов, которые записывают сведения трассировки, перечислены в следующей таблице.

Метод Выходные данные
Assert Указанный текст; или, если не указано, стек вызовов. Выходные данные записываются только в том случае, если условие, указанное в качестве аргумента в инструкции Assert, равно false.
Fail Указанный текст; или, если не указано, стек вызовов.
Write Указанный текст.
WriteIf Указанный текст, если условие, указанное в качестве аргумента в WriteIf инструкции, удовлетворяется.
WriteLine Указанный текст и возврат каретки.
WriteLineIf Указанный текст и возврат каретки, если условие, указанное в качестве аргумента в WriteLineIf инструкции, удовлетворяется.

Все слушатели в коллекции получают сообщения, описанные выше в Listeners таблице, но действия могут отличаться в зависимости от типа слушателя, который получает сообщение. Например, DefaultTraceListener отображает диалоговое окно утверждения при получении Fail или уведомления об ошибке Assert, но TextWriterTraceListener просто записывает вывод в свой поток.

Вы можете создавать пользовательские результаты, реализуя собственный прослушиватель. Например, настраиваемый прослушиватель трассировки может отображать сообщения в поле сообщения или подключаться к базе данных для добавления сообщений в таблицу. Все пользовательские прослушиватели должны поддерживать шесть описанных выше методов. Дополнительные сведения о создании определяемых разработчиком прослушивателей см. TraceListener в справочнике по .NET Framework.

Методы Write и WriteLine всегда записывают текст, который вы указываете. Assert, WriteIfи WriteLineIf требует логического аргумента, который определяет, пишет ли он указанный текст; они записывают указанный текст только в том случае, если выражение имеет значение true (для WriteIf и WriteLineIf), или false (для Assert). Метод Fail всегда записывает указанный текст. Дополнительные сведения см. в статье "Практическое руководство. Добавление инструкций трассировки в код приложения и справочник по .NET Framework".

Проблемы безопасности

Если вы не отключаете трассировку и отладку перед развертыванием приложения ASP.NET, ваше приложение может показать сведения о себе, которые могут быть использованы вредоносной программой. Дополнительные сведения см. в статьях Практическое руководство: Компиляция условно с помощью Trace и Debug, Компиляция и сборка, а также Практическое руководство: Создание, инициализация и настройка переключателей трассировки. Отладка также настраивается с помощью служб IIS.

См. также