Debugging Tools for Windows

控制进程和线程

当进行用户模式调试时,可以激活、显示、冻结、解冻、挂起、恢复进程和线程。

当前正被调试的进程称为当前活动进程。类似的,当前调试器正在控制的线程称为当前线程或活动线程。很多调试器命令的行为由当前进程和当前线程决定。

调试开始时,当前进程是调试器附加到的进程或因为异常中断到调试器的进程。同样,当前线程是当调试器附加到进程时的线程或产生异常的线程。但是,可以利用调试器改变当前线程和进程,也可以分别冻结或解冻线程。

在内核模式调试下,不使用本节描述的方法来控制线程和进程。关于在内核模式下操作进程和线程的更多信息,查看改变上下文

显示进程和线程

使用如下方法显示进程和线程信息:

设置当前进程和当前线程

使用如下方法改变当前进程和线程:

冻结和挂起线程

调试器可以通过挂起冻结线程来改变它的执行。这两种操作有一些不同的地方。

每个线程都有一个关联的挂起计数(suspend count)。如果这个数字是大于等于1,则系统不会运行该线程。如果计数小于等于0,系统会在适当的时机运行该线程。

一般来说,每个线程的挂起计数都是0。当调试器附加到进程时,会将它的所有线程的挂起计数加1。如果调试器停止对进程的附加,会将所有挂起计数减1。当调试器执行进程时,会临时将所有的挂起计数减少1。

使用下面一些方法可以用调试器控制任何一个线程的挂起计数:

一般用这些命令来将指定线程的挂起计数从1加到2。当调试器执行或停止附加进程时,该线程由于挂起计数为1,即使进程中其他线程都开始执行,该线程仍然保持挂起。

在进行非侵入式调试时也可以挂起线程。

调试器也可以冻结线程。该行为和以某些方式挂起线程类似。但是,"冻结"仅仅是一种调试器设置。Windows系统不会知道该线程有任何不同点。

默认情况下,所有线程都是非冻结的。当调试器运行进程时,被冻结的线程不会运行。但是,当调试器停止对该进程的附加时,所有线程都会变为非冻结状态。

使用下面一些方法来冻结和解冻各个线程:

在任何情况下,当调试器中断目标时,该进程中的所有线程永远不会被执行。线程的挂起计数仅在调试器运行进程或者停止进程附加时有效。冻结状态仅在调试器运行进程时有效。

其他命令中的线程和进程

在很多其他命令中也可以指定进程或线程。更多信息,查看各个命令的主题。

在很多命令和扩展命令前都可以加上~e (Thread-Specific Command)  限定词。该限定词使得命令对指定线程起作用。在想对一个以上线程使用某个命令时它非常有用。例如,下面的命令对被调使得所有线程使用!gle扩展命令。

~*e !gle 

多系统

调试器可以同一时刻附加到多个目标。当这些处理包含不止一台计算机上的dump文件或活动目标时,调试器的每个行为都以一个系统、进程和线程为基准。关于这类调试的更多信息,查看调试多个目标

Build machine: CAPEBUILD