kmdb 调试器是可提供以下功能的交互式内核调试器:
控制内核执行
检查内核状态
实时修改代码
本节假定您已熟悉 kmdb 调试器。本节重点介绍在设备驱动程序设计中非常有用的 kmdb 功能。要详细了解如何使用 kmdb,请参阅 kmdb(1) 手册页和Oracle Solaris Modular Debugger Guide。如果您熟悉 kadb,请参阅 kadb(1M) 手册页以了解 kadb 与 kmdb 的主要差别。
可以任意装入和卸载 kmdb 调试器。《Oracle Solaris 模块调试器指南》中包含有关装入和卸载 kmdb 的说明。为了安全和方便起见,强烈建议使用替代内核进行引导。如本节中所述,在 SPARC 平台与 x86 平台上引导过程略有不同。
使用以下任一命令通过 kmdb 和替代内核引导 SPARC 系统:
boot kmdb -D kernel.test/sparcv9/unix boot kernel.test/sparcv9/unix -k
使用以下任一命令通过 kmdb 和替代内核引导 x86 系统:
b kmdb -D kernel.test/unix b kernel.test/unix -k
使用 bp 命令设置断点,如以下示例中所示。
示例 23-5 在 kmdb 中设置标准断点[0]> myModule`myBreakpointLocation::bp
如果尚未装入目标模块,则会显示指示这一情况的错误消息,并且不会创建断点。在这种情况下,可以使用延迟断点。装入指定的模块时,会自动激活延迟断点。通过在 bp 命令后面指定目标位置可以设置延迟断点。以下示例对延迟断点进行了说明。
示例 23-6 在 kmdb 中设置延迟断点[0]>::bp myModule`myBreakpointLocation
有关使用断点的更多信息,请参见《Oracle Solaris 模块调试器指南》。也可以通过键入以下任意一行来获取帮助:
> ::help bp > ::bp dcmd
kmdb(1M) 调试器支持可用于显示内核数据结构的宏。可以使用 $M 来显示 kmdb 宏。宏的使用形式为:
[ address ] $<macroname
下表中的 kmdb 宏对于设备驱动程序的开发者特别有用。为方便起见,给出了传统的宏名称(如果适用)。
|
::dev info dcmd 显示节点状态,其值为以下所列之一:
驱动程序的 attach(9E) 例程成功返回。
节点已绑定到驱动程序,但尚未调用驱动程序的 probe(9E) 例程。
父结点已为驱动程序指定总线地址。特定于实现的初始化已完成。此时尚未调用驱动程序的 probe(9E) 例程。
设备节点已链接至内核的设备树中,但系统尚未找到用于此节点的驱动程序。
驱动程序的 probe(9E) 例程成功返回。
设备已完全配置。