Solaris 模块调试器指南

附录 A 选项

本附录提供 MDB 命令行选项的参考。

命令行选项摘要


mdb [ -fkmuwyAFMS ]  [ +o option ]  [ -p pid ]  [ -s distance]   

     [ -I path ]  [ -L path ]  [ -P prompt ]  [ -R root ]  

     [ -V dis-version ]  [ object  [ core ]  | core  | suffix ]

支持以下选项:

-A

禁用 mdb 模块的自动装入功能。缺省情况下,mdb 尝试装入与用户进程或核心转储文件中的活动共享库相对应,或者与实时操作系统或操作系统崩溃转储中装入的内核模块相对应的调试器模块。

-F

强制接管指定的用户进程(如有必要)。缺省情况下,mdb 拒绝附加到已经受其他调试工具(如 truss(1))控制的用户进程。但是通过使用 -F 选项,mdb 将附加到这些进程。这可能会在 mdb 和用于尝试控制进程的其他工具之间产生意外的交互。

-f

强制原始文件调试模式。缺省情况下,mdb 会尝试推断对象和核心转储文件操作数是引用用户可执行文件和核心转储,还是引用一对操作系统崩溃转储文件。如果无法推断出文件类型,则缺省情况下调试器将文件作为纯二进制数据进行检查。-f 选项用于强制 mdb 将参数解释为一组要检查的原始文件

-I

设置用于放置宏文件的缺省路径。使用 $<$<< dcmd 来读取宏文件。路径是使用冒号 (:) 字符分隔的目录名称序列。-I include 路径和 -L library 路径(请参见下文)还可以包含以下任一标记:

%i

扩展为当前指令集体系结构 (ISA) 的名称('sparc'、'sparcv9' 或 'i386')。

%o

扩展为所修改路径的旧值。可用于将目录添加到现有路径的开头或末尾。

%p

扩展为当前平台字符串(uname -i 或存储在进程核心转储文件或崩溃转储中的平台字符串)。

%r

扩展为根目录的路径名。可以使用 -R 选项指定备用根目录。如果 -R 选项不存在,则根目录是从 mdb 可执行文件本身的路径动态派生的。例如,如果执行 /bin/mdb,则根目录为 /。 如果执行 /net/hostname/bin/mdb,则根目录可派生为 /net/hostname

%t

扩展为当前目标的名称。这可以是文字字符串 'proc'(用户进程或用户进程核心转储文件)或 'kvm'(内核崩溃转储或实时操作系统)。

32 位 mdb 的缺省头文件路径为:


%r/usr/platform/%p/lib/adb:%r/usr/lib/adb


64 位 mdb 的缺省头文件路径为:


%r/usr/platform/%p/lib/adb/%i:%r/usr/lib/adb/%i


-k

强制内核调试模式。缺省情况下,mdb 会尝试推断对象和核心转储文件操作数是引用用户可执行文件和核心转储,还是引用一对操作系统崩溃转储文件。-k 选项用于强制 mdb 将这些文件假定为操作系统崩溃转储文件。如果未指定任何对象或核心操作数,但指定了 -k 选项,则 mdb 缺省将它们指定为 /dev/ksyms 目标文件和 /dev/kmem 核心转储文件。对 /dev/kmem 的访问仅限于 sys 组。

-K

装入 kmdb,停止实时运行的操作系统内核,然后转到 kmdb 调试器提示。此选项只应在系统控制台上使用,因为系统控制台上将显示后续的 kmdb 提示。

-L

设置用于放置调试器模块的缺省路径。模块是在启动时自动装入的或使用 ::load dcmd 装入的。路径是使用冒号 (:) 字符分隔的目录名称序列。-L 库路径还可以包含以上所示的 -I 的任一标记。

-m

禁用内核模块符号的按需装入功能。缺省情况下,mdb 会处理已装入内核模块的列表,然后执行按模块符号表的按需装入。如果指定了 -m 选项,则 mdb 不会尝试处理内核模块列表或提供逐个模块的符号表。因此,在启动时不会装入与活动内核模块相对应的 mdb 模块。

-M

预装入所有的内核模块符号。缺省情况下,mdb 会针对内核模块符号执行按需装入:如果地址为某模块的文本或者引用了数据部分,则读取该模块的完整符号表。通过 -M 选项,mdb 可在启动过程中装入所有内核模块的完整符号表。

-o option

启用指定的调试器选项。如果使用该选项的 +o 形式,则禁用指定的选项。除非下文另有说明,否则缺省情况下将禁用每个选项。mdb 可识别以下选项参数:

adb

实现更严格的 adb(1) 兼容性。提示符会设置为空字符串,并且许多 mdb 功能(如输出页面调度程序)将会禁用。

array_mem_limit=limit

设置 ::print 将显示的数组成员数的缺省限制。如果 limit 是特殊标记 none,则缺省情况下将显示所有数组成员。

array_str_limit=limit

设置 ::print 在列显 char 数组时将尝试显示为 ASCII 字符串的字符数的缺省限制。如果 limit 是特殊标记 none,则缺省情况下整个 char 数组都将显示为 string

follow_exec_mode=mode

设置 exec(2) 系统调用之后的调试器行为。模式应该为以下命名常量之一:

ask 

如果 stdout 是终端设备,则调试器在 exec(2) 系统调用返回之后将停止,然后提示用户决定是跟随 exec 还是停止。如果 stdout 不是终端设备,则 ask 模式将缺省为停止。

follow 

调试器将通过自动继续执行目标进程并基于新的可执行文件重置其所有映射和符号表来跟随 exec。exec 交互中将对跟随行为进行更详细的讨论。

stop 

调试器在 exec 系统调用返回后将停止。 exec 交互中将对停止行为进行更详细的讨论。

