使用 KDbgCtrl
KDbgCtrl(内核调试控件, kdbgctrl.exe)工具可用于从目标计算机控制内核调试连接。
要使用该工具,目标计算机必须运行 Windows Server 2003 或更高版本的 Windows。
KDbgCtrl 可以控制五种不同的设置:完全内核调试、自动内核调试、用户模式错误处理、阻止内核调试以及 DbgPrint 缓冲区的大小。
要使用 KDbgCtrl,必须在最后一次启动前在目标计算机的启动设置中启用内核调试。 否则,将无法使用 KDbgCtrl 来启用内核调试。 有关这些启动设置的详细信息,请参阅用于启用调试的启动参数。
完全内核调试
启用“完全内核调试”后,主计算机机上运行的内核调试器可中断至目标计算机。 如果出现内核模式异常,目标计算机将中断至内核调试器。 还允许从目标计算机向主机发送消息,如 DbgPrint 输出、符号加载消息和重定向的用户模式调试器。
如果禁用此设置,则目标计算机将忽略来自主机的所有信号。
完全内核调试默认已启用。 要检查当前设置值,请使用 kdbgctrl -c。 要禁用此设置,请使用 kdbgctrl -d。 要启用此设置,请使用 kdbgctrl -e。
如果要检查当前设置并用它来控制批处理文件的执行,可以使用 kdbgctrl -cx 命令。 有关此命令的详细信息,请参阅 KDbgCtrl 命令行选项。
自动内核调试
如果启用了完全内核调试,则当前的自动内核调试设置将变得无关紧要 - 所有通信都会被允许。
当禁用“完全内核调试”并启用“自动内核调试”时,只有目标计算机才能启动调试连接。
在这种情况下,只有内核模式异常、断点或其他内核模式事件才会导致建立连接。 对于 DbgPrint 输出、符号加载消息、重定向用户模式调试器输入和输出或其他类似消息,将不会建立连接,这些消息将存储在 DbgPrint 缓冲区中,而不会被发送到内核调试器。
如果异常或事件导致目标计算机中断至内核调试器,则完全内核调试将自动打开,就像执行了 kdbgctrl -e 一样。
默认情况下,自动内核调试已被禁用(但这并不重要,除非完全内核调试也被禁用)。 要检查当前设置值,请使用 kdbgctrl -ca。 要禁用此设置,请使用 kdbgctrl -da。 要启用此设置,请使用 kdbgctrl -ea。
用户模式错误处理
启用用户模式错误处理后,某些用户模式事件会导致目标计算机中断至内核调试器。
具体而言,所有 int 3 中断(如调试器插入代码中的断点或调用 DbgBreakPoint)都将导致中断至内核调试器。 但是,标准异常(例如访问冲突和除以零)通常不会被发送到内核调试器。
如果用户模式调试器已附加到进程,则此调试器将捕获所有用户模式错误,并且不会更改内核调试器。 有关各种用户模式错误处理程序的优先级,请参阅启用事后调试。
要使用户模式错误处理发挥作用,必须同时启用完全内核调试或自动内核调试。
默认情况下,用户模式错误处理处于启用状态。 要检查当前设置值,请使用 kdbgctrl -cu。 要禁用此设置,请使用 kdbgctrl -du。 要启用此设置,请使用 kdbgctrl -eu。
阻止内核调试
某些情况下可能需要设置目标计算机进行内核调试,但要等到目标计算机启动后再启用内核调试。 可以通过阻止内核调试来实现这一点。
重要
在使用 BCDEdit 更改启动信息之前,可能需要在测试电脑上暂时挂起 Windows 安全功能,例如 BitLocker 和安全启动。 测试完成后重新启用这些安全功能,并在禁用安全功能时适当地管理测试电脑。
要阻止内核调试,请使用类似以下的命令来设置目标计算机:
bcdedit /debug on
bcdedit /dbgsettings 1394 channel:32 /start DISABLE /noumex
重新启动目标计算机时,它将为内核调试做好准备,但内核调试和用户模式错误处理将被禁用。 此时,主计算机将无法连接到目标计算机,内核调试器无法捕捉错误检查,而用户模式异常也不会导致中断至内核调试器。
准备就绪后,输入以下命令即可启用内核调试(无需重启目标计算机)。
kdbgctrl -db
kdbgctrl -e
之后,可以通过输入以下命令禁用内核调试。
kdbgctrl -d
kdbgctrl -eb
可以使用 kdbgctrl -cb 检查内核调试是否被阻止。
DbgPrint 缓冲区大小
DbgPrint 缓冲区会存储目标计算机发送给内核调试器的消息。
如果启用了完全内核调试,这些消息将自动显示在内核调试器中。 但如果禁用了该选项,则这些消息将存储在缓冲区中。 稍后,可以启用内核调试,连接到内核调试器,并使用 !dbgprint 扩展来查看该缓冲区的内容。 有关该缓冲区的详细信息,请参阅 DbgPrint 缓冲区。
在 Windows 的免费版本中,DbgPrint 缓冲区的默认大小为 4 KB。 要确定当前缓冲区大小,请使用 kdbgctrl -cdb。 要更改缓冲区大小,请使用 kdbgctrl -sdbSize,其中 Size 用于指定新的缓冲区大小。 有关语法详细信息,请参阅 KDbgCtrl 命令行选项。
示例
要显示所有当前设置,请使用以下命令:
kdbgctrl -c -ca -cu -cb -cdb
要恢复默认设置,请使用以下命令:
kdbgctrl -e -da -eu -db -sdb 0x1000
要锁定主机,使其只能在异常时与之联系,请使用以下命令:
kdbgctrl -d -ea -eu
要禁用所有内核调试,请使用以下命令:
kdbgctrl -d -da
如果要禁用所有内核调试,可能还需要增加 DbgPrint 缓冲区的大小。 这样可以确保保存所有消息,以备日后查看。 如果有一兆字节的内存要备用,则可以使用以下命令:
kdbgctrl -sdb 0x100000