Solaris 模块调试器指南

Dcmd 定义

int dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv);

dcmd 是使用类似于 dcmd() 声明的函数实现的。此函数接收四个参数并返回整数状态。函数参数如下:

addr

当前地址,也称为点。在 dcmd 的开头,此地址对应于调试器中点 "." 变量的值。

flags

包含以下一个或多个标志的逻辑 OR 的整数:

DCMD_ADDRSPEC

::dcmd 的左侧指定显式地址。

DCMD_LOOP

使用 ,count 语法在循环中调用 dcmd,或者通过管道在循环中调用 dcmd。

DCMD_LOOPFIRST

dcmd 函数的此次调用与第一次循环或管道调用相对应。

DCMD_PIPE

dcmd 是使用来自于管道的输入调用的。

DCMD_PIPE_OUT

使用设置为管道的输出调用 dcmd。

为方便起见,提供了 DCMD_HDRSPEC() 宏,这样 dcmd 就可以测试其标志,以确定它是否应该列显标题行(即,它不作为循环的一部分进行调用,或者它作为循环或管道的第一次迭代被调用)。

argc

argv 数组中的参数数目。

argv

在命令行上 ::dcmd 右侧指定的参数数组。这些参数可以是字符串,也可以是整数值。

dcmd 函数应返回以下整数值之一,这些整数值是在 <sys/mdb_modapi.h> 中定义的。

DCMD_OK

dcmd 已成功完成。

DCMD_ERR

dcmd 由于某个原因而失败。

DCMD_USAGE

由于指定的参数无效,dcmd 失败。返回此值时,将自动列显 dcmd 用法消息(在下文中描述)。

DCMD_NEXT

将使用相同参数自动调用下一个 dcmd 定义(如果存在)。

DCMD_ABORT

dcmd 失败,而且当前的循环或管道应该异常中止。这与 DCMD_ERR 类似,但指示在当前循环或管道中不可能有进一步的进展。

每个 dcmd 都包含一个根据 dcmd() 原型示例定义的函数和对应的 mdb_dcmd_t 结构,如 <sys/mdb_modapi.h> 中所定义。 此结构由以下字段组成:

const char *dc_name

dcmd 的字符串名称,不包含前导的 "::"。该名称不能包含任何 MDB 元字符(如 $`)。

const char *dc_usage

dcmd 的可选用法字符串,在 dcmd 返回 DCMD_USAGE 时列显它。 例如,如果 dcmd 接受选项 -a-b,则可能将 dc_usage 指定为 "[-ab]"。 如果 dcmd 不接受任何参数,则可能将 dc_usage 设置为 NULL。 如果用法字符串以 ":" 开头,则说明这是简写形式,指示 dcmd 需要显式地址(即,它要求在其 flags 参数中设置 DCMD_ADDRSPEC)。如果用法字符串以 "?" 开头,则表明 dcmd 将根据情况决定是否接受地址。这些提示将相应地修改用法消息。

const char *dc_descr

一个强制性说明字符串,简要说明 dcmd 的用途。此字符串应仅包含单行文本。

mdb_dcmd_f *dc_funcp

指向将被调用以执行 dcmd 的函数的指针。

void (*dc_help)(void)

一个指向 dcmd 的 help 函数的可选函数指针。如果此指针不为 NULL,则在用户执行 ::help dcmd 时将调用此函数。此函数可以使用 mdb_printf() 显示详细信息或示例。