第21 章• syscall 提供器243
244
sdt 提供器
静态定义的跟踪(Statically Defined Tracing,SDT) 提供器在软件程序员正式指定的位置创建探
测器。使用SDT 机制,程序员可以有意识地选择DTrace 用户关注的位置,并通过探测器名
称告知有关每个位置的一些语义知识。Solaris 内核已定义了少量的SDT 探测器,在以后可
能会添加更多的探测器。DTrace 还为用户应用程序开发者提供了定义静态探测器的机制,
如第34 章中所述。
探测器
表22–1 中列出了Solaris 内核定义的SDT 探测器。这些探测器的名称稳定性和数据稳定性均
为“专用”,因为此处对其进行的说明仅反映内核的实现,不应推断为接口约定。有关
DTrace 稳定性机制的更多信息,请参见第254 页中的“稳定性”。
表22–1SDT探测器
探测器名称说明arg0
callout-start 在执行callout (请参见
)之前的瞬间触发的
探测器。Callout 由系统时钟定期执
行,代表timeout(9F) 的实现。
指向callout_t(请参见
)的指针,它对应于
要执行的callout。
callout-end 执行callout(请参见
)之后将立即触发的
探测器。
指向callout_t(请参见
)的指针,它对应于
已执行的callout。
interrupt-start 在调入设备的中断处理程序之前的
瞬间触发的探测器。
指向dev_info 结构(请参见
)的指针,它
对应于中断设备。
interrupt-complete 从设备的中断处理程序返回后将立
即触发的探测器。
指向dev_info 结构(请参见
)的指针,它
对应于中断设备。
22 第2 2 章
245
示例
以下示例是用于观察每秒钟内callout 行为的脚本:
#pragma D option quiet
sdt:::callout-start
{
@callouts[((callout_t *)arg0)->c_func] = count();
}
tick-1sec
{
printa("%40a ", @callouts);
clear(@callouts);
}
运行此示例可以发现系统中经常使用timeout(9F) 的用户,如以下输出所示:
# dtrace -s ./callout.d
FUNC COUNT
TS‘ts_update 1
uhci‘uhci_cmd_timeout_hdlr 3
genunix‘setrun 5
genunix‘schedpaging 5
ata‘ghd_timeout 10
uhci‘uhci_handle_root_hub_status_change 309
示例
246 Solaris 动态跟踪指南• 2006 年7 月
FUNC COUNT
ip‘tcp_time_wait_collector 1
TS‘ts_update 1
uhci‘uhci_cmd_timeout_hdlr 3
genunix‘schedpaging 4
genunix‘setrun 8
ata‘ghd_timeout 10
uhci‘uhci_handle_root_hub_status_change 300
FUNC COUNT
ip‘tcp_time_wait_collector 0
iprb‘mii_portmon 1
TS‘ts_update 1
uhci‘uhci_cmd_timeout_hdlr 3
genunix‘schedpaging 4
genunix‘setrun 7
ata‘ghd_timeout 10
uhci‘uhci_handle_root_hub_status_change 300
timeout(9F) 接口仅生成单个计时器过期。需要时间间隔计时器功能的timeout() 的使用者
通常通过timeout() 处理程序安装timeout。以下示例显示了此行为:
#pragma D option quiet
sdt:::callout-start
{
阅读(513) | 评论(0) | 转发(0) |