MDB 提供了一组始终定义的内置 dcmd。其中一些 dcmd 仅适用于某些目标:如果 dcmd 不适用于当前目标,则它将失败并列显一条消息,指示“当前目标不支持该命令”。
在许多情况下,MDB 为传统的 adb(1) dcmd 名称提供了助记等效项 (::identifier)。例如,提供了 ::quit 作为 $q 的等效项。对 adb(1) 有经验或欣赏简洁或深奥的程序员可能会首选 $ 或 : 形式的内置命令。不熟悉 MDB 的程序员可能会首选更详细的 :: 形式。内置命令按字母顺序显示。如果 $ 或 : 形式具有 ::identifier 等效项,则以 ::identifier 形式显示它。
将点的值赋给指定的命名变量。一些变量是只读的,无法进行修改。如果 > 后跟置于 // 中的修饰符,则在赋值过程中修改该值。修饰符如下:
无符号 char 值(1 字节)
无符号 short 值(2 字节)
无符号 int 值(4 字节)
无符号 long 值(在 32 位环境中为 4 字节,在 64 位环境中为 8 字节)
请注意,这些运算符不执行强制类型转换;相反,它们提取指定的低位字节数(在小端字节序体系结构中)或高位字节数(在大端字节序体系结构中)。提供这些修饰符是为了向下兼容;应该改用 MDB */modifier/ 和 %/modifier/ 语法。
从指定的宏文件读取和执行命令。可以以绝对路径或相对路径指定文件名。如果文件名是简单名称(即,如果它不包含 '/'),则 MDB 会在宏文件包含路径中搜索它。如果当前正在处理其他宏文件,则关闭此文件并将其替换为新文件。
从指定的宏文件读取和执行命令(与 $< 一样),但不关闭当前打开的宏文件。
列显 C 栈反向跟踪,包括栈帧指针信息。如果在 dcmd 的前面明确指定了 address,则显示从此虚拟内存地址开始的反向跟踪。否则,显示代表线程的栈。如果提供了可选计数值作为参数,则在输出中为每个栈帧显示的参数不超过 count 个。
请求栈跟踪时,应该将偏离的帧指针值(即,虚拟地址减去 0x7ff)用作地址。
获取或设置缺省的输出基数。如果在 dcmd 的前面明确指定了表达式,则将缺省输出基数设置为给定的 base;否则,以基数 10(十进制)列显当前基数。缺省基数是基数 16(十六进制)。
列显关于类型对象或函数的所有已知外部(全局)符号、符号的值以及在目标虚拟地址空间中此位置上存储的前 4 个(32 位 mdb)或前 8 个(64 位 mdb)字节的列表。::nm dcmd 提供了用于显示符号表的更灵活选项。
将提示符设置为指定的 prompt-string。缺省提示符是 ' > '。也可以使用 ::set -P 或 -P 命令行选项设置提示符。
仅在 kmdb 中,列出由 kmdb 高速缓存,以便与 $< dcmd 一起使用的宏文件。
为地址到符号名称的转换获取或设置符号匹配 distance。符号匹配距离模式将与附录 A,选项 中的 -s 命令行选项一起讨论。也可以使用 ::set -s 选项修改符号匹配距离。如果未指定距离,则显示当前设置。
列显具有非零值的命名变量的列表。::vars dcmd 提供了用于列出变量的其他选项。
将输出页 width 设置为指定值。通常,此命令不是必需的,因为 MDB 会向终端查询其宽度并处理调整大小事件。
重新打开目标以写入,就像已在命令行上使用 -w 选项执行了 MDB。也可以使用 ::set -w 选项启用写入模式。
列显数组的每个元素的地址。应该将数组元素的类型指定为第一个参数 type,而且应该将要计算的元素数指定为第二个参数 count。可以将 ::array 的输出传输到 ::print dcmd,以列显数组数据结构的元素。
此 dcmd 只能与包含压缩的符号调试信息的对象(设计用于 mdb)一起使用。此信息当前仅可用于某些 Solaris 内核模块。必须安装 SUNWzlib 解压缩软件,才能处理符号调试信息。
如果用户进程目标处于活动状态,则附加到指定的进程 ID 或 core 文件并调试它。应该将核心转储文件路径名指定为字符串参数。可以将进程 ID 指定为字符串参数,也可以指定为 dcmd 前面的表达式的值。回想一下,缺省基数是十六进制的,因此,使用 pgrep(1) 或 ps(1) 获取的十进制 PID 在被指定为表达式时其前面应该有 "0t"。
显示当前 CPU 采用的最新分支。当前,仅在启用相应处理器特定功能的 x86 系统上使用 kmdb 时,此 dcmd 才可用。可以显示的分支数和分支类型由处理器体系结构确定。如果存在 -v 选项,则显示每个分支前面的指令。
串联并显示文件。可以将每个文件名指定为相对路径名或绝对路径名。文件内容将列显到标准输出,但是不会通过输出页面调度程序。此 dcmd 旨在与 | 运算符一起使用;程序员可以使用存储在外部文件中的地址列表启动管道。
将上下文切换到指定的进程。上下文切换操作仅在使用内核目标时有效。进程上下文是在内核虚拟地址空间中使用其 proc 结构的 address 指定的。特殊上下文地址 "0" 用于表示内核本身的上下文。仅当转储包含指定用户进程的物理内存页面(与仅包含内核页面相对)时,MDB 才能在检查崩溃转储时执行上下文切换。使用 dumpadm(1M),可以将内核崩溃转储工具配置为转储所有页面或当前用户进程的页面。::status dcmd 可以用于显示当前崩溃转储的内容。
当用户请求从内核目标进行上下文切换时,MDB 将构造一个表示指定用户进程的新目标。发生切换后,新目标将在全局级别上插入其 dcmd:因此,现在 / dcmd 可以设置用户进程虚拟地址空间中数据的格式并显示该数据,::mappings dcmd 可以显示用户进程的地址空间中的映射,依此类推。通过执行 0::context 可以恢复内核目标。
显示当前 CPU 或指定 cpuid 的当前典型寄存器集。此命令仅在使用 kmdb 时可用。
显示在当前 CPU 或指定 cpuid 上执行的线程的 C 栈反向跟踪。此命令仅在使用 kmdb 时可用。
列出可用的 dcmd 并列显其中每个 dcmd 的简短说明。
从最后一个参数或点的当前值指定的 address 处或其附近开始进行反汇编。如果地址与已知函数的开头匹配,则反汇编整个函数;否则,列显指定地址前后的指令的“窗口”,以便提供上下文。缺省情况下,从目标的虚拟地址空间读取指令;如果存在 -f 选项,则改为从目标的目标文件读取指令。如果调试器当前未附加到实时进程、核心转储文件或崩溃转储,则缺省情况下启用 -f 选项。-w 选项可以用于强制窗口模式,即使地址是已知函数的开头,也是如此。窗口大小缺省为十条指令;可以使用 -n 选项显式指定指令数。如果存在 -a 选项,则以数值而不是符号形式列显地址。
列出可用的反汇编程序模式。初始化目标时,MDB 尝试选择相应的反汇编程序模式。用户可以使用 ::dismode dcmd 将模式更改为列出的任一模式。
获取或设置反汇编程序模式。如果未指定参数,则列显当前的反汇编程序模式。如果指定了 mode 参数,则将反汇编程序切换到指定模式。可以使用 ::disasms dcmd 显示可用反汇编程序的列表。
列出已装入的调试器模块。 如果指定了 -l 选项,则将在每个 dmod 的名称下列显与其关联的 dcmd 和 walker 的列表。通过将其名称指定为其他参数,可以将输出限制为特定的 dmod。
列显 16 字节对齐的虚拟内存区域(包含点所指定的地址)的十六进制和 ASCII 内存转储。如果为 ::dump 指定了重复计数,则将此解释为要转储的字节数而不是迭代次数。::dump dcmd 还可识别以下选项:
按字节存储顺序调整。-e 选项采用 4 字节字;-g 选项可以用于更改缺省的字大小。
从对应于给定虚拟地址的目标文件位置读取数据,而不是从目标的虚拟地址空间读取数据。如果调试器当前未附加到实时进程、核心转储文件或崩溃转储,则缺省情况下启用 -f 选项。
以字节组显示字节。 缺省的 group 大小为 4 字节。group 大小必须是 2 的幂,且可以整除行宽。
将 address 解释为目标地址空间中的物理地址位置,而不是虚拟地址。
不列显数据的 ASCII 解码。
相对于起始地址而不是每行的显式地址的数字行。此选项隐含 -u 选项。
取消重复行。
仅读取并显示指定地址的内容,而不是读取和列显整行。
取消对齐输出,而不是在段落边界上对齐输出。
显示段落,每行为 16 字节段落。 缺省的段落数为 1。 -w 可接受的最大值为 16。
将由空格分隔并以 NEWLINE 结尾的参数列显到标准输出。将计算括在 $[ ] 中的表达式,得出一个值,并以缺省基数列显它。
评估并执行指定的用作命令的字符串。如果命令包含元字符或空格,则应该用双引号或单引号将该命令引起来。
列显已知源文件的列表(各种目标符号表中存在的类型为 STT_FILE 的符号)。如果指定了 object 名称,则将输出限制为存在于对应目标文件中的文件符号。
在指令文本中搜索引用指定的符号或地址的指令。搜索列表应该包含一个或多个指定为 dcmd 前面的地址的地址或符号名称,或者包含 dcmd 后面的一个或多个符号名称或表达式。如果指定了 -g 选项,则将搜索限制为目标符号表中作为全局可见函数一部分的指令文本。
仅限于 SPARC。仅当调试使用 SPARC 指令集体系结构的目标时,::findsym dcmd 才可用。
列出与 /、\、? 和 = 等格式设置 dcmd 一起使用的可用的输出格式字符。这些格式及其用法在格式设置 dcmd中说明。
列显代表线程的浮点寄存器集。如果指定了一个线程,则显示该线程的浮点寄存器。 线程表达式应该为线程支持下说明的线程标识符之一。
仅限于 SPARC。 -d、-q 和 -s 选项可以用于将浮点寄存器显示为双精度 (-d)、四精度 (-q) 或单精度 (-s) 浮点值的集合。
评估指定的命令字符串,如果点的新值不为零,则列显点的旧值。如果 command 包含空格或元字符,则必须使用引号将命令字符串引起来。可以在管道中使用 ::grep dcmd 过滤地址列表。
如果不带参数,则 ::help dcmd 列显 MDB 中可用的帮助工具的简短概述。如果指定了 dcmd-name,则 MDB 列显该 dcmd 的用法摘要。
从 address 指定的 I/O 端口读取和显示 len 字节。如果存在 -L 选项的值,则它优先于在左侧指定的重复计数。len 必须为 1、2 或 4 字节,而且端口地址必须按照长度对齐。仅当在 x86 系统上使用 kmdb 时,此命令才可用。
遍历链接列表数据结构的元素,并列显列表中每个元素的地址。可以使用可选的 address 指定列表中第一个元素的地址;否则,假定列表从点的当前值开始。type 参数必须指定一种 C 结构或联合类型,它用于说明列表元素的类型,以便 MDB 可以读入相应大小的对象。member 参数用于指定包含指向下一个列表元素的指针的 type 的成员。::list dcmd 将继续迭代,直到遇到 NULL 指针、再次到达第一个元素(循环列表)或者读取元素时出错。如果指定了可选的 variable-name,则 MDB 调用管道的下一个阶段时,会将在遍历的每一步返回的值赋给指定的变量。
此 dcmd 只能与包含压缩的符号调试信息的对象(设计用于 mdb)一起使用。此信息当前仅可用于某些 Solaris 内核模块。必须安装 SUNWzlib 解压缩软件,才能处理符号调试信息。
装入指定的 dmod。可以将模块名称指定为绝对路径或相对路径。如果 module-name 是简单名称(即,不包含 '/'),则 MDB 将在模块库路径中搜索它。无法装入名称冲突的模块;此时,必须先卸载已有的模块才可继续装入。如果存在 -s 选项,则在找不到或无法装入模块时,MDB 将保持无提示状态,不发出任何错误消息。
启用或禁用输出日志。MDB 提供了一种交互式日志记录工具,使用该工具可以在仍与用户交互的同时,将输入命令和标准输出记录到文件中。-e 选项允许记录到指定的文件中;如果未指定文件名,则重新允许记录到以前的日志文件中。-d 选项禁用日志记录。如果使用了 $> dcmd,则在指定文件名参数时启用日志记录;否则,禁用日志记录。如果指定的日志文件已存在,则 MDB 会将任何新日志输出附加到该文件。
将指定的 command 用作字符串参数,将点的值映射到对应值,然后列显点的新值。如果命令包含空格或元字符,则必须使用引号将此命令引起来。可以在管道中使用 ::map dcmd 将地址列表转换为新的地址列表。
列显目标虚拟地址空间中每个映射的列表,包括每个映射的地址、大小和说明。如果 dcmd 前面有 address,则 MDB 仅显示包含给定地址的映射。如果指定了字符串 name 参数,则 MDB 仅显示与说明匹配的映射。
列显与当前目标关联的符号表。如果指定了 dcmd 前面的可选 address,则仅显示对应于该地址的符号的符号表项。如果指定了 object 名称,则仅显示此装入对象的符号表。::nm dcmd 还可识别以下选项:
列显 .dynsym(动态符号表)而不是 .symtab。
列显专用符号表而不是 .symtab。
以十进制列显值和大小字段。
仅列显指定的符号信息。 有效的格式参数字符串如下:
符号表索引
符号表
大小(以字节为单位)
符号类型
绑定
其他
节索引
符号名称
符号的 C 类型(如果已知)
定义符号的对象
仅列显全局符号。
抑制标题行。
按名称对符号排序。
以八进制列显值和大小字段。
将符号列显为一系列 ::nmadd 命令。此选项可以与 -P 一起使用,以生成宏文件(随后可以使用 $< 将其读入调试器)。
仅列显指定类型的符号。 有效的类型参数字符串如下:
STT_NOTYPE
STT_OBJECT
STT_FUNC
STT_SECTION
STT_FILE
STT_COMMON
STT_TLS
STT_SPARC_REGISTER
仅列显未定义的符号。
按值对符号排序。
以十六进制列显值和大小字段。
将指定的符号 name 添加到专用符号表。MDB 提供了一个可以用于插入目标符号表的专用可配置符号表,如符号名称解析中所述。::nmadd dcmd 还可识别以下选项:
将符号大小设置为 end - value。
将符号类型设置为 STT_FUNC。
将符号类型设置为 STT_OBJECT。
将符号大小设置为 size。
从专用符号表中删除指定的符号 name。
列显目标虚拟地址空间的映射,仅显示与每个已知装入对象的专用映射(通常为文本部分)相对应的那些映射。如果存在 -v 选项,则在知道版本信息的情况下,该命令显示每个对象的版本。如果不知道版本信息,则将在输出中显示 Unknown 版本。
列显指定类型的指定成员的偏移。类型应该为 C 结构的名称。除非成员是可以按位列显偏移的位字段,否则按字节列显偏移。为清楚起见,输出始终使用相应单位作为后缀。类型名称可以使用符号名称解析中所述的反引号 (`) 作用域运算符。
此 dcmd 只能与包含压缩的符号调试信息的对象(设计用于 mdb)一起使用。此信息当前仅可用于某些 Solaris 内核模块。必须安装 SUNWzlib 解压缩软件,才能处理符号调试信息。
将指定的 value 写入 address 指定的 I/O 端口。如果存在 -L 选项的值,则它优先于在左侧指定的重复计数。len 必须为 1、2 或 4 字节,而且端口地址必须按照长度对齐。仅当在 x86 系统上使用 kmdb 时,此命令才可用。
使用给定的 type 信息,列显指定的虚拟 address 上的数据结构。type 参数可以指定 C 结构、联合、枚举、基础整数类型或指向这些类型之一的指针。如果类型名称包含空格(例如 "struct foo"),则必须用单引号或双引号将它引起来。类型名称可以使用符号名称解析下所述的反引号 (`) 作用域运算符。如果类型为结构化类型,则 ::print dcmd 将以递归方式列显结构或联合的每个成员。如果 type 参数不存在,但静态或全局 STT_OBJECT 符号与地址匹配,则 ::print 将自动推断出相应的类型。
type 参数可以后跟 member 或 offset 表达式的可选列表,在这种情况下仅显示指定的 type 的那些成员和子成员。可以使用包括数组索引运算符 ([])、结构成员运算符 (->) 和结构指针运算符 (.) 的 C 语法指定成员。可以使用 MDB 算术扩展语法 ($[]) 指定偏移。显示数据结构后,::print 将按 type 的大小(以字节为单位)递增点。
::print dcmd 只能与包含压缩的符号调试信息的对象(设计用于 MDB)一起使用。目前,此信息仅在某些 Solaris 内核模块和用户库中可用。必须安装 SUNWzlib 解压缩软件,才能处理符号调试信息。
如果存在 -a 选项,则显示每个成员的地址。如果存在 -i 选项,则将左侧的表达式解释为要使用指定类型显示的即时值。如果存在 -p 选项,则 ::print 将地址解释为物理内存地址而不是虚拟内存地址。如果存在 -t 选项,则显示每个成员的类型。如果存在 -d 或 -x 选项,则以十进制 (-d) 或十六进制 (-x) 显示所有整数;缺省情况下,使用试探性算法确定应该以十进制还是十六进制显示值。可以使用 -c 选项限制字符数组中将读取并显示为字符串的字符数。如果存在 -C 选项,则不实施任何限制。可以使用 -l 选项限制标准数组中将读取并显示的元素数。如果存在 -L 选项,则不实施任何限制,将显示所有的数组元素。可以使用 ::set 或 -o 命令行选项修改 -c 和 -l 的缺省值,如附录 A,选项 中所述。
退出调试器。-u 选项导致调试器恢复执行操作系统并卸载调试器(仅在使用 kmdb 时可用)。如果在引导时装入了 kmdb,则无法使用 -u 选项。如果 -u 选项不存在,则 ::quit 导致 kmdb 退出到固件(在 SPARC 系统上)或导致系统重新引导(在 x86 系统上)。
列显代表线程的典型寄存器集。如果指定了一个线程,则显示该线程的典型寄存器集。 线程表达式应该为线程支持下说明的线程标识符之一。
释放以前附加的进程或核心转储文件。如果存在 -a 选项,则释放进程,并使其保持已停止和已放弃状态。随后可以由 prun(1) 继续执行它,或者通过应用 MDB 或其他调试器来恢复它。 缺省情况下,如果释放的进程是 MDB 使用 ::run 创建的,则它将被强行终止;如果它是 MDB 使用 -p 选项或者使用 ::attach 或 :A dcmd 附加的,则它将被释放并设置为正在运行。
获取或设置各种调试器属性。如果未指定选项,则显示当前的调试器属性集。::set dcmd 可识别以下选项:
强制接管对其应用 ::attach 的下一个用户进程,就像已在命令行上使用 -F 选项执行了 mdb。
设置用于查找宏文件的缺省路径。路径参数可以包含在附录 A,选项 中为 -I 命令行选项说明的任何特殊标记。
设置用于查找调试器模块的缺省路径。路径参数可以包含在附录 A,选项 中为 -I 命令行选项说明的任何特殊标记。
启用指定的调试器选项。 如果使用 +o 形式,则禁用该选项。 选项字符串以及 -o 命令行选项在附录 A,选项 中说明。
将命令提示符设置为指定的提示字符串。
将符号匹配距离设置为指定的距离。有关更多信息,请参阅附录 A,选项 中对 -s 命令行选项的说明。
重新打开目标以写入,就像已在命令行上使用 -w 选项执行了 mdb。
显示与当前目标对应的硬件和软件修订信息。如果未指定选项,则显示常规系统信息。如果存在 -p 选项,则显示作为修补程序一部分的每个装入对象的信息。如果存在 -v 选项,则显示每个装入对象的信息。-p 选项的输出将省略没有版本信息的装入对象。在 -v 选项的输出中,没有版本信息的装入对象将报告 Unknown。
列显指定类型的大小(以字节为单位)。type 参数可以指定 C 结构、联合、枚举、基础整数类型或指向这些类型之一的指针。类型名称可以使用符号名称解析中所述的反引号 (`) 作用域运算符。
此 dcmd 只能与包含压缩的符号调试信息的对象(设计用于 mdb)一起使用。此信息当前仅可用于某些 Solaris 内核模块。必须安装 SUNWzlib 解压缩软件,才能处理符号调试信息。
列显 C 栈反向跟踪。如果 dcmd 的前面有显式的 address,则显示从此虚拟内存地址开始的反向跟踪。否则,显示代表线程的栈。如果提供了可选计数值作为参数,则在输出中为每个栈帧显示的参数不超过 count 个。
请求栈跟踪时,应该将偏离的帧指针值(即,虚拟地址减去 0x7ff)用作地址。
列显与当前目标相关的信息的摘要。
切换到由指定的 cpuid 所指示的 CPU,并将此 CPU 的当前寄存器状态用作代表以进行调试(仅在使用 kmdb 时可用)。
列显 MDB 用来执行任何与终端相关的输入和输出操作(如命令行编辑)的终端类型的名称。
列显指定线程上下文中指定的线程局部存储 (thread-local storage, TLS) 符号的存储地址。线程表达式应该为线程支持下说明的线程标识符之一。符号名称可以使用符号名称解析下说明的任何作用域运算符。
设置命名变量的属性。如果指定了一个或多个变量名称,则将定义它们并将其设置为点的值。如果存在 -t 选项,则设置与每个变量关联的用户定义标记。如果存在 +t 选项,则清除标记。如果未指定变量名称,则列显变量及其值的列表。
卸载指定的 dmod。可以使用 ::dmods dcmd 列显活动 dmod 的列表。无法卸载内置模块。无法卸载处于忙状态(即,提供当前正在执行的 dcmd)的模块。
从已定义变量列表中取消设置(删除)指定的变量。由 MDB 导出的一些变量标记为持久性变量,用户无法取消设置它们。
列显命名变量的列表。如果存在 -n 选项,则将输出限制为当前具有非零值的变量。如果存在 -p 选项,则以适合于调试器使用 $< dcmd 重新处理的形式列显变量。此选项可以用于将变量记录到宏文件,稍后再恢复这些值。如果存在 -t 选项,则仅列显带标记的变量。可以使用 ::typeset 的 -t 选项标记变量。
列显调试器版本号。
如有可能,则列显指定虚拟地址的物理地址映射。仅在检查内核目标或检查内核崩溃转储内的用户进程(发出 ::context dcmd 之后)时,::vtop dcmd 才可用。
从内核上下文检查内核目标时,可以使用 -a 选项指定应该用于从虚拟到物理转换的替换地址空间结构的地址 (as)。缺省情况下,使用内核的地址空间进行转换。 此选项可用于活动地址空间,甚至是在转储内容仅包含内核页面时,也是如此。
使用指定的 walker 遍历数据结构的元素。可以使用 ::walkers dcmd 列出可用的 walker。一些 walker 对全局数据结构执行操作,并且不需要起始地址。例如,遍历内核中 proc 结构的列表。其他 walker 对必须显式指定其地址的特定数据结构执行操作。例如,在提供指向地址空间的指针时,遍历段的列表。
以交互方式使用时,::walk dcmd 将以缺省基数列显每个数据结构元素的地址。该 dcmd 还可以用于为管道提供地址列表。walker 名称可以使用dcmd 和 Walker 名称解析中说明的反引号 "`" 作用域运算符。如果指定了可选的 variable-name,则 MDB 调用管道的下一个阶段时,会将在遍历的每一步返回的值赋给指定的变量。
列出可用的 walker 并列显其中每个 walker 的简短说明。
列显导出指定的 dcmd 和 walker 的 dmod。这些 dcmd 可以用于确定当前哪个 dmod 提供给定的 dcmd 或 walker 的全局定义。有关全局名称解析的更多信息,请参阅dcmd 和 Walker 名称解析。-v 选项导致 dcmd 按优先级顺序列显每个 dcmd 和 walker 的替换定义。
列出当前目标所导出的外部数据缓冲区。外部数据缓冲区表示与无法通过标准目标工具(即,地址空间、符号表或寄存器集)访问的目标关联的信息。这些缓冲区可以由 dcmd 占用;有关更多信息,请参阅mdb_get_xdata()。