void breakpoint(void)
breakpoint() 操作会引起内核断点,从而使系统停止并将控制转移到内核调试器。内核调试器将发出一个字符串,表示触发该操作的 DTrace 探测器。例如,如果要执行以下操作:
# dtrace -w -n clock:entry'{breakpoint()}' dtrace: allowing destructive actions dtrace: description 'clock:entry' matched 1 probe |
在 SPARC 上运行的 Solaris 中,可能会在控制台上显示以下消息:
dtrace: breakpoint action at probe fbt:genunix:clock:entry (ecb 30002765700) Type 'go' to resume ok |
在 x86 上运行的 Solaris 中,可能会在控制台上显示以下消息:
dtrace: breakpoint action at probe fbt:genunix:clock:entry (ecb d2b97060) stopped at int20+0xb: ret kmdb[0]: |
探测器说明后面的地址是 DTrace 中启用控制块 (enabling control block, ECB) 的地址。您可以使用此地址确定有关引起断点操作的探测器启用的更多详细信息。
breakpoint() 操作中的错误可能会导致调用此操作的次数远远多于预期情况。此行为可能反过来阻止您终止正在触发断点操作的 DTrace 使用者。在此情况下,请将内核整数变量 dtrace_destructive_disallow 设置为 1。此设置将禁止计算机上的所有破坏性操作。仅在此特定情况下才应用此设置。
设置 dtrace_destructive_disallow 的准确方法将取决于您所使用的内核调试器。如果在 SPARC 系统上使用 OpenBoot PROM,请使用 w!:
ok 1 dtrace_destructive_disallow w! ok |
确认是否已使用 w? 设置了改变量:
ok dtrace_destructive_disallow w? 1 ok |
键入 go 以继续:
ok go |
如果在 x86 或 SPARC 系统上使用 kmdb(1),请将 4 字节的写入修饰符 (W) 与 / 格式设置 dcmd 一起使用:
kmdb[0]: dtrace_destructive_disallow/W 1 dtrace_destructive_disallow: 0x0 = 0x1 kmdb[0]: |
继续使用 :c:
kadb[0]: :c |
要在继续之后重新启用破坏性操作,需要使用 mdb(1) 将 dtrace_destructive_disallow 显式重置为 0:
# echo "dtrace_destructive_disallow/W 0" | mdb -kw dtrace_destructive_disallow: 0x1 = 0x0 # |