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


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

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

Замечание

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

Давайте рассмотрим пример

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

Снимок экрана: пример программы счетчиков.

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


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. Чтобы инициализировать точку трассировки, сначала щелкните слева от номера строки, в котором необходимо задать точку трассировки.

    Снимок экрана: инициализация точки останова в примере кода.

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

  3. Это действие открывает окно параметров точки останова .

    Снимок экрана: окно точки останова.

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

    Снимок экрана: окно точки останова с флажком

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

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

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

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

    Снимок экрана: окно точки останова с флажом

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

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

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

    Снимок экрана: инициализация точки останова в примере кода.

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

    Снимок экрана: окно точки останова.

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

    Снимок экрана: окно точки останова с флажком

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

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

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

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

    Снимок экрана: окно точки останова с флажом

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

Меню действий

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

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

Снимок экрана: выходное сообщение счетчика.

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

Снимок экрана: сообщение

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

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

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

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

Снимок экрана: выходное сообщение счетчика.

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

Снимок экрана: сообщение

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

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

Меню условий

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

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

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

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

Снимок экрана: условное выражение имеет значение True.

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

Снимок экрана: изменение условного выражения.

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

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

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

Снимок экрана: включение при нажатии точки останова.

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

Получение помощи по искусственному интеллекту

Если у вас есть Copilot, вы можете получить помощь СИ во время создания точки трассировки. Copilot предоставляет предложения для условных точек останова и точек трассировки , относящихся к коду.

Снимок экрана: Copilot, работающий над предложениями по условной точке останова.

Дополнительные сведения см. в разделе Отладка с помощью Copilot.

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

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

Снимок экрана: условное выражение имеет значение True.

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

Снимок экрана: изменение условного выражения.

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

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

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

Количество попаданий

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

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

Снимок экрана: число попаданий условного выражения.

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

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

Снимок экрана: число попаданий условного выражения.

Вы также можете удалить точку останова в первом попадании, включив флажок "Удалить точку останова после нажатия".

Снимок экрана: удаление точки останова при первом нажатии.

Filter

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

Снимок экрана: фильтр условного выражения.

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

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

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

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

Снимок экрана: фильтр условного выражения.

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

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

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

Соображения

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

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

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

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