切换模式

从内核调试器控制用户模式调试时,会遇到四种不同的模式,并且可以通过多种方式在它们之间切换。

注意 在描述此方案时, 目标应用程序 是指正在调试的用户模式应用程序, 目标计算机 是指包含目标应用程序和 CDB 或 NTSD 进程的计算机, 而主计算机 是指包含内核调试器的计算机。

将遇到以下四种模式:

用户模式调试
目标计算机和目标应用程序已冻结。 用户模式调试提示显示在内核调试 器的“调试器命令”窗口中 。 在 WinDbg 中,WinDbg 窗口下面板上的提示会显示“输入>”。 可以在此提示符下输入命令(就像在用户模式调试期间输入命令一样),以分析目标应用程序的状态或使其运行或单步执行。 调试器访问的符号文件、扩展 DLL 和其他文件将是目标计算机上的文件,而不是主计算机上的文件。

目标应用程序执行
目标计算机正在运行,目标应用程序正在运行,调试器正在等待。 此模式与让目标在普通调试中运行相同。

睡眠模式
目标计算机正在运行,但目标应用程序已冻结,并且两个调试器都已冻结。 如果必须在目标计算机上执行某些操作,但不想更改调试会话的状态,则此模式非常有用。

内核模式调试
目标计算机和目标应用程序已冻结。 内核模式调试提示 kd> 显示在内核调试器的“调试器命令”窗口中。 此模式是典型的内核模式调试状态。

会话在用户模式调试模式下开始。 以下操作和事件会导致模式更改:

  • 若要从用户模式调试切换到目标应用程序执行,请在提示符处Input>使用 g (Go) 命令。

  • 若要暂时从用户模式调试切换到目标应用程序执行,然后返回到用户模式调试,请使用步骤、跟踪或其他临时执行命令。 有关此类命令的列表,请参阅 控制目标

  • 若要从用户模式调试切换到睡眠模式,请使用 .sleep (暂停调试器) 命令。 此命令已计时。 当时间过期时,系统将返回到用户模式调试。

  • 若要从用户模式调试切换到内核模式调试,请使用 .breakin (Break to the Kernel Debugger) 命令。 请注意,如果调用进程没有管理员权限, .breakin 可能会失败并出现拒绝访问错误。 在这种情况下,通过发出简短 的 .sleep 命令并按 Ctrl+C 切换到 KD。

  • 只能在某些环境中从目标应用程序执行切换到用户模式调试。 如果目标计算机运行的是 Microsoft Windows XP 或更高版本的 Windows 操作系统,则可以使用 !bpid 扩展命令。 如果使用 CDB (而不是 NTSD) ,则可以在目标计算机上激活 CDB 窗口,然后按 Ctrl+C。

  • 如果目标应用程序命中断点、遇到异常、遇到其他一些受控事件或结束,系统会从目标应用程序执行切换到用户模式调试。 应提前计划此类事件,尤其是在使用 NTSD 时。 有关这些事件的详细信息,请参阅使用断点和控制异常和事件

  • 若要从目标应用程序执行切换到内核模式调试,请在 KD 窗口中按 Ctrl+C,按 Ctrl+BREAK 或单击 WinDbg 窗口中的“调试”菜单上的“中断”,或按目标计算机键盘上的 SYSRQ 或 Alt+SYSRQ。 (如果内核调试器是 KD,并且你在内核调试器与用户模式调试器通信的同时按 Ctrl+C,则用户模式调试器可能会捕获按 CTRL+C.)

  • 如果调试器遇到内核错误,或者如果使用 Breakin.exe 工具,系统会从目标应用程序执行切换到内核模式调试。

  • 若要从睡眠模式切换到用户模式调试,请等待睡眠时间过期,使用 -wake 命令行选项在目标计算机上启动新的 CDB 进程,或使用目标计算机上的其他 CDB 或 NTSD 副本中的 .wake (唤醒调试器) 命令。

  • 若要退出内核模式调试,请在提示符处kd>使用 g (Go) 命令。 此命令返回到用户模式调试或目标应用程序执行 (两者中最近使用的状态) 。