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


Запись сведений в окне выхода с помощью точек трассировки в Visual Studio

Точки трассировки позволяют записывать сведения в окно выхода в разделе настраиваемых условий без изменения или остановки кода. Эта функция поддерживается и для управляемых языков (C#, Visual Basic, F#), и для машинного кода, а также для таких языков, как JavaScript и Python.

Примечание.

Сведения о ведении журнала в окне вывода программным способом с помощью API .NET см. в разделе "Отправка сообщений в окно вывода".

Рассмотрим пример

В следующем примере приводится простой цикл for с переменной counter, которая увеличивается на единицу каждый раз, когда цикл выполняет очередную итерацию.

Screenshot of a sample counter program.

В следующем примере приводится простой цикл for с переменной counter, которая увеличивается на единицу каждый раз, когда цикл выполняет очередную итерацию.


using System.Diagnostics;

namespace Tracepoints
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int counter = 0;
            for (int i=0; i<=10; i++)
            {
                counter +=1;
            }
        }
    }
}

Установка точек трассировки в исходном коде

Чтобы установить точки трассировки, можно указать выходную строку под флажком Действие в окне Параметры точки останова.

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

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Наведите указатель мыши на красный кружок и щелкните значок шестеренки.

  3. В результате откроется окно Параметры точки останова.

    Screenshot showing Breakpoint Window.

  4. Установите флажок Действие.

    Screenshot of breakpoint window with Actions Box checked.

    Обратите внимание, что красный кружок изменяется на ромб, что указывает переключение с точки останова на точку трассировки.

  5. Введите сообщение, которое хотите выводить, в текстовое поле Показать сообщение в окне вывода (дополнительные сведения см. следующих разделах этой статьи).

    Теперь точка трассировки установлена. Если все, что вы хотели сделать, — это записать некоторые сведения в окно вывода, нажмите кнопку "Закрыть".

  6. Если вы хотите добавить условия, определяющие, когда должно отображаться ваше сообщение, установите флажок Условия.

    Screenshot of breakpoint window with Conditions Box checked.

    У вас есть три варианта условий: условное выражение, фильтр и число попаданий.

Чтобы установить точки трассировки, можно указать выходную строку под флажком Действие в окне Параметры точки останова.

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

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Наведите указатель мыши на красный кружок и щелкните значок шестеренки, чтобы открыть окно Параметры точки останова.

    Screenshot showing Breakpoint Window.

  3. Установите флажок Действие.

    Screenshot of breakpoint window with Actions Box checked.

    Обратите внимание, что красный кружок изменяется на ромб, что указывает переключение с точки останова на точку трассировки.

  4. Введите сообщение, которое хотите выводить, в текстовое поле Показать сообщение в окне вывода (дополнительные сведения см. следующих разделах этой статьи).

    Теперь точка трассировки установлена. Если все, что вы хотели сделать, — это записать некоторые сведения в окно вывода, нажмите кнопку "Закрыть".

  5. Если вы хотите добавить условия, определяющие, когда должно отображаться ваше сообщение, установите флажок Условия.

    Screenshot of breakpoint window with Conditions Box checked.

    У вас есть три варианта условий: условное выражение, фильтр и число попаданий.

Меню "Действия"

Это меню позволяет записывать сообщения в окно вывода. Введите строки, которые хотите выводить, в поле сообщения (кавычки не требуются). Если нужно отображать значения переменных, обязательно заключайте переменные в фигурные скобки.

Например, чтобы отображать значение переменной counter в консоли вывода, в текстовом поле сообщения введите {counter}.

Screenshot showing Counter Output Message.

Если теперь вы нажмете кнопку Закрыть, а затем запустите отладку программы (нажав клавишу F5), в окне вывода отобразится следующий результат.

Screenshot showing Actions Message In Output Window.

Для отображения более точных сведений можно также использовать специальные ключевые слова. Вводите ключевое слово точно так, как показано ниже (указывайте "$" перед каждым ключевым словом, а само ключевое слово записывайте прописными буквами).

Ключевое слово Что отображается
$ADDRESS Текущая инструкция
$CALLER Имя вызывающей функции
$CALLSTACK Стек вызовов
$FUNCTION Имя текущей функции
$PID Идентификатор процесса
$PNAME Имя процесса
$TID Идентификатор потока
$TNAME Имя потока
$TICK Счетчик тактов (из Windows GetTickCount)

Это меню позволяет записывать сообщения в окно вывода. Введите строки, которые хотите выводить, в поле сообщения (кавычки не требуются). Если нужно отображать значения переменных, обязательно заключайте переменные в фигурные скобки.

Например, чтобы отображать значение переменной counter в консоли вывода, в текстовом поле сообщения введите {counter}.

Screenshot showing Counter Output Message.

Если теперь вы нажмете кнопку Закрыть, а затем запустите отладку программы (нажав клавишу F5), в окне вывода отобразится следующий результат.

Screenshot showing Actions Message In Output Window.

Для отображения более точных сведений можно также использовать специальные ключевые слова. Вводите ключевое слово точно так, как показано ниже (указывайте "$" перед каждым ключевым словом, а само ключевое слово записывайте прописными буквами).

Ключевое слово Что отображается
$ADDRESS Текущая инструкция
$CALLER Имя вызывающей функции
$CALLSTACK Стек вызовов
$FUNCTION Имя текущей функции
$PID Идентификатор процесса
$PNAME Имя процесса
$TID Идентификатор потока
$TNAME Имя потока
$TICK Счетчик тактов (из Windows GetTickCount)

