次に、イベントハンドラの設定例をあげます。
array[99] でブレークポイントを設定するには、次のように入力します。
(dbx) stop access w &array[99] (2) stop access w &array[99], 4 (dbx) run 実行中: watch.x2 ウォッチポイント array[99] (0x20b68[4]) 行番号 12 ファイル "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 # ステップ実行し、count=inf (関数が 無限大) になったところで停止する (2) stop step -count 0/infinity (dbx) run ... (dbx) status (2) stop step -count 133/infinity |
ここでは、プログラムを停止させているのではなく、明らかにプログラムが終了しています。133 は実行された行数です。ただし、このプロセスは非常に低速です。この方法が有効なのは、何度も呼び出される関数にブレークポイントを設定している場合です。
特定の行で実行された命令の数を数えます 。
(dbx) ... # 調べたい行まで移動する (dbx) stop step -instr -count infinity (dbx) step ... (dbx) status (3) stop step -count 48/infinity # 48 個の命令が実行された |
ステップ実行している行で関数呼び出しが行われる場合、最終的にそれらの呼び出しもカウントされます。step イベントの代わりに next イベントを使用すれば、そのような呼び出しはカウントされません。
別のイベントが発生した場合のみ、ブレークポイントを有効にします。たとえば、プログラムで関数 hash が 1300 番目のシンボル検索以後に正しく動作しなくなるとします。 次のように入力します。
(dbx) when in lookup -count 1300 { stop in hash hash_bpt=$newhandlerid when proc_gone -temp { delete $hash_bpt; } } |
$newhandlerid が、実行された直後の stop in コマンドを参照している点に注意してください。
アプリケーションが処理するファイルを replay 中にリセットする必要がある場合、プログラムを実行するたびに自動的にリセットを行うハンドラを書くことができます。
(dbx) when sync { sh regen ./database; } (dbx) run < ./database... # この間にデータベースファイルが壊れた場合 (dbx) save ... # irun が自動的に行われ、sync イベントが (dbx) restore # 発生し、regen が実行される。 |
プログラムの実行中にその状態をすばやく調べます。
(dbx) ignore sigint (dbx) when sig sigint { where; cancel; } |
プログラムを停止しないでそのスタックトレースを調べるためには、ここで ^C を押します。
コレクタはこれ以外のことも実行できますが、基本的にコレクタの手動標本収集モードが実行する機能は、このように状態を調べます。ここではすでに ^C を使用したため、プログラムに割り込むには SIGQUIT (^\) を使用します。
特定の浮動小数点例外を捕捉します。ここでは、IEEE オーバーフローだけを捕捉しています。
(dbx) ignore FPE # デフォルトのハンドラをオフにする (dbx) help signals | grep FPE # サブコードの名前を思い出せない ... (dbx) stop sig fpe FPE_FLTUND ... |