follow_fork_mode=mode

设置 fork(2)、fork1(2) 或 vfork(2) 系统调用后的调试器行为。 模式应该为以下命名常量之一:

ask 

如果 stdout 是终端设备,则调试器在 fork 系统调用返回之后将停止,然后提示用户决定是跟随父进程还是跟随子进程。 如果 stdout 不是终端设备,则 ask 模式将缺省为父进程。

parent 

调试器将跟随父进程,并且会与子进程分离,同时将其设置为运行。 

child 

调试器将跟随子进程,并切会与父进程分离,同时将其设置为运行。 

ignoreeof

在终端上输入 EOF 序列 (^D) 时,调试器不会退出。如果要退出,必须使用 ::quit dcmd。

nostop

如果指定了 -p 选项,或者应用了 ::attach:A dcmd,则在附加到用户进程时请勿停止此进程。进程的附加和释放中将对不停止行为进行更详细的介绍。

pager

启用输出页面调度程序(缺省)。

repeatlast

如果在终端上输入 NEWLINE 作为完整的命令,则 mdb 将使用当前点值重复执行前一个命令。-o adb 隐含此选项。

showlmid

MDB 在使用除 LM_ID_BASE 和 LM_ID_LDSO 之外的链接映射的用户应用程序中,提供了对符号命名和标识的支持,如符号名称解析中所述。除 LM_ID_BASE 或 LM_ID_LDSO 之外的链接映射上的符号将显示为 LMlmid`library`symbol,其中 lmid 是以缺省输出基数 (16) 表示的链接映射 ID。通过启用 showlmid 选项,用户可以选择配置 MDB,以显示所有符号和对象(包括与 LM_ID_BASE 和 LM_ID_LDSO 相关联的符号和对象)的链接映射 ID 的范围。用于处理目标文件名的内置 dcmd 将根据上面的 showlmid 值(包括 ::nm::mappings$m::objects)显示链接映射 ID。

-p pid

附加到指定的进程 id 并将其停止。mdb 使用 /proc/pid/object/a.out 文件作为可执行文件的路径名。

-P

设置命令提示符。缺省提示符为 '>'。

-R

设置路径扩展名的根目录。缺省情况下,根目录是从 mdb 可执行文件本身的路径名派生的。在路径名扩展过程中,会使用根目录替换 %r 标记。

-s distance

将用于地址到符号名转换的符号匹配距离设置为指定的 distance。缺省情况下,mdb 将距离设置为零,这样可启用智能匹配模式。每个 ELF 符号表项都包括值 V 和大小 S,表示函数或数据对象的大小(以字节为单位)。在智能模式下,如果 A 在范围 [ V, V + S) 内,则 mdb 可将地址 A 与给定符号匹配。如果指定了任何非零距离,则会使用相同算法,但是给定表达式中的 S 始终为指定的绝对距离,并且会忽略符号大小。

-S

禁止处理用户的 ~/.mdbrc 文件。缺省情况下,如果用户的起始目录(如 $HOME 所定义)中存在宏文件 .mdbrc,则 mdb 会读取并处理该文件。如果存在 -S 选项,则不读取此文件。

-u

强制使用用户调试模式。缺省情况下,mdb 会尝试推断对象和核心转储文件操作数是引用用户可执行文件和核心转储,还是引用一对操作系统崩溃转储文件。-u 选项用于强制 mdb 假定这些文件不是操作系统崩溃转储文件。

-U

卸载 kmdb(如果已将其装入)。如果没有使用 kmdb 将内核调试器所使用的内存释放回可供操作系统使用的空闲内存,则应该将其卸载。

-V

设置反汇编程序版本。缺省情况下,mdb 会尝试推断适合于调试目标的反汇编程序版本。可以使用 -V 选项显式设置反汇编程序。::disasms dcmd 可列出可用的反汇编程序版本。

-w

打开指定的对象和核心转储文件以进行写入。

-y

针对 tty 模式发送显式终端初始化序列。某些终端需要显式初始化序列才能切换到 tty 模式。如果没有此初始化序列,则 mdb 可能无法使用终端功能(如 standout 模式)。

操作数

支持以下操作数:

object

指定要检查的 ELF 格式目标文件。通过 mdb 可以检查和编辑 ELF 格式可执行文件 (ET_EXEC)、ELF 动态库文件 (ET_DYN)、ELF 可重定位目标文件 (ET_REL) 和操作系统 unix.X 符号表文件。

core

指定 ELF 进程核心转储文件 (ET_CORE) 或操作系统崩溃转储 vmcore.X 文件。如果提供的 ELF 核心转储文件操作数没有对应的目标文件,则 mdb 将尝试使用几种不同的算法推断生成核心的可执行文件的名称。 如果未找到任何可执行文件,mdb 仍将执行,但是一些符号信息可能不可用。

suffix(后缀)

指定用于表示一对操作系统崩溃转储文件的数值后缀。例如,如果后缀为 '3',则 mdb 会推断出应该检查文件 'unix.3' 和 'vmcore.3'。如果当前目录中存在同名的实际文件,则不会将数字串解释为后缀。

退出状态

将返回以下退出值:

0

调试器已成功完成执行。

1

发生了致命错误。

2

指定的命令行选项无效。

环境变量

支持以下环境变量:

HISTSIZE

此变量用于确定命令历史记录列表的最大长度。如果不存在此变量,则缺省长度为 128。

HOME

此变量用于确定用户起始目录(可能驻留有 .mdbrc 文件)的路径名。如果不存在此变量,则不会进行任何 .mdbrc 处理。

SHELL

此变量用于确定 shell(用于处理使用 ! 元字符请求的 shell 转义)的路径名。如果不存在此变量,则会使用 /bin/sh