Solaris 動的トレースガイド

breakpoint()

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 内の有効化制御ブロック (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) を使用している場合は、書式設定 dcmd であるスラッシュ (/) を入力し、続けて 4 バイトの書き込み修飾子 (W) を指定します。


kmdb[0]: dtrace_destructive_disallow/W 1
dtrace_destructive_disallow:    0x0             =       0x1
kmdb[0]:

:c と入力して、処理を続行します。


kadb[0]: :c

続行後、破壊アクションを再度有効にするには、mdb(1) を使って dtrace_destructive_disallow を明示的にゼロに戻す必要があります。


# echo "dtrace_destructive_disallow/W 0" | mdb -kw
dtrace_destructive_disallow:    0x1             =       0x0
#