主体缓冲区策略
第11 章• 缓冲区和缓冲161
{
exit(0);
}
其他缓冲区
每个DTrace 启用中都存在主体缓冲区。除了主体缓冲区,一些DTrace 使用者可能有其他内
核中的数据缓冲区:聚合缓冲区(在第9 章中讨论)和一个或多个随机缓冲区(在第13 章
中讨论)。
缓冲区大小
可以基于每个使用者调整每个缓冲区的大小。为每个缓冲区提供了不同的用于调整缓冲区
大小的选项,如下表中所示:
缓冲区大小选项
主体bufsize
随机specsize
聚合aggsize
这些选项的每一个都使用表示大小的值设置。与任何大小选项一样,该值可以具有可选的
大小后缀。有关更多详细信息,请参见第16 章。例如,要在dtrace 的命令行上将缓冲区大
小设置为1MB,可以使用-x 设置该选项:
# dtrace -P syscall -x bufsize=1m
或者,可以将-b 选项用于dtrace:
# dtrace -P syscall -b 1m
最后,可以使用#pragma D option 设置bufsize:
#pragma D option bufsize=1m
所选择的缓冲区大小表示每个CPU 中的缓冲区的大小。而且,对于switch 缓冲区策略,
bufsize 表示每个CPU 中每个缓冲区的大小。缓冲区大小缺省为4MB。
其他缓冲区
162 Solaris 动态跟踪指南• 2006 年7 月
缓冲区调整大小策略
偶尔,系统可能会因为没有足够的可用内存,或者DTrace 使用者超出第16 章中说明的某项
可调整限制,而没有足够可用的内核内存来分配所需大小的缓冲区。可以使用bufresize
选项(缺省为auto)配置缓冲区分配失败的策略。在auto 缓冲区调整大小策略下,将平均
分配缓冲区大小,直到成功进行分配。如果分配的缓冲区小于请求的大小,dtrace(1M) 将
生成一条消息:
# dtrace -P syscall -b 4g
dtrace: description ’syscall’ matched 430 probes
dtrace: buffer size lowered to 128m
...
或:
# dtrace -P ] = count()}’ -x aggsize=1g
dtrace: description ’syscall’ matched 430 probes
dtrace: aggregation size lowered to 128m
...
或者,可以通过将bufresize 设置为manual,要求在缓冲区分配失败之后进行手动干预。在
此策略下,分配失败将会导致DTrace 启动失败:
# dtrace -P syscall -x bufsize=1g -x bufresize=manual
dtrace: description ’syscall’ matched 430 probes
dtrace: could not enable tracing: Not enough space
#
所有缓冲区(主体、随机和聚合)的缓冲区调整大小策略都由bufresize 选项指定。
缓冲区调整大小策略
第11 章• 缓冲区和缓冲163
164
输出格式化
DTrace 提供了内置格式化函数printf() 和printa(),可在D程序中使用这些函数来设置输
出的格式。D编译器提供了printf(3C) 库例程中没有的功能,所以,即使您已经熟悉
printf(),也应该阅读本章内容。本章还将讨论trace() 函数的格式化行为以及dtrace(1M)
用于显示聚合的缺省输出格式。
printf()
printf() 函数可跟踪数据,这部分功能类似于trace()函数,另外还可按指定的特定格式输
出数据和其他文本。printf() 函数会指示DTrace 跟踪与第一个参数之后的每个参数关联的
数据,然后使用第一个printf() 参数说明的规则(称为格式字符串)来格式化结果。
格式字符串是包含任意数量的格式转换的规则字符串,其中的每个转换都以% 字符开头,
该字符说明如何设置对应的参数格式。格式字符串中的第一个转换对应于第二个printf()
参数,第二个转换对应于第三个参数,依此类推。转换之间的所有文本将逐字列显。% 转
换字符之后的字符说明要用于对应参数的格式。
与printf(3C) 不同,DTrace printf() 是D编译器可识别的内置函数。D编译器为DTrace
printf() 提供了几项在C 库printf() 中未提供的有用服务:
D编译器可将参数与格式字符串中的转换进行比较。如果参数类型与格式转换不兼容,
则D编译器会提供错误消息来说明该问题。
D编译器在printf() 格式转换中不需要使用大小前缀。C printf() 例程要求通过添加前
缀(如用%ld 表示long,或者用%lld 表示long long)来指示参数的大小。由于D 编译
器已知参数的大小和类型,因此Dprintf() 语句中不需要这些前缀。
DTrace 为调试和观察功能提供了其他有用的格式化字符。例如,%a 格式转换可用于将指
针列显为符号名和偏移。
要实现这些功能,必须在D程序中将DTrace printf() 函数中的格式字符串指定为字符串常
量。格式字符串不能是string 类型的动态变量。
12 第1 2 章
165
转换规范
格式字符串中的每种转换规范都由% 字符引入,在该字符后按顺序显示以下信息:
零个或多个标志(以任意顺序显示),用于修改转换规范的含义,如下节所述。
可选最小字段宽度。如果转换的值的字节数小于字段宽度,则缺省情况下将在该值的左
侧填充空格,如果指定了左对齐标志(-),则将在该值的右侧填充空格。还可将字段宽
度指定为星号(*),在此情况下,将根据int 类型的另一参数的值动态设置字段宽度。
精度(可选),用于指示d、i、o、u、x 和X 转换要显示的最小位数(将对字段填充前
导零);e、E 和f 转换的基数字符之后要显示的位数,g 和G 转换要显示的最大有效位
数;或者进行s 转换后字符串中要列显的最大字节数。精度采用句点(.) 后跟星号(*) 的
形式(如下所述),或十进制数字字符串的形式。
大小前缀序列(可选),用于指示对应参数的大小,如第167 页中的“大小前缀”中所
述。大小前缀在D中不是必需的,提供它是为了与C printf() 函数兼容。
转换说明符,用于指示要应用于参数的转换类型。
printf(3C) 函数还支持%n$ 形式的转换规范,其中n 是十进制整数;DTrace printf() 不支持
此类型的转换规范。
标志说明符
可通过指定下列其中一个或多个字符(可以按任何顺序显示)来启用printf() 转换标志:
’ 十进制转换结果的整数部分(%i、%d、%u、%f、%g 或%G)的格式是通过使用非货
币分组字符的千位分组字符设置的。某些语言环境(包括POSIX C 语言环境)未
提供用于此标志的非货币分组字符。
- 转换结果将在字段中左对齐。如果未指定此标志,则转换将右对齐。
+ 带符号的转换结果始终以符号(+ 或-)开头。如果未指定此标志,则仅当转换负
值时,转换才以符号开头。
空格如果带符号的转换的第一个字符不是符号或者未产生任何字符,则会在结果前放
置空格。如果同时出现空格和+ 标志,则将忽略空格标志。
# 如果为所选转换定义了替换形式,则会将该值转换为替换形式。转换的替换格式
将与对应转换一起说明。
0 对于d、i、o、u、x、X、e、E、f、g 和G 转换,前导零(跟在任何符号或基数表
示之后)用于填充字段宽度。不会执行任何空格填充。如果同时出现0 和- 标志,
则将忽略0 标志。对于d、i、o、u、x 和X 转换,如果指定了精度,则将忽略0 标
志。如果同时出现0 和’ 标志,则会在进行零填充之前插入分组字符。
printf()
166 Solaris 动态跟踪指南• 2006 年7 月
宽度和精度说明符
可将最小字段宽度指定为任意标志说明符后跟十进制数字字符串,在此情况下,字段宽度
将设置为指定的列数。字段宽度还可以指定为星号(*),在此情况下,将访问int 类型的另
一参数来确定字段宽度。例如,要在字段中列显整数x(由int 变量w 的值确定),应编写
如下D语句:
printf("%*d", w, x);
字段宽度也可使用? 字符来指定,以指定应根据设置地址格式(该地址在操作系统内核的
数据模型中使用十六进制)所需的字符数来设置字段宽度。如果内核使用32 位数据模型,
则宽度设置为8,如果内核使用64 位数据模型,则宽度设置为16。
转换的精度可指定为跟在句点(.) 之后的十进制数字字符串,或者跟在句点之后的星号
(*)。如果使用星号来指定精度,则会访问转换参数之前的类型为int 的另一参数来确定精
度。如果同时将宽度和精度指定为星号,则对应转换的printf() 参数的顺序应按以下顺序
显示:宽度、精度、值
大小前缀
在使用printf(3C) 指示转换参数的大小和类型的ANSI-C 程序中,需要使用大小前缀。因为
D编译器会自动对printf() 调用执行此处理,所以不需要大小前缀。尽管提供大小前缀是
为了与C 兼容,但因为在使用派生类型时它们会将代码绑定到特定数据模型,所以明确建
议不要在D程序中使用它们。例如,如果根据数据模型将typedef 重新定义为其他整数基
本类型,则在未明确知道两种基础类型并且包括强制转换表达式(或定义多个格式字符
串)的情况下,不能使用单个C 转换来同时处理两种数据模型。D编译器通过允许省略大
小前缀并自动确定参数大小来自动解决此问题。
大小前缀只能放在格式转换名称之前和所有标志、宽度以及精度说明符之后。大小前缀如
下所示:
h(可选),用于指定后续的d、i、o、u、x 或X 转换将应用于short 或unsigned
short。
l(可选),用于指定后续的d、i、o、u、x 或X 转换将应用于long 或unsigned long。
Il(可选),用于指定后续的d、i、o、u、x 或X 转换将应用于long long 或unsigned
long long。
L(可选),用于指定后续的e、E、f、g 或G 转换将应用于long double。
l(可选),用于指定后续的c 转换将应用于wint_t 参数,并且后续的s 转换字符将应
用于指向wchar_t 参数的指针。
阅读(501) | 评论(0) | 转发(0) |