Solaris 模块调试器指南

格式设置 dcmd

/\?= 元字符用于表示特殊的输出格式设置 dcmd。其中的每个 dcmd 都接受由一个或多个格式字符、重复计数或带引号字符串组成的参数列表。格式字符是下表所示的 ASCII 字符之一。

格式字符用于从目标读取数据和设置数据的格式。重复计数是格式字符前面的正整数,始终用基数 10(十进制)解释它。也可以将重复计数指定为括在方括号中、前面是美元符号的表达式 ($[ ])。必须用双引号 (" ") 将字符串参数引起来。格式参数之间不需要留空格。

格式设置 dcmd 包括:

/

显示目标的虚拟地址空间(从点指定的虚拟地址开始)中的数据。

\

显示目标的物理地址空间(从点指定的物理地址开始)中的数据。

?

显示目标的主目标文件中从与点指定的虚拟地址相对应的目标文件位置开始的数据。

=

按每种指定的数据格式显示点本身的值。因此 = dcmd 对于在基数之间转换和执行运算是很有用的。

除了点外,MDB 还跟踪名为 increment 的另一全局值。增量表示点和上一格式设置 dcmd 读取的所有数据后面的地址之间的距离。

例如,如果格式设置 dcmd 是在点等于地址 A 的情况下执行的,且显示一个 4 字节整数,则在此 dcmd 完成后,点仍为 A,但是增量设置为 4算术展开中所述的 + 字符的计算结果现在是值 A + 4,并可以用于将点重置为后续 dcmd 的下一个数据对象的地址。

大多数的格式字符按与表中所示的数据格式大小相对应的字节数增加增量的值。使用 ::formats dcmd 可以从 MDB 内显示格式字符表。

格式字符包括:

+

按计数递增点(可变大小)

-

按计数递减点(可变大小)

B

十六进制 int(1 字节)

C

使用 C 字符表示法的字符(1 字节)

D

十进制带符号 int(4 字节)

E

十进制无符号 long long(8 字节)

F

双精度(8 字节)

G

八进制无符号 long long(8 字节)

H

交换字节和 short(4 字节)

I

地址和反汇编的指令(可变大小)

J

十六进制 long long(8 字节)

K

十六进制 uintptr_t(4 或 8 字节)

N

新行

O

八进制无符号 int(4 字节)

P

符号(4 或 8 字节)

Q

八进制带符号 int(4 字节)

R

二进制 int(8 字节)

S

使用 C 字符串表示法的字符串(可变大小)

T

水平制表符

U

十进制无符号 int(4 字节)

V

十进制无符号 int(1 字节)

W

缺省基数无符号 int(4 字节)

X

十六进制 int(4 字节)

Y

已解码的 time32_t(4 字节)

Z

十六进制 long long(8 字节)

^

按增量 * 计数递减点(可变大小)

a

点作为符号+偏移

b

八进制无符号 int(1 字节)

c

字符(1 字节)

d

十进制带符号 short(2 字节)

e

十进制带符号 long long(8 字节)

f

浮点(4 字节)

g

八进制带符号 long long(8 字节)

h

交换字节(2 字节)

i

反汇编的指令(可变大小)

n

新行

o

八进制无符号 short(2 字节)

p

符号(4 或 8 字节)

q

八进制带符号 short(2 字节)

r

空格

s

原始字符串(可变长度)

t

水平制表符

u

十进制无符号 short(2 字节)

v

十进制带符号 int(1 字节)

w

缺省基数无符号 short(2 字节)

x

十六进制 short(2 字节)

y

已解码的 time64_t(8 字节)

/\? 格式设置 dcmd 还可以用于写入目标的虚拟地址空间、物理地址空间或目标文件,方法是将以下修饰符之一指定为第一个格式字符,然后指定作为即时值或括在方括号中且前面是美元符号的表达式 ($[ ]) 的字的列表。

写入修饰符包括:

v

将每个表达式值的最低字节写入从点指定的位置开始的目标

w

将每个表达式值的最低 2 字节写入从点指定的位置开始的目标

W

将每个表达式值的最低 4 字节写入从点指定的位置开始的目标

Z

将每个表达式值的完整 8 字节写入从点指定的位置开始的目标

/\? 格式设置 dcmd 还可以分别用来在搜索目标的虚拟地址空间、物理地址空间和目标文件中搜索特定的整数值,方法是将以下修饰符之一指定为第一个格式字符,然后指定值和可选掩码。值和掩码均指定为即时值或括在方括号中且前面是美元符号的表达式。

如果仅指定了值,则 MDB 读取相应大小的整数,并停止在包含匹配值的位置。如果指定了值 V 和掩码 M,则 MDB 读取相应大小的整数,并停止在包含值 X(其中 (X & M) == V)的位置。dcmd 完成时,点将更新为包含匹配项的地址。如果找不到匹配项,则点停留在读取的最后一个地址处。

搜索修饰符包括:

l

搜索指定的 2 字节的值

L

搜索指定的 4 字节的值

M

搜索指定的 8 字节的值

对于用户目标和内核目标,地址空间通常都由一组不连续的段组成。从没有对应段的地址中读取是非法的。如果搜索到达了段边界但未找到匹配项,则在超过段边界结尾的读取失败时它将异常中止。