Debugging Tools for Windows

使用KDbgCtrl

KDbgCtrl (内核调试控制,kdbgctrl.exe)工具可以用来控制目标机上的内核调试连接。

要使用该工具,目标机上必须运行Windows Server 2003或之后版本的Windows。

KDbgCtrl 可以控制4种不同的设置:完全的内核调试,自动内核调试,用户模式错误处理,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的调用会使得中断到内核调试器。但是像访问非法或者除0错误这样的标准异常通常不会被发给内核调试器。

如果用户模式调试器已经附加到进程,调试器会捕捉到所有用户模式错误,不会通知内核调试器。关于各种用户模式错误处理的优先级,查看启用事后调试

要使用用户模式错误处理,完全内核调试或自动内核调试必须启用。

用户模式错误处理默认是启用的。要检查当前设置,使用kdbgctrl -cu。禁用设置,使用kdbgctrl -du。启用设置,使用kdbgctrl -eu

DbgPrint缓冲区大小

DbgPrint 缓冲区保存目标机发送给内核调试器的信息。

如果完全内核调试启用,这些信息会在内核调试器中自动出现。但是如果该选项禁用,这些信息只保存在缓冲区中。在之后,可以启用内核调试并连接到内核调试器,并使用!dbgprint扩展命令来查看缓冲区的内容。关于该缓冲区的更多信息,查看DbgPrint 缓冲区

在Windows 发行版中,DbgPrint缓冲区的默认大小是4 KB,在调试版Windows中为32 KB。查看当前的缓冲区大小,使用kdbgctrl -cdb。修改 大小,使用kdbgctrl -sdb sizesize指定新的缓冲区大小。关于语法的详细信息,查看KDbgCtrl 命令行选项

示例

显示所有的当前设置,使用下面的命令:

kdbgctrl -c -ca -cu -cdb 

恢复默认设置,使用如下命令:

kdbgctrl -e -da -eu -sdb 0x1000 

阻止主控机,仅当发生异常时才连接。使用如下命令:

kdbgctrl -d -ea -eu 

禁用所有内核调试,使用如下命令:

kdbgctrl -d -da 

禁用所有内核调试之后,可能想增加DbgPrint缓冲区的大小。这可以确保当需要查看的时候,所以信息都能被保存下来。如果有1MB的内存剩余,可以使用下面的命令:

kdbgctrl -sdb 0x1000000 

Build machine: CAPEBUILD