如何:使用“线程”窗口

更新:2007 年 11 月

本主题适用于:

版本

Visual Basic

C#

C++

Web Developer

速成版

主题不适用 主题不适用 主题不适用 主题不适用

标准版

主题适用 主题适用 主题适用 主题适用

专业团队版

主题适用 主题适用 主题适用 主题适用

表格图例:

主题适用

适用

主题不适用

不适用

主题适用,但命令默认情况下隐藏

默认情况下隐藏的一条或多条命令。

使用“线程”窗口,可以检查和操作正在调试的程序中的线程。

“线程”窗口中包含当前存在于程序中的所有线程的列表。该列表针对每个线程提供以下有用的信息:

  • “名称”和“ID”列显示线程的名称和标识号,以便帮助您识别线程。

  • “优先级”列显示系统已向每个线程分配的优先级。

  • “挂起”列显示挂起计数,后者决定某个线程当前是否能够运行。有关挂起计数的解释,请参见本主题的“冻结和解冻线程”一节。

  • “类别”列将线程划分为用户界面线程、远程过程调用处理程序或辅助线程。此列还标识主线程。

  • “位置”列显示在其中创建线程的源位置。

  • 标记列不带标记并位于最左侧。在标记要进行研究的线程时,一个标记图标将显示在此列中。有关如何标记线程的说明,请参见如何:标记线程和取消标记线程

  • 最后,还有一个不带标记的列,即从左侧起的第二列。此列是活动线程列。此列中的黄色箭头指示一个活动线程。

以中断模式或运行模式显示“线程”窗口

  • 在“调试”菜单上指向“窗口”,再单击“线程”。

对线程列表排序

  1. 在“线程”窗口中单击任意列顶部的按钮。

    • 若要将标记的线程排序到列表顶部,请单击最左侧的按钮。

    • 若要将活动线程排序到列表顶部,请单击从左侧起的第二个按钮。

    • 若要将 ID 号最小的线程排序到顶部,请单击“ID”按钮。

    • 若要按照类别对线程排序,请单击“类别”按钮。这会使线程按功能类别排序,而这些类别按字母顺序排序。

    • 若要按照名称对线程排序,请单击“名称”按钮。

    • 若要按照源位置对线程排序,请单击“位置”按钮。

    • 若要将具有最高优先级的线程排序到顶部,请单击“优先级”按钮。

    • 若要将挂起计数最小的线程排序到顶部,请单击“挂起”按钮。

  2. 如果希望颠倒排序顺序,请再次单击相同按钮。例如,如果按照线程 ID 号排序,则会将 ID 号最小的线程排序到顶部。如果再次单击“ID”按钮,则会将 ID 号最大的线程排序到顶部。

将调试上下文切换到其他线程

  • 在“线程”窗口中右击某个线程,并在快捷菜单上选择“切换到线程”。

    - 或 -

  • 双击任一线程。

    黄色箭头表示活动线程。

冻结和解冻线程

可以冻结或解冻线程。当线程冻结时,即便有可用资源,系统也不会开始该线程的执行。

在本机代码中,可以通过调用 Windows 函数 SuspendThread 和 ResumeThread 或者 MFC 函数 CWinThread::SuspendThreadCWinThread::ResumeThread 来挂起或继续线程。调用 SuspendThread 或 ResumeThread 将更改在“线程”窗口中显示的挂起计数。但是,冻结或解冻本机线程不会更改挂起计数。在本机代码中线程将无法执行,除非该线程解冻并且其挂起计数为零。

在托管代码中,冻结或解冻线程不会更改挂起计数。在托管代码中,冻结线程的挂起计数为 1。在本机代码中,冻结线程的挂起计数为 0,除非该线程由 SuspendThread 调用挂起。

说明:

在调试本机代码对托管代码的调用时,托管代码与调用它的本机代码在同一个物理线程中运行。挂起或冻结本机线程也会冻结托管代码。

冻结(防止执行)线程

  • 在“线程”窗口中右击某个线程,并在快捷菜单上选择“冻结”。

解冻(允许执行)线程

  • 在“线程”窗口中右击某个线程,并在快捷菜单上选择“解冻”。

显示线程调用堆栈并在帧之间切换

在多线程程序中,每个线程都有自己的调用堆栈。“线程”窗口提供了一种查看线程调用堆栈的简便方法。

查看线程的调用堆栈

  • 在“线程”窗口中,将鼠标指针放在活动线程列内与要研究的线程相对应的行上。

    经过短暂的延迟后,将会出现数据提示。其中显示线程的调用堆栈。

请参见

任务

演练:调试多线程应用程序

其他资源

调试多线程应用程序