このセクションでは、イベントハンドラの設定のいくつかの例を挙げます。
この例は、array[99] にデータ変更ブレークポイントを設定する方法を示しています。
(dbx) stop access w &array[99] (2) stop access w &array[99], 4 (dbx) run Running: watch.x2 watchpoint array[99] (0x2ca88[4]) at line 22 in file "watch.c" 22 array[i] = i;
(dbx) when step { echo at line $lineno; }
次の例に、関数内にいる間ハンドラを有効にする方法を示します。
<dbx> trace step -in foo
このコマンドは次と同等です。
# create handler in disabled state when step -disable { echo Stepped to $line; } t=$newhandlerid # remember handler id when in foo { # when entered foo enable the trace handler -enable "$t" # arrange so that upon returning from foo, # the trace is disabled. when returns { handler -disable "$t"; }; }
この例は、小さなプログラムで実行された行数を確認する方法を示しています。入力:
(dbx) stop step -count infinity # step and stop when count=inf (2) stop step -count 0/infinity (dbx) run ... (dbx) status (2) stop step -count 133/infinity
プログラムは停止することなく、プログラムが終了します。実行された行の数は 133 です。このプロセスは非常に低速です。この方法が有効なのは、何度も呼び出される関数にブレークポイントを設定している場合です。
この例は、コードのある行で実行する命令数をカウントする方法を示しています。
(dbx) ... # get to the line in question (dbx) stop step -instr -count infinity (dbx) step ... (dbx) status (3) stop step -count 48/infinity # 48 instructions were executed
ステップ実行している行で関数呼び出しが行われる場合、最終的にそれらの呼び出しもカウントされます。step イベントの代わりに next イベントを使用すれば、そのような呼び出しはカウントされません。
別のイベントが発生した場合のみ、ブレークポイントを有効にします。たとえば、プログラムが関数 hash で、ただし 1300 番目のシンボル検索の後にのみ、正しく実行しなくなった場合、次のブレークポイントを使用します。
(dbx) when in lookup -count 1300 { stop in hash hash_bpt=$newhandlerid when proc_gone -temp { delete $hash_bpt; } }
この例では、アプリケーションで replay 時にリセットされる必要があるファイルを処理する場合、プログラムを実行するたびにこれを行うハンドラを書くことができます。
(dbx) when sync { sh regen ./database; } (dbx) run < ./database... # during which database gets clobbered (dbx) save ... # implies a RUN, which implies the SYNC event which (dbx) restore # causes regen to run
この例は、プログラムの実行中にプログラムの場所をすばやく確認する方法を示しています。入力:
(dbx) ignore sigint (dbx) when sig sigint { where; cancel; }
次に、^C を発行して、プログラムを停止しないでそのスタックトレースを調べます。
この例は、基本的にコレクタ側の標本モードで実行することです (これだけではありません)。^C が使われているため、プログラムに割り込むには SIGQUIT (^\) を使用します。
次の例に、IEEE アンダーフローなど、特定の浮動小数点例外のみを捕獲する方法を示します。
(dbx) ignore FPE # disable default handler (dbx) help signals | grep FPE # can’t remember the subcode name ... (dbx) stop sig fpe FPE_FLTUND ...
ieee ハンドラを有効にする詳細については、FPE シグナルのトラップ (Oracle Solaris のみ)を参照してください。