Solaris 模块调试器指南

第 7 章 内核执行控制

本章介绍运行 kmdb 时可用于实时操作系统内核执行控制的 MDB 功能。kmdb 是 MDB 的一种版本,专为内核执行控制和实时内核调试而设计。 使用 kmdb,可以与使用 mdb 控制和观察用户进程几乎相同的方式控制和观察内核。 内核执行控制功能包括每个 CPU 上执行的内核线程的指令级控制,这样开发者就可以单步控制内核以及实时检查数据结构。

mdbkmdb 共享相同的用户界面。第 6 章,执行控制中介绍的所有执行控制功能在 kmdb 中都可用,它们与用于控制用户进程的一组命令相同。 第 3 章,语言语法第 5 章,内置命令中介绍的用于检查内核状态的命令在使用 kmdb 时也是可用的。最后,除非另有说明,否则第 8 章,内核调试模块中介绍的特定于 Solaris 内核实现的命令也可用。本章介绍特定于 kmdb 的其他功能。

引导、装入和卸载

为便于启动内核调试,可以在控制从内核运行时链接程序 (krtld) 传递到内核之前,在引导过程的初期阶段装入 kmdb。可以使用 -k 引导标志、kmdb 引导文件或 kadb 引导文件(用于实现兼容性)在引导时装入 kmdb。如果在引导时装入 kmdb,则在系统随后重新引导之前,无法卸载调试器。 在引导的初期阶段,某些功能不会立即可用。 特别是,在内核模块子系统初始化之前,不会装入调试模块。 在内核完成处理器标识过程之前,不会启用处理器特定功能。

如果使用 -k 选项引导系统,则会在引导过程中自动装入 kmdb。 可以使用 -d 引导选项,在启动内核之前请求调试器断点。 此功能适用于缺省内核以及替代内核。例如,要使用 kmdb 引导 SPARC 系统并请求立即进入调试器,请键入以下任一命令:



ok boot -kd

ok boot kmdb -d

ok boot kadb -d

要以相同方式引导 x86 系统,请键入以下任一命令:



Select (b)oot or (i)nterpreter: b -kd

Select (b)oot or (i)nterpreter: b kmdb -d

Select (b)oot or (i)nterpreter: b kadb -d	

要使用 kmdb 引导 SPARC 系统并装入备用 64 位内核,请键入以下命令:



ok boot kernel.test/sparcv9/unix -k

要使用 kmdb 引导 x86 系统并装入备用 64 位内核,请键入以下命令:



Select (b)oot or (i)nterpreter: b kernel.test/amd64/unix -k

如果引导文件被设置为字符串 kmdbkadb,并且希望引导替代内核,请使用 -D 选项指定要引导的内核的名称。要以此方式引导 SPARC 系统,请键入以下命令:



ok boot kmdb -D kernel.test/sparcv9/unix

要以此方式引导 32 位 x86 系统,请键入以下命令:



Select (b) or (i)nterpreter: b kmdb -D kernel.test/unix

要以此方式引导 64 位 x86 系统,请键入以下命令:



Select (b) or (i)nterpreter: b kmdb -D kernel.test/amd64/unix

要调试已引导的系统,请使用 mdb -K 选项装入 kmdb 并停止内核执行。如果使用此方法装入调试器,则随后可以卸载它。通过为 ::quit dcmd 指定 -u 选项,可以在完成调试后卸载 kmdb。或者,可以使用命令 mdb -U 恢复操作系统的执行。

终端处理

kmdb 始终使用系统控制台进行交互。kmdb 将根据以下规则确定相应的终端类型:

可以在 kmdb 中使用 ::term dcmd 来显示终端类型。

调试器项

在到达断点时或者根据第 6 章,执行控制中所述的其他执行控制设置,操作系统内核将隐式停止执行并进入 kmdb。可以使用 mdb -K 选项或相应的键盘中断序列来请求显式进入 kmdb。在 SPARC 系统控制台上,使用 STOP-A 组合键发送中断信号并进入 kmdb。在 x86 系统控制台上,使用 F1–A 组合键发送中断信号并进入 kmdb。在 Solaris 系统上,可以使用 kbd 命令自定义转义序列。要在具有串行控制台的系统上进入 kmdb,请使用相应的串行控制台命令发送中断序列。

处理器特定功能

某些 kmdb 功能特定于单独的处理器体系结构。 例如,各种 x86 处理器支持硬件分支跟踪功能,而在一些其他处理器体系结构中找不到该功能。对处理器特定功能的访问是通过处理器特定的 dcmd(仅存在于支持它们的系统上)提供的。 处理器特定支持是否可用将在 ::status dcmd 的输出中指示。调试器依赖于内核来确定处理器类型。因此,尽管调试器可能为给定的处理器体系结构提供功能,但是在内核前进到已完成处理器标识的点之前,不会公开此支持。