控制进程和线程
执行用户模式调试时,可以激活、显示、冻结、取消冻结、挂起和取消挂起进程和线程。
当前或活动进程是当前正在调试的进程。 同样, 当前 线程或 活动 线程是调试器当前正在控制的线程。 许多调试器命令的操作由当前进程和线程的标识决定。 当前进程还确定调试器使用的虚拟地址映射。
调试开始时,当前进程是调试器附加到的进程,或者是导致异常进入调试器的进程。 同样,当前线程是调试器附加到进程时处于活动状态或导致异常的线程。 但是,可以使用调试器更改当前进程和线程,以及冻结或取消冻结单个线程。
在内核模式调试中,进程和线程不受本节中所述的方法控制。 有关如何在内核模式下操作进程和线程的详细信息,请参阅 更改上下文。
显示进程和线程
若要显示进程和线程信息,可以使用以下方法:
设置当前进程和线程
若要更改当前进程或线程,可以使用以下方法:
|s (设置当前进程) 命令
~s (设置当前线程) 命令
仅) “进程和线程”窗口 (WinDbg
冻结和挂起线程
调试器可以通过 暂停 线程或 冻结 线程来更改线程的执行。 这两个操作具有一些不同的效果。
每个线程都有一个与之关联的 挂起计数 。 如果此计数为 1 或更大,则系统不会运行线程。 如果计数为零或更低,则系统在适当时运行线程。
通常,每个线程的挂起计数为零。 当调试器附加到某个进程时,它将该进程中所有线程的挂起计数递增 1。 如果调试器从进程分离,则会将所有挂起计数减 1。 调试器执行进程时,它会暂时将所有挂起计数减一。
可以使用以下方法控制调试器中任何线程的挂起计数:
这些命令最常见的用途是将特定线程的暂停计数从 1 提高到 2。 当调试器执行或从进程分离时,线程的挂起计数为 1,并且即使进程中的其他线程正在执行,也会保持挂起状态。
即使在执行 非侵入性调试时,也可以挂起线程。
调试器还可以 冻结 线程。 此操作类似于以某种方式挂起线程。 但是,“冻结”只是调试器设置。 Windows 操作系统中的任何内容都不会识别到此线程有任何不同之处。
默认情况下,所有线程都是取消冻结的。 当调试器导致进程执行时,冻结的线程不会执行。 但是,如果调试器从进程分离,则所有线程都会解冻。
若要冻结和取消冻结单个线程,可以使用以下方法:
~f (冻结线程) 命令冻结指定的线程。
~u (取消冻结线程) 命令可解冻指定的线程。
在任何情况下,当调试器进入目标进程时,属于目标进程的线程永远不会执行。 仅当调试器执行进程或分离时,线程的挂起计数才会影响线程的行为。 仅当调试器执行进程时,冻结状态才影响线程的行为。
其他命令中的线程和进程
可以在许多其他命令之前添加线程说明符或进程说明符。 有关详细信息,请参阅各个命令主题。
可以在许多命令和扩展命令之前添加 ~e (线程特定的命令) 限定符。 此限定符会导致针对指定的线程执行命令。 如果要将命令应用于多个线程,此限定符特别有用。 例如,以下命令对正在调试的每个线程重复 !gle extension 命令。
~*e !gle
多个系统
调试器可以同时附加到多个目标。 当这些进程包括转储文件或包含多台计算机上的实时目标时,调试器将为每个操作引用系统、进程和线程。 有关此类调试的详细信息,请参阅 调试多个目标。