使用 KDbgCtrl

KDbgCtrl (内核调试控件,kdbgctrl.exe) 工具可用于控制来自目标计算机的内核调试连接。

若要使用此工具,目标计算机必须运行 Windows Server 2003 或更高版本的 Windows。

KDbgCtrl 可以控制五种不同的设置:完整内核调试、自动内核调试、User-Mode 错误处理、阻止内核调试以及 DbgPrint 缓冲区的大小。

若要使用 KDbgCtrl,必须在上次启动之前已在目标计算机的启动设置中启用了内核调试。 如果未执行此操作,则 KDbgCtrl 不能用于启用内核调试。 有关这些启动设置的详细信息 ,请参阅启动参数以启用调试

完整内核调试

启用完整内核调试后,在主计算机上运行的内核调试器可能会中断到目标计算机中。 如果命中内核模式异常,目标计算机将中断内核调试器。 还允许从目标到主机的消息,例如 DbgPrint 输出、符号加载消息和重定向的用户模式调试器。

如果禁用此设置,目标将忽略来自主计算机的所有信号。

默认启用完整内核调试。 若要检查当前设置值,请使用 kdbgctrl -c。 若要禁用此设置,请使用 kdbgctrl -d。 若要启用此设置,请使用 kdbgctrl -e

如果要检查当前设置,并使用它来控制批处理文件中的执行,可以使用 kdbgctrl -cx 命令。 有关此命令的详细信息,请参阅 KDbgCtrl Command-Line 选项

自动内核调试

如果启用了完整内核调试,则自动内核调试的当前设置不重要 -- 允许所有通信。

禁用完整内核调试并启用自动内核调试时,只有目标计算机可以启动调试连接。

在这种情况下,只有内核模式异常、断点或其他内核模式事件才会建立连接。 不会为 DbgPrint 输出、符号加载消息、重定向的用户模式调试器输入和输出或其他类似消息建立连接 - 这些消息将存储在 DbgPrint 缓冲区中,而不是发送到内核调试器。

如果异常或事件导致目标中断到内核调试器中,则完全内核调试将自动打开,就像执行 kdbgctrl -e 一样。

默认情况下,自动内核调试处于禁用状态, (尽管这是无关紧要的,除非禁用了全内核调试以及) 。 若要检查当前设置值,请使用 kdbgctrl -ca。 若要禁用此设置,请使用 kdbgctrl -da。 若要启用此设置,请使用 kdbgctrl -ea

用户模式错误处理

启用 User-Mode 错误处理后,某些用户模式事件将导致目标计算机中断内核调试器。

具体而言,所有 int 3 中断(例如调试器插入到代码中的断点或对 DbgBreakPoint 的调用)都将导致内核调试器中断。 但是,标准异常(如访问冲突和被零除)通常不会发送到内核调试器。

如果用户模式调试器已附加到进程,则此调试器将捕获所有用户模式错误,并且不会更改内核调试器。 有关各种用户模式错误处理程序的优先级排名,请参阅 启用事后调试

若要 User-Mode 错误处理才能正常工作,还必须启用“完全内核调试”或“自动内核调试”。

User-Mode 默认启用错误处理。 若要检查当前设置值,请使用 kdbgctrl -cu。 若要禁用此设置,请使用 kdbgctrl -du。 若要启用此设置,请使用 kdbgctrl -eu

阻止内核调试

在某些情况下,你可能想要设置目标计算机进行内核调试,但要等到启动目标计算机之后再启用内核调试。 可以通过阻止内核调试来执行此操作。

重要

在使用 BCDEdit 更改启动信息之前,可能需要暂时挂起测试电脑上的 Windows 安全功能,例如 BitLocker 和安全启动。 测试完成后重新启用这些安全功能,并在禁用安全功能时适当地管理测试电脑。

若要阻止内核调试,请使用如下所示的命令设置目标计算机:

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:32 /start DISABLE /noumex

重启目标计算机时,将为内核调试做好准备,但内核调试和 User-Mode 错误处理将被禁用。 此时,主计算机将无法附加到目标计算机,内核调试器不会捕获 bug 检查,并且用户模式异常不会导致内核调试器中断。

准备就绪后,可以通过输入以下命令来启用内核调试 (,而无需重启目标计算机) 。

kdbgctrl -db
kdbgctrl -e

稍后,可以通过输入以下命令来禁用内核调试。

kdbgctrl -d
kdbgctrl -eb

可以使用 kdbgctrl -cb 检查是否阻止内核调试。

DbgPrint 缓冲区大小

DbgPrint 缓冲区存储目标计算机已发送到内核调试器的消息。

如果启用了完整内核调试,这些消息将自动显示在内核调试器中。 但是,如果禁用此选项,这些消息将存储在缓冲区中。 稍后可以启用内核调试,连接到内核调试器,并使用 !dbgprint 扩展查看此缓冲区的内容。 有关此缓冲区的详细信息,请参阅 DbgPrint 缓冲区。

在免费版本的 Windows 上,DbgPrint 缓冲区的默认大小为 4 KB。 若要确定当前缓冲区大小,请使用 kdbgctrl -cdb。 若要更改缓冲区大小,请使用 kdbgctrl -sdbSize,其中 Size 指定新的缓冲区大小。 有关语法详细信息,请参阅 KDbgCtrl Command-Line 选项

示例

若要显示所有当前设置,请使用以下命令:

kdbgctrl -c -ca -cu -cb -cdb 

若要还原默认设置,请使用以下命令:

kdbgctrl -e -da -eu -db -sdb 0x1000 

若要锁定主计算机,使其仅在出现异常时联系,请使用以下命令:

kdbgctrl -d -ea -eu 

若要禁用所有内核调试,请使用以下命令:

kdbgctrl -d -da 

如果要禁用所有内核调试,可能还希望增加 DbgPrint 缓冲区的大小。 这可确保保存所有消息,以防稍后需要查看它们。 如果有一兆字节的内存要备用,则可以使用以下命令:

kdbgctrl -sdb 0x100000