Solaris 模块调试器指南

附录 C 从 adbkadb 转换

从使用传统的 adb(1) 实用程序到使用 mdb(1) 的转换相对来说是简单的:MDB 为 adb 语法、内置命令和命令行选项提供了演化的兼容性。MDB 尝试为所有的现有 adb(1) 功能提供兼容性,但是它与 adb(1) 并不是逐错误兼容。本附录简要讨论 mdb(1) 没有精确模仿的几项 adb(1) 功能,以便引导用户使用新功能

命令行选项

MDB 提供 adb(1) 所识别的命令行选项的超集。所有的 adb(1) 选项都是受支持的,且具有与以前相同的含义。/usr/bin/adb 路径名作为调用 mdb(1) 的链接提供,它自动启用增强的 adb(1) 兼容模式。执行 /usr/bin/adb 链接等效于执行带 -o adb 选项的 mdb 或者在启动调试器后执行 ::set -o adb

语法

MDB 语言遵循与 adb(1) 语言相同的语法,以便为传统的宏和脚本文件提供兼容性。新增的 MDB dcmd 使用扩展形式 ::name,以便将它们与以 :$ 为前缀的传统命令区分开。也可以在 dcmd 名称的右侧计算表达式,方法是将它们括在前面是美元符号的方括号 ($[ ]) 中。与 adb(1) 类似,以叹号 (!) 开头的输入行指示该命令行应该由用户的 shell 执行。在 MDB 中,调试器命令也可能以叹号为后缀,以指示应该将其输出传输到叹号后面的 shell 命令。

adb(1) 中,二元运算符是左关联的,其优先级低于一元运算符。在输入行上,二元运算符是严格按照从左向右的顺序计算的。在 MDB 中,二元运算符是左关联的,其优先级低于一元运算符,但是二元运算符按照二元运算符中的表所示的优先顺序运算。运算符符合 ANSI C 中的优先顺序。可能需要更新不显式括起二义性表达式的传统 adb(1) 宏文件以用于 MDB。例如,在 adb 中,以下命令的计算结果是整数值 9:


$ echo "4-1*3=X" | adb

        9

在 MDB 中,与在 ANSI C 中一样,运算符 "*" 的优先级高于 "-",因此结果是整数值 1:


$ echo "4-1*3=X" | mdb

        1

观察点长度说明符

MDB 识别的观察点长度说明符语法与 adb(1) 中所述的语法不同。特别是,adb 观察点命令 :w:a:p 允许在冒号和命令字符之间插入以字节为单位的整数长度。在 MDB 中,应该在初始地址后面将计数指定为重复计数。简单地说,以下 adb(1) 命令:


123:456w

123:456a

123:456p

在 MDB 中指定为


123,456:w

123,456:a

123,456:p

MDB ::wp dcmd 提供用于创建用户进程观察点的更全面的工具。类似地,不支持传统的 kadb 长度修饰符命令 $l。因此,应该为 kmdb 中使用的每个 ::wp 命令指定观察点大小。

地址映射修饰符

MDB 中不存在用于修改虚拟地址映射和目标文件映射的段的 adb(1) 命令。具体而言,MDB 既不识别也不支持 /m/*m?m?*m 格式说明符。这些说明符过去用于手动修改当前对象和核心转储文件的有效可寻址范围。-{}- MDB 自动地正确识别此类文件的可寻址范围,并在调试实时进程时更新范围,因此不再需要这些命令。

输出

一些命令的精确文本输出格式在 MDB 中是不同的。使用相同的基本规则格式化宏文件,但是可能需要更改依赖于某些命令的逐字符精确输出的 shell 脚本。具有 shell 脚本(用于解析 adb 命令的输出)的用户在转换到 MDB 时,将需要重新验证和更新这样的脚本。

延迟断点

传统的 kadb 实用程序支持延迟断点语法,该语法与现有的 adb 语法不兼容。这些延迟断点的指定方法是:在 kadb 中使用语法 module#symbol:b。要在 kmdb 中设置延迟断点,请使用 MDB ::bp dcmd,如第 6 章,执行控制中所述。

x86: I/O 端口访问

传统的 kadb 实用程序使用 :i:o 命令提供对 x86 系统上 I/O 端口的访问。在 mdbkmdb 中不支持这些命令。对 x86 系统上 I/O 端口的访问由 ::in::out 命令提供。