Что такое протокол трассировки visual studio
Сегодняшняя публикация рассматривает некоторые полезные советы по отладке которые вы можете применять в Visual Studio. Мой друг Скот Кэйт (Scott Cate) (который опубликовал в блоге дюжину великолепных советов и трюков по VS) недавно обратил мое внимание на несколько хороших советов о которых не знает много разработчиков использующих Visual Studio (даже при том, что многие из них работают с ней уже давно с более ранних версий).
Надеюсь эта публикация поможет вам узнать о них, если вы еще не знаете о них. Все они просты для изучения, а могут сэкономить вам кучу времени.
Run to Cursor (Ctrl + F10) (Выполнить до курсора)
Часто я наблюдаю людей отлаживающих приложения следующим образом: они устанавливают точку останова на много раньше того места которое их интересует, а затем постоянно пользуются F10/F11 чтобы пройти по коду пока не будет достигнуто то место, которое на самом деле они хотят исследовать. В некоторых случаях они внимательно осматривают каждое выражение, через которое они проходят (в таких случаях использование F10/F11 имеет смысл). Однако, чаще, люди просто пытаются быстро перейти к строке кода которая на самом деле их интересует — в таких случаях использование F10/F11 это не лучший способ для достижения такой цели.
Вместо этого, вы можете воспользоватся функцией “run to cursor” («выполнить до курсора») которая поддерживается отладчиком. Просто установите курсор на строке кода до которой вы хотите выполнить приложение, а затем нажмите вместе Ctrl + F10. Это приведет к выполнению приложения до этой строки и переходу в режим отладки сохраняя время которое могло быть потрачено на множественные нажатия F10/F11 для того, чтобы попасть сюда. Это работает даже в тех случаях, когда код в который вы хотите попасть находится в отдельном методе или класс по отношению к тому месту которое вы в данный момент отлаживаете.
Conditional Breakpoints (Условные точки останова)
Другой распространенной ситуацией которую мы часто наблюдаем являются случаи, когда разработчики устанавливают точки останова, выполняют приложение, проверяют определенный ввод, попадают на точку останова и затем вручную проверяют является ли условие истинным перед тем как принять решение о переходе к дальнейшему рассмотрению в режиме отладки. Если сценарий не соответствует, что они делают дальше, они жмут F5 для продолжения выполнения приложения, проверяют какой-нибудь другой ввод и повторяют процесс вручную.
Способность Visual Studio задания условных точек останова предоставляет намного, намного более легкий способ для того, чтобы этого добиться. Условные точки останова позволяют вам переходить в режим отладки только, если какое-то определенное условие которое было назначено достигнуто. Условные точки останова помогают вам избежать ручного изучения кода с его дальнейшим выполнением, а также могут сделать весь процесс отладки не требующим вашего ручного вмешательства и избавят вас от скучной работы.
Как включить Conditional Breakpoint (Условную точку останова)
Настройка условных точек останова в реальности проста. Нажмите в коде F9, чтобы установить точку на определенной строке (прим. пер. вы также можете установить точку останова кликнув мышью на левой границе окна редактора ровно на уровне строки, где нужно поставить точку останова):
Затем щелкните правой кнопкой мыши на красном кружке точки останова слева от окна редактора и выберите контекстное меню «Condition. » («Условие. »):
Это приведет к появлению диалогового окна, которое позволяет указать, что точка останова должна срабатывать только, если определенное условие истинно. Например, мы можем указать, что на нужно переходить в отладку, если размер локального списка paginatedDinners менее 10-и, вписав следующее выражение ниже:
Теперь, когда я перезапущу приложение и выполню поиск, отладчика будет включена только если я выполню поиск которые вернет меньше чем 10 обедов. Если будет больше 10-и обедов, тогда точка останова не будет достигнута.
Функция Hit Count (Число попаданий)
Иногда вам нужно, чтобы происходила остановка отладчика только при условии, что условие истинно N-раз.
Например, останавливаться только, если уже 5 раз поиск возвратил меньше чем 10 обедов.
Вы можете включить такое поведение правым щелчком на точке останова и выбором пункта меню «Hit count. » («Количество попаданий. »).
Это приведет к появлению диалогового окна, которое позволяет указать, что точка останова должна быть достигнута только N-раз, когда достигнуто условие или каждые N-раз, когда оно достигнуто, или каждый раз после N вхождений:
Фильтрация по Machine/Thread/Process (Имя машины/Поток/Процесс)
Вы можете также щелкнуть правой кнопкой на точке останова и выбрать пункт «Filter. » («Фильтр. ») из контекстного меню, чтобы указать, что точка останова должна быть достигнута, если процесс отладки происходит на определенной машине или в определенном процессе или в определенной потоке.
Точки трассировки (TracePoints) – пользовательские события при попадании в точку останова
Функция отладчика о которой многие люди не знают это возможность использовать TracePoints (Точки трассировки). Точка трассировки это точка останова при достижении которой срабатывает пользовательское событие. Эта функциональность особенно полезна, когда вам нужно отследить поведение в вашем приложении без остановки в отладке.
Я использую простое консольное приложение (Console application), чтобы продемонстрировать как мы могли бы воспользоваться Точками трассировки. Ниже приведена рекурсивная реализация ряда Фибоначчи:
В приложении приведенном выше мы используем Console.WriteLine() чтобы выводить окончательные значение ряда для конкретного значения диапазона. Что если мы захотели отследить рекурсивную последовательность ряда Фибоначчи в действии одновременно с отладкой – без фактической его остановки или приостановки? Точки трассировки могут помочь нам легко это сделать.
Установка точки трассировки (TracePoint)
Вы можете включить точки трассировки воспользовавшись клавишей F9 для установки точки останова в строке кода и затем щелкнув правой кнопкой на точке останова и выбрав пункт «When Hit. » («Когда Попадает. ») из контекстного меню:
Это приведет к появлению диалогового окна, которое позволяет вам указать, что должно произойти когда достигнута точка останова:
Точки трассировки (TracePoints) – выполнение пользовательского макроса
В разговоре который у меня состоялся на прошлой неделе в Лондоне, кто-то из аудитории спросил, возможно ли автоматически выводить локальные переменные, когда достигнута Точка останова (TracePoint).
Эта возможность не встроена в Visual Studio, но может быть включена при помощи пользовательского макроса и последующей настройки Точки трассировки для вызова макроса, когда эта точка достигнута. Чтобы это выполнить откройте интегрированную среду для макросов внутри Visual Studio (Tools->Macros->Macros IDE menu command). Далее под узлом MyMacros в обозревателе проекта выберите модуль или создайте новый (например: с именем “UsefulThings”). После этого вставьте следующий код макроса на VB в модуль и сохраните его:
Dim outputWindow As EnvDTE.OutputWindow
outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput). Object
Dim currentStackFrame As EnvDTE.StackFrame
outputWindow.ActivePane.OutputString( "*Dumping Local Variables*" + vbCrLf)
For Each exp As EnvDTE.Expression In currentStackFrame.Locals
* This source code was highlighted with Source Code Highlighter .
* This source code was highlighted with Source Code Highlighter .
Код макроса приведенный выше циклически проходит по текущему стеку и выводит все переменные в окно вывода.
Использование нашего пользовательского макроса DumpLocals
Затем мы можем использовать наш пользовательский макрос «DumpLocals» простое дополнительное приложение, которое приведено ниже:
Мы воспользуемся клавишей F9 для установки точки останова на возвращающее выражение в нашем методе
«Add» приведенном выше. Затем щелкнем правой кнопкой на точке останова и выберем из контекстного меню команду «When hit» («Когда останавливаться»):
Мы оставим флажок «continue execution» («продолжить выполнение»), так чтобы программа продолжала выполняться даже после достижения Точки трассировки.
А теперь, когда мы нажмем клавишу F5 и запустим приложение мы увидим следующий вывод в окне «output» («вывод») Visual Studio, когда будет запущен наш метод Add. Заметьте как макрос автоматически выводит в списке имя и значение каждой переменной, когда достигается Точка трассировки:
Отладчик Visual Studio невообразимо богат функциями. Я настоятельно рекомендую выделить определенное время, чтобы по-настоящем изучить все его возможности. Описанные выше советы и трюки представляют лишь малую долю его возможностей о которых люди на самом деле не осведомлены.
В прошлый раз я написал в блоге о других улучшениях в отладчике VS 2010 (включающих вывод подсказки по типу данных (DataTip), Импорт/Экспорт точек останова, Сохранение последних значений переменных и многое другое). Я буду дальше писать в блоге о новых возможностях VS 2010: Intellitrace, а также поддержке Отладки файла дампа. Публикации буду описывать кучу дополнительных крутейших новых возможностей которые могут сделать отладку приложений еще легче.
Также не забудьте посмотреть превосходную серию Скота Кэйта Visual Studio 2010 Tips and Tricks, чтобы узнать как лучше использовать Visual Studio. У него есть бесподобный набор бесплатных видео и публикаций в блоге.
Чтобы получить информацию о работающем приложении, его можно запустить в отладчике. Во время отладки приложение можно выполнять пошагово и помещать точки останова на определенных строках и по достижению определенных условий. Проблема, связанная с отладкой, состоит в том, что программа с рабочим кодом может вести себя иначе, чем программа с отладочным кодом.
Накладные расходы, связанные с трассировкой, очень невелики, потому что уровень трассировки конфигурируется только при необходимости.
Архитектура трассировки состоит из четырех основных частей:
Источник (source)
Источник информации трассировки. Вы используете его для отправки трассировочной информации.
Переключатель (switch)
Определяет уровень информации для протоколирования. Например, можно запрашивать только информацию об ошибках или детальную многословную информацию.
Слушатели (listener)
Фильтры (filter)
Источники трассировки
Например, идентификатор 1 может служить для обозначения входа в метод, а 2 — для выхода из метода. Метод TraceEvent() перегружен, поэтому TraceEventType и идентификатор — это единственные обязательные параметры.
Внутри приложения можно использовать различные источники трассировки. Для различных библиотек имеет смысл определить разные источники, чтобы для разных частей приложения можно было включать различные уровни трассировки. Чтобы использовать источник трассировки, вы должны знать его имя. Обычно в качестве такого имени используется имя сборки.
Переключатели трассировки
Переключатель трассировки можно ассоциировать программно, установив свойство Switch объекта TraceSource. Здесь ассоциированный переключатель типа SourceSwitch имеет имя MyConsoleApplication и уровень Verbose:
Обычно уровень переключателя нужно изменять не перекомпиляцией приложения, а внесением изменений в конфигурацию. Трассировка может быть настроена в элементе <system.diagnostics> конфигурационного файла приложения. Источник трассировки определен элементом <source>, который является дочерним для <sources>. Имя источника в конфигурационном файле должно в точности соответствовать имени источника в коде. Здесь источник трассировки имеет переключатель типа System.Diagnostics.SourceSwitch, ассоциированный с именем MySourceSwitch. Сам переключатель определен в разделе <swithes> и уровень переключателя установлен в verbose:
Теперь можно изменить уровень трассировки, просто изменяя конфигурационный файл, без необходимости перекомпиляции кода. После изменения конфигурационного файла приложение должно быть перезапущено.
Слушатели трассировки
Слушатель EventProviderTraceListener использует формат файла событий, который появился в Windows Vista. Можно также комбинировать веб-трассировку с трассировкой System.Diagnostics и записывать сведения в файл trace.axd.
Слушатель трассировки можно сконфигурировать программно, создав объект слушателя и присвоив его свойству Listeners класса TraceSource. Однако обычно намного интереснее просто изменить конфигурацию, чтобы определить другой слушатель.
Слушатели можно сконфигурировать как дочерние элементы элемента <source>. В этом случае определяется тип класса слушателя и с помощью initializeData указывается направление вывода слушателя. В показанной ниже конфигурации определяются слушатели XmlWriterTraceListener для записи в файл demotrace.xml и DelimitedListTraceListener для записи в файл demotrace.txt:
С таким слушателем можно указывать дополнительную информацию, которая должна быть записана в журнал трассировки. Эта информация задается в XML-атрибуте traceOutputOptions и определена перечислением TraceOptions. Доступными значениями перечисления являются Callstack, DateTime, LogicalOperationStack, ProcessId, Threadld и None. В XML-атрибут traceOutputOptions можно добавлять сразу несколько необходимых значений, разделяя их запятыми, как в слушателе delimitedListener из предыдущего примера.
Аннотация
Требования
В следующем списке описаны рекомендуемые пакеты оборудования, программного обеспечения, сетевой инфраструктуры и служб:
В этой статье также предполагается, что вы знакомы с отладки программ.
Описание техники
Действия в разделе Создание примера с классом отлаговок демонстрируют, как создать консольное приложение, использующее класс для предоставления сведений о Debug выполнении программы.
Прервать: Приложение прекращает работу.
Retry: Приложение вступает в режим отлаживания.
Игнорировать: Приложение продолжает работу. Чтобы продолжить работу приложения, пользователь должен нажать одну из этих кнопок.
Кроме того, можно направлять выход из Debug класса в пункты, не в которые будет вовсю высвеяться окно Вывода. Класс Debug имеет коллекцию "Слушатели", которая включает Listener объекты.
Каждый объект Listener отслеживает выход и направляет выход Debug в заданную цель.
Каждый слушатель в коллекции Listener получает любой выход, который Debug создает класс. Используйте класс TextWriterTraceListener для определения Listener объектов. Вы можете указать цель для TextWriterTraceListener класса с помощью конструктора.
Некоторые возможные целевые показатели вывода включают следующие:
- Окно консоли с помощью System.Console.Out свойства.
- Текстовый (.txt) файл с помощью System.IO.File.CreateText("FileName.txt") заявления. После создания объекта необходимо добавить объект TextWriterTraceListener в Debug . Коллекция слушателей для получения Debug вывода.
Создание примера с классом debug
Добавьте следующее пространство имен в верхней части класса 1 или Program.cs.
Чтобы инициализировать переменные, чтобы содержать сведения о продукте, добавьте в метод Main следующие заявления об объявлении:
Чтобы отобразить содержимое выбранных переменных, используйте WriteLine метод следующим образом:
Вы также можете использовать метод для отображения пространства имен и имени класса WriteLine для существующего объекта. Например, в следующем коде отображается пространство System.Xml.XmlDocument имен в окне Выход:
Создайте объекты для окна консоли (tr1) и текстового файла с именемOutput.txt(tr2), а затем добавьте каждый объект в коллекцию TextWriterTraceListener Debug Listeners:
Чтобы убедиться, что каждый объект получает весь выход, вызывайте метод Флеш для Listener Debug буферов класса:
Использование класса Trace
Классы и классы можно использовать отдельно или вместе Trace Debug в одном приложении. В проекте конфигурации решений отлаговка активны как Trace Debug выходные данные, так и выходные данные. Проект создает выход из обоих классов для всех Listener объектов. Однако проект конфигурации решений выпуска создает выход только из Trace класса. Проект Конфигурация решений выпуска игнорирует Debug вызовы методов классов.
Убедитесь, что он работает
Убедитесь, что debug — это текущая конфигурация решения.
Если окно Обозреватель решений не отображается, нажмите клавишу CTRL+ALT+L, чтобы отобразить это окно.
Щелкните правой кнопкой мыши conInfo и нажмите кнопку Свойства.
В левой области страницы свойств conInfo в папке Конфигурация убедитесь, что стрелка указывает на отладку.
Нажмите клавишу F5 для запуска кода. Когда появится диалоговое окно с неудачным утверждением, нажмите кнопку Игнорировать.
В окне Консоли нажмите кнопку ENTER. Программа должна завершиться, а в окне Output должен отображаться выход, похожий на следующие:
В окне консоли иOutput.txt должен отображаться следующий вывод:
Полное перечисление кода
Устранение неполадок
Если тип конфигурации решения — Release, выход Debug класса игнорируется.
После создания класса для определенной цели вы получаете выход из классов TextWriterTraceListener TextWriterTraceListener и Trace Debug классов. Это происходит независимо от того, используете ли вы метод класса или класс для добавления Add Trace в Debug TextWriterTraceListener Listeners класс.
Если вы добавляете объект для одной и той же цели в классах и классах, каждая строка вывода дублируется независимо от того, создается ли Listeners Trace Debug Debug Trace вывод.
Рассмотрим пример.
В следующем примере приводится простой цикл for с переменной counter, которая увеличивается на единицу каждый раз, когда цикл выполняет очередную итерацию.
Установка точек трассировки в исходном коде
Чтобы установить точки трассировки, можно указать выходную строку под флажком Действие в окне Параметры точки останова.
Чтобы инициализировать точку трассировки, сначала щелкните поле слева от номера строки, в которой требуется установить точку трассировки.
Наведите указатель мыши на красный кружок и щелкните значок шестеренки.
Откроется окно Параметры точки останова.
Установите флажок Действие.
Обратите внимание, что красный кружок изменяется на ромб, что указывает переключение с точки останова на точку трассировки.
Теперь точка трассировки установлена. Если все, что вы хотели сделать, — это записать некоторые сведения в окно вывода, нажмите кнопку "Закрыть".
Существует три варианта условий: условное выражение, фильтр и количество обращений.
Меню "Действия"
Если теперь вы нажмете кнопку Закрыть, а затем запустите отладку программы (нажав клавишу F5), в окне вывода отобразится следующий результат.
Для отображения более точных сведений можно также использовать специальные ключевые слова. Вводите ключевое слово точно так, как показано ниже (указывайте "$" перед каждым ключевым словом, а само ключевое слово записывайте прописными буквами).
Ключевое слово | Что отображается |
---|---|
$ADDRESS | Текущая инструкция |
$CALLER | Имя вызывающей функции |
$CALLSTACK | Стек вызовов |
$FUNCTION | Имя текущей функции |
$PID | ИД процесса |
$PNAME | Имя процесса |
$TID | Идентификатор потока |
$TNAME | Имя потока |
$TICK | Счетчик тактов (из Windows GetTickCount) |
Меню "Условия"
Условное выражение
Поведение условного выражения When Changed зависит от языка программирования.
- В машинном коде отладчик не рассматривает первое вычисление условия как изменение значения, поэтому при первом вычислении выражения точка трассировки не сработает.
- В управляемом коде отладчик активирует точку трассировки при первом вычислении после выбора условия When changed.
Более полный обзор допустимых выражений, которые можно использовать при задании условий, см. в разделе Выражения в отладчике.
Количество обращений
Фильтр
Список выражений фильтра:
- MachineName = "имя"
- ProcessId = значение
- ProcessName = "имя"
- ThreadId = значение
- ThreadName = "имя"
Строки (такие как имена) необходимо заключать в двойные кавычки. Значения можно указывать без кавычек. Предложения можно объединять, используя операторы & ( AND ), || ( OR ), ! ( NOT ) и круглые скобки.
Особенности
Хотя точки трассировки предназначены для того, чтобы сделать интерфейс отладчика более понятным и удобным, при их использовании необходимо учитывать некоторые важные аспекты.
Иногда при проверке свойства или атрибута объекта его значение может измениться. Если значение изменяется во время проверки, эта ошибка не является следствием работы самой точки трассировки. Однако использование точек трассировки для проверки объектов не позволяет избежать этих случайных изменений.
Что мы можем делать во время работы приложения:
· получать значения переменных;
· определять истинность/ложность определенных условий;
· пошагово выполнять наше приложение в целях отладки.
Для этих целей используются объекты Trace и D ebug.
В обычном ASP для вывода информации о работе приложения (на саму страницу или в другое место) использовались команды Response.Write. Применение объекта Trace имеет то преимущество, что отключить все, что относится к его работе, можно просто чуть изменив параметры в файле Web . config . В результате резко упрощается переход от окружения разработки к production.
Кроме того, при трассировке можно также использовать объект Debug . Все вызовы к этому объекту вообще работают только в отладочной конфигурации. В конфигурации R elease они игнорируются.
Трассировку можно включать на разных уровнях.
Первый уровень - уровень страницы. Для включения нужно установить атрибут Trace в директиве Page в True:
После этого на странице можно использовать команды Trace.Write. После того, как атрибут Trace будет убран, эти команды можно не убирать - они будут просто игнорироваться.
Управление трассировкой уровня приложения - через файл Web.config. В нем нужно значение trace enabled переставить в true (по умолчанию оно в - false).
Чтобы добавить возможность выводить информацию трассировки на страницы, нужно добавить код:
(если pageOutput - в false , то информация будет выводиться только в память).
<trace enabled="true" pageOutput="true" localOnly="true"/>
Trace.Write("Custom Trace", "Beginning User Code. ")
Trace.Warn("Custom Trace", "Array count is null!")
Возможность проверить, включена ли трассировка для страницы или включить/выключить ее во время выполнения - свойство Trace.IsEnabled:
If Trace.IsEnabled Then
strMsg = "Tracing is enabled!"
Trace.Write("myTrace", strMsg)
Trace.IsEnabled = False
· Request Details - идентификатор сессии, время запроса, тип запроса, код состояния, кодировки;
· Trace Information - информация о времени начала и конца каждого этапа обработки/генерации страницы;
· Control Tree - перечень всех элементов страницы вместе с информацией о размере каждого элемента;
· Forms Collection (доступна не всегда) - информация об элементах управления и их значениях, которые были переданы на сервер;
· Server Variables - информация о всех серверных переменных и их значениях.
Включить трассировку можно и на уровне всего приложения. В этом случае можно будет просматривать информацию трассировки как на отдельных страницах обычным способом, так и при помощи специального просмотрщика:
Теги на уровне страницы продолжают действовать и они имеют приоритет перед настройками уровня приложения. Если на уровне приложения трассировка будет включена, а на уровне страницы - отключена, побеждают настройки на уровне страницы.
< configuration >
< system . web >
< add verb ="*" path =" trace . axd "
type =" System . Web . Handlers . TraceHandler "/>
Для отключения просмотрщика нужно, чтобы атрибут path выглядел так: path = ""
· импортировать в компонент пространство имен Sy stem.Web:
· включить трассировку в компоненте:
Для возможности удаленной отладки существуют следующие требования:
· VS . NET обязательно должна быть установлена и на клиентском компьютере, с которого производится отладка;
· программист, производящий отладку, должен обладать административными правами на сервер, где находится отлаживаемое Web -приложение (не только Web -сервер, а на сервер целиком);
· пользователя обязательно нужно добавить в группу D ebugger Users на компьютере, где находится отлаживаемое приложение (даже тогда, когда он уже обладает административными правами);
Для выполнения удаленной отладки достаточно на клиентском компьютере открыть VS . NET и в меню File выбрать Open -> Project from Web , затем ввести URL сервера, а затем выбрать нужный проект и нажать O pen .
Читайте также: