适用范围: yes Visual Studio no Visual Studio for Mac no Visual Studio Code

调试多线程应用程序时,“并行堆栈”窗口非常有用。 它有多个视图:

  • “线程”视图 显示应用中所有线程的调用堆栈信息。 可以在线程和这些线程上的堆栈帧之间进行导航。

  • 任务视图 显示以任务为中心的调用堆栈信息。

  • 在托管代码中,“任务”视图示 System.Threading.Tasks.Task 对象的调用堆栈。
  • 在本机代码中,“任务”视图显示 任务组 并行算法 异步代理 轻量级任务 的调用堆栈。
  • 方法视图 以选定方法为中心显示调用堆栈。

    使用“并行堆栈”窗口

    只能在调试会话中打开“并行堆栈”窗口。 选择“调试”>“窗口”>“并行堆栈” 。

    工具栏控件

    “并行堆栈”窗口具有以下工具栏控件:

    与“调用堆栈”窗口上的对应菜单命令相同。 但是在“并行堆栈”窗口中,一个方法可能位于多个帧中。 可以在此项的子菜单中选择所需的帧。 如果堆栈帧中有一个位于当前线程上,则子菜单中会默认选中该帧。 “转到任务”或“转到线程” 切换到“任务”或“线程”视图,并突出显示相同的堆栈帧 。 转到源代码 转到源代码窗口中的相应位置。 转到反汇编 转到“反汇编”窗口中的相应位置。 显示外部代码 显示或隐藏外部代码。 十六进制显示 在十进制和十六进制显示之间切换。 在源中显示线程 标记线程在源代码窗口中的位置。 符号加载信息 打开“符号加载信息”对话框。 打开“符号设置”对话框。 与“调用堆栈”窗口上的对应菜单命令相同。 但是在“并行堆栈”窗口中,一个方法可能位于多个帧中。 可以在此项的子菜单中选择所需的帧。 如果堆栈帧中有一个位于当前线程上,则子菜单中会默认选中该帧。 “转到任务”或“转到线程” 切换到“任务”或“线程”视图,并突出显示相同的堆栈帧 。 转到源代码 转到源代码窗口中的相应位置。 转到反汇编 转到“反汇编”窗口中的相应位置。 显示外部代码 显示或隐藏外部代码。 十六进制显示 在十进制和十六进制显示之间切换。 在源中显示线程 标记线程在源代码窗口中的位置。 符号加载信息 打开“符号加载信息”对话框。 打开“符号设置”对话框。

    在“线程”视图中,当前线程的堆栈帧和调用路径突出显示为蓝色。 线程的当前位置由黄色箭头显示。

    若要更改当前堆栈帧,请双击其他方法。 这也可能会切换当前线程,具体取决于所选的方法属于当前线程还是其他线程。

    当“线程”视图关系图太大而无法放入窗口时,窗口中会出现“鸟瞰视图”控件 。 你可以在该控件中移动帧以导航到关系图的不同部分。

    下图演示的是一个执行从主代码到托管代码再到本机代码的代码转换的线程。 当前方法中包含六个线程。 一个继续运行到 Thread.Sleep,另一个继续运行到 Console.WriteLine 再运行到 SyncTextWriter.WriteLine。

    下表介绍“线程”视图的主要功能:

    下图演示的是一个执行从主代码到托管代码再到本机代码的代码转换的线程。 当前方法中包含 5 个线程。 一个继续执行 ServerClass.InstanceMethod,另一个继续执行 Worker.Thread.Start,然后执行 StartupHook.Initialize.AnonymousMethod。

    下表介绍“线程”视图的主要功能:

    如果应用使用 System.Threading.Tasks.Task 对象(托管代码)或 task_handle 对象(本机代码)来表示并行,则可以使用“任务”视图。 “任务”视图显示任务(而不是线程)的调用堆栈。

    在“任务”视图中:

  • 不显示运行中任务以外的线程的调用堆栈。
  • 身为运行中任务的线程,其调用堆栈的首尾将被隐藏,以显示与任务关系最密切的帧。
  • 当一个线程上有多个任务时,会在单独的节点中显示这些任务的调用堆栈。
  • 若要查看整个调用堆栈,请右键单击堆栈帧并选择“转到线程”以切换回“线程”视图 。

    下图顶部显示的是“线程”视图,底部显示的是对应的“任务”视图 。

    通过切换到新堆栈帧,可使该方法成为当前方法,并在“方法视图”中显示这个新方法的所有调用方和被调用方。 这可能会导致某些线程显示在视图中或从视图中消失,具体取决于线程的调用堆栈上是否显示该方法。 若要返回调用堆栈视图,请再次选择“方法视图”工具栏图标。

    “使用并行堆栈调试线程和任务”视频教程

    这些视频教程演示了如何使用 Visual Studio 2022 中“并行堆栈”窗口的“线程”和“任务”视图来调试多线程应用程序。

  • 使用“并行堆栈”窗口调试任务
  • 使用“并行堆栈”窗口调试线程
  • 开始调试多线程应用程序
  • 演练:调试并行应用程序
  • 在 Visual Studio 中进行调试时切换到另一个线程
  • 调试托管代码
  • 使用“任务”窗口
  • Task 类
  •