http://www.filibeto.org/sun/lib/solaris10-docs/E19253-01/819-7057/eupvn/index.html
使用 kmdb 内核调试程序
kmdb 调试程序是可提供以下功能的交互式内核调试程序:
-
控制内核执行
-
检查内核状态
-
实时修改代码
本节假定您已熟悉 kmdb 调试程序。本节重点介绍在设备驱动程序设计中非常有用的 kmdb 功能。要详细了解如何使用 kmdb,请参阅kmdb(1) 手册页和《Solaris 模块调试器指南》。如果您熟悉 kadb,请参阅 kadb(1M) 手册页以了解 kadb 与 kmdb 的主要差别。
可以任意装入和卸载 kmdb 调试程序。《Solaris 模块调试器指南》中包括装入和卸载 kmdb 的说明。为了安全和方便起见,强烈建议使用替代内核进行引导。如本节中所述,在 SPARC 平台与 x86 平台上引导过程略有不同。
注 –
缺省情况下,当kmdb 运行时,kmdb 使用 CPU ID 作为提示符。在本章的示例中,除非另有指定,否则使用 [0] 作为提示符。
在 SPARC 平台上使用替代内核引导 kmdb
使用以下任一命令通过 kmdb 和替代内核引导 SPARC 系统:
boot kmdb -D kernel.test/sparcv9/unix boot kernel.test/sparcv9/unix -k |
在 x86 平台上使用替代内核引导 kmdb
使用以下任一命令通过 kmdb 和替代内核引导 x86 系统:
b kmdb -D kernel.test/unix b kernel.test/unix -k |
在 kmdb 中设置断点
使用 bp 命令设置断点,如以下示例中所示。
示例 22–7 在 kmdb 中设置标准断点
[0]> myModule`myBreakpointLocation::bp |
如果尚未装入目标模块,则会显示指示这一情况的错误消息,并且不会创建断点。在这种情况下,可以使用延迟断点。装入指定的模块时,会自动激活延迟断点。通过在 bp 命令后面指定目标位置可以设置延迟断点。以下示例对延迟断点进行了说明。
示例 22–8 在 kmdb 中设置延迟断点
[0]>::bp myModule`myBreakpointLocation |
有关使用断点的更多信息,请参见《Solaris 模块调试器指南》。也可以通过键入以下任意一行来获取帮助:
> ::help bp > ::bp dcmd |
为驱动程序开发者提供的 kmdb 宏
kmdb(1M) 调试程序支持可用于显示内核数据结构的宏。可以使用 $M 来显示 kmdb 宏。宏的使用形式为:
[ address ] $<macroname |
注 –
这些宏所显示的信息以及显示信息所用的格式都不构成接口。因此,该信息和格式可以随时更改。
下表中的 kmdb 宏对于设备驱动程序的开发者特别有用。为方便起见,给出了传统的宏名称(如果适用)。
Dcmd |
传统宏 |
说明 |
---|---|---|
::devinfo |
devinfo devinfo_brief devinfo.prop |
列显设备节点的摘要 |
::walk devinfo_parents |
devinfo.parent |
遍历设备节点的祖先 |
::walk devinfo_sibling |
devinfo.sibling |
遍历设备节点的同级节点 |
::minornodes |
devinfo.minor |
列显与给定设备节点对应的次要节点 |
::major2name |
列显绑定到给定设备节点的设备的名称。 |
|
::devbindings |
列显绑定到给定设备节点或主设备号的设备节点。 |
::devinfo dcmd 显示节点状态,其值为以下所列之一:
- DS_ATTACHED
-
驱动程序的 attach(9E) 例程成功返回。
- DS_BOUND
-
节点已绑定到驱动程序,但尚未调用驱动程序的 probe(9E) 例程。
- DS_INITIALIZED
-
父结点已为驱动程序指定总线地址。特定于实现的初始化已完成。此时尚未调用驱动程序的 probe(9E) 例程。
- DS_LINKED
-
设备节点已链接至内核的设备树中,但系统尚未找到用于此节点的驱动程序。
- DS_PROBED
-
驱动程序的 probe(9E) 例程成功返回。
- DS_READY
-
设备已完全配置。