Меню "Условия"

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

Условное выражение

Когда используется условное выражение, выходное сообщение отображается только при соблюдении определенных условий.

С помощью условных выражений можно задать, чтобы точка трассировки выводила сообщение, когда определенное условие имеет значение true или когда значение условия изменилось. Например, если требуется отображать значение счетчика только во время четных итераций цикла for, можно выбрать вариант Is true и ввести в текстовом поле сообщения i%2 == 0.

Screenshot showing Conditional Expression Is True.

Если вы хотите печатать значение счетчика при изменении итерации цикла for, выберите When changed и введите в текстовом поле сообщения i.

Screenshot showing when Conditional Expression is Changed.

Поведение параметра При изменении зависит от языка программирования.

  • В машинном коде отладчик не рассматривает первое вычисление условия как изменение значения, поэтому при первом вычислении выражения точка трассировки не сработает.
  • В управляемом коде отладчик активирует точку трассировки при первом вычислении после выбора условия При изменении.

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

Когда используется условное выражение, выходное сообщение отображается только при соблюдении определенных условий.

С помощью условных выражений можно задать, чтобы точка трассировки выводила сообщение, когда определенное условие имеет значение true или когда значение условия изменилось. Например, если требуется отображать значение счетчика только во время четных итераций цикла for, можно выбрать вариант Is true и ввести в текстовом поле сообщения i%2 == 0.

Screenshot showing Conditional Expression Is True.

Если вы хотите печатать значение счетчика при изменении итерации цикла for, выберите When changed и введите в текстовом поле сообщения i.

Screenshot showing when Conditional Expression is Changed.

Поведение параметра При изменении зависит от языка программирования.

  • В машинном коде отладчик не рассматривает первое вычисление условия как изменение значения, поэтому при первом вычислении выражения точка трассировки не сработает.
  • В управляемом коде отладчик активирует точку трассировки при первом вычислении после выбора условия При изменении.

Вы также можете задать условие, при котором точка трассировки может быть включена, вставив точку останова в определенный раздел кода и установив флажок Включить только при срабатывании следующей точки останова: в меню Параметры точки останова. В списке вариантов можно выбрать любую точку останова.

Screenshot showing enable when a breakpoint is hit checked.

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

Количество обращений

Условие "количество обращений" позволяет отправлять выходное сообщение только после того, как строка кода, в которой установлена точка трассировки, выполнилась указанное число раз.

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

Screenshot showing Conditional Expression Hit Count.

Условие "количество обращений" позволяет отправлять выходное сообщение только после того, как строка кода, в которой установлена точка трассировки, выполнилась указанное число раз.

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

Screenshot showing Conditional Expression Hit Count.

Вы также можете удалить точку останова при первом обращении, установив флажок Remove breakpoint once hit (Удалить точку останова после срабатывания).

Screenshot showing Remove breakpoint on first hit.

Фильтр

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

Screenshot showing Conditional Expression Filter.

Список выражений фильтра:

  • MachineName = "имя"
  • ProcessId = значение
  • ProcessName = "имя"
  • ThreadId = значение
  • ThreadName = "имя"

Строки (такие как имена) необходимо заключать в двойные кавычки. Значения можно указывать без кавычек. Предложения можно объединять, используя операторы & (AND), || (OR), ! (NOT) и круглые скобки.

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

Screenshot showing Conditional Expression Filter.

Список выражений фильтра:

  • MachineName = "имя"
  • ProcessId = значение
  • ProcessName = "имя"
  • ThreadId = значение
  • ThreadName = "имя"

Строки (такие как имена) необходимо заключать в двойные кавычки. Значения можно указывать без кавычек. Предложения можно объединять, используя операторы & (AND), || (OR), ! (NOT) и круглые скобки.

Рекомендации

Хотя точки трассировки предназначены для более чистой отладки и более плавной работы, когда дело доходит до их использования, необходимо учитывать некоторые рекомендации.

Иногда при проверке свойства или атрибута объекта его значение может измениться. Если значение изменяется во время проверки, эта ошибка не является следствием работы самой точки трассировки. Однако использование точек трассировки для проверки объектов не позволяет избежать этих случайных изменений.

Выражения в поле сообщений Действие могут вычисляться не таким способом, как в языке программирования, который вы используете для разработки. Например, чтобы вывести строку, не нужно заключать сообщение в кавычки, даже если обычно вы должны это делать при использовании Debug.WriteLine() или console.log(). Кроме того, синтаксис фигурных скобок ({ }) для выражений вывода также может отличаться от правил для вывода значений в используемом вами языке разработки. (Однако содержимое в фигурных скобках ({ }) в любом случае должно быть написано с использованием синтаксиса используемого языка разработки.)

Если вы пытаетесь отладить интерактивное приложение и ищете какую-нибудь аналогичную функцию, ознакомьтесь с нашей функциональностью точек ведения журнала в Snapshot Debugger. Отладчик моментальных снимков — это средство, используемое для исследования проблем в рабочих приложениях. Точки ведения журнала также позволяют отправлять сообщения в окно вывода без изменения исходного кода и не влияют на работу приложения. Дополнительные сведения см. в статье Отладка интерактивных приложений Azure.