在 Visual Studio 中使用跟踪点将信息记录到“输出”窗口中

借助跟踪点,你可以在可配置的条件下将信息记录到“输出”窗口,而无需修改或停止运行代码。 托管语言(C#、Visual Basic、F#)和本机代码以及 JavaScript 和 Python 等语言均支持此功能。

注意

如需了解如何使用 .NET API 以编程方式将信息记录到输出窗口,请参阅将消息发送到输出窗口

举例说明

下面的示例程序是一个简单的 for 循环,其中包含一个计数器变量,每当循环运行另一个迭代时,该变量都会增加一。

Screenshot of a sample counter program.

下面的示例程序是一个简单的 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. 要初始化跟踪点,请首先单击要设置跟踪点的行号左侧的装订线。

    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 进程 ID
$PNAME 进程名
$TID 线程 ID
$TNAME 线程名
$TICK 滴答计数(来自 Windows GetTickCount)

使用此菜单可将消息记录到“输出”窗口。 在消息框中键入要输出的字符串(无需引号)。 如果要显示变量的值,请确保将其括在大括号中。

例如,如果要在输出控制台中显示 counter 变量的值,请在消息文本框中键入 {counter}

Screenshot showing Counter Output Message.

如果单击“关闭”,然后调试程序 (F5),你会在“输出”窗口中看到以下输出 。

Screenshot showing Actions Message In Output Window.

此外,还可以使用特殊关键字来显示更多特定信息。 完全按照以下所示输入关键字(在每个关键字前面使用“$”,并且关键字本身全部大写)。

关键字 显示内容
$ADDRESS 当前指令
$CALLER 调用函数名
$CALLSTACK 调用堆栈
$FUNCTION 当前函数名
$PID 进程 ID
$PNAME 进程名
$TID 线程 ID
$TNAME 线程名
$TICK 滴答计数(来自 Windows GetTickCount)

“条件”菜单

使用条件可以筛选输出消息,以便仅在某些情况下显示它们。 有三种主要条件可供使用。

条件表达式

对于条件表达式,仅在满足某些条件时才显示输出消息。

对于条件表达式,可以将跟踪点设置为在特定条件得到满足或发生变化时输出消息。 例如,如果只想在 for 循环的偶数次迭代期间显示计数器的值,可以选择“为 true”选项,然后在消息文本框中键入 i%2 == 0

Screenshot showing Conditional Expression Is True.

如果要在 for 循环的迭代更改时打印计数器的值,请选择“更改时”选项,然后在消息文本框中键入 i

Screenshot showing when Conditional Expression is Changed.

不同编程语言中“更改时”选项的行为不同。

  • 对于本机代码,调试器不会将条件的第一次计算当作一次更改,所以第一次计算时不会命中跟踪点。
  • 对于托管代码,当选择了“更改时”,调试程序将在之后的第一次计算时命中跟踪点。

有关在设置条件时可以使用的有效表达式的更全面的信息,请参阅调试器中的表达式

对于条件表达式,仅在满足某些条件时才显示输出消息。

对于条件表达式,可以将跟踪点设置为在特定条件得到满足或发生变化时输出消息。 例如,如果只想在 for 循环的偶数次迭代期间显示计数器的值,可以选择“为 true”选项,然后在消息文本框中键入 i%2 == 0

Screenshot showing Conditional Expression Is True.

如果要在 for 循环的迭代更改时打印计数器的值,请选择“更改时”选项,然后在消息文本框中键入 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.

你也可以通过启用“命中时删除断点”复选框来在首次命中时删除断点。

Screenshot showing Remove breakpoint on first hit.

筛选器

对于筛选条件,请指定显示哪些设备、进程或线程的输出。

Screenshot showing Conditional Expression Filter.

筛选表达式列表:

  • MachineName = "name"
  • ProcessId = value
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

将字符串(例如名称)用双引号引起来。 输入值时可以不带引号。 可以使用 & (AND)、|| (OR)、! (NOT) 和括号合并子句。

对于筛选条件,请指定显示哪些设备、进程或线程的输出。

Screenshot showing Conditional Expression Filter.

筛选表达式列表:

  • MachineName = "name"
  • ProcessId = value
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

将字符串(例如名称)用双引号引起来。 输入值时可以不带引号。 可以使用 & (AND)、|| (OR)、! (NOT) 和括号合并子句。

注意事项

跟踪点旨在使调试更简洁、更流畅。 使用跟踪点时,应注意以下事项。

有时,当检查对象的属性或特性时,其值可能会更改。 如果值在检查过程中发生变化,这并不是跟踪点功能本身导致的 bug。 但是,使用跟踪点检查对象并不能避免这些意外修改。

“操作”消息框的表达式计算方式可能与你当前用于开发的语言不同。 例如,要输出字符串,无需将消息用引号引起来,即使在使用 Debug.WriteLine()console.log() 时通常会这样做。 此外,用于输出表达式的大括号语法 ({ }) 也可能与以开发语言输出值的约定不同。 (但是,大括号 ({ }) 中的内容仍应使用开发语言的语法来编写)。

如果尝试调试实时应用程序并查找类似的功能,请查看 Snapshot Debugger 中的记录点功能。 快照调试器是用于调查生产应用程序中问题的工具。 借助记录点,还可以将消息发送到“输出”窗口,而无需修改源代码,并且不会影响正在运行的应用程序。 有关详细信息,请参阅调试实时 Azure 应用程序