dbx コマンドによるデバッグ

使用例

イベントハンドラを設定するには、次の例を使用してください。

配列メンバーへの書き込みに対するウォッチポイントを設定する

配列 array[99] にウォッチポイントを設定します。


(dbx) stop access w &array[99]
(2) stop access w &array[99], 4
(dbx) run
実行中: watch.x 
(プロセス id 9247)
ウォッチポイント &array[99] (0x20b68[4]) 行番号 12  ファイル "watch.c"
   12          array[i] = i;

単純なトレース

単純なトレースの例 :


(dbx) when step { echo at line $lineno; }

関数の中だけイベントを有効にする (in func)

たとえば、


trace step -in foo

は、次のようなスクリプトと等価です。


# ハンドラの使用不可能状態を作成する
when step -disable { echo Stepped to $line; }
t=$newhandlerid    # ハンドラ ID を憶えておく
when in foo {
 # foo を入力するとトレースハンドラ -enable "$t" が
 # 使用可能になり、foo から返るとトレースが
 # 使用不可能になります。 
 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 コマンドを参照している点に注意してください。


dlopen オブジェクトに対する自動ブレークポイントを設定する

dlopen されたオブジェクトを自動的に管理します。


(dbx) when dlopen mylib.so {	# 古いオブジェクトの削除 (存在する場合)
	if [ -n "$B1" ]
	then	 delete "$B1"
	fi                      	# 新しいオブジェクトの作成
	stop in func
	B1="$newhandlerid"
}

replay 時にアプリケーションファイルをリセットする

アプリケーションが処理するファイルを replay 中にリセットする必要がある場合、プログラムを実行するたびに自動的にリセットを行うハンドラを書くことができます。


(dbx)  when sync { sh regen ./database; }
(dbx)  run < ./database...	# この間にデータベースファイルが壊れた場合
(dbx)  save
...                       	# run が自動的に行われ、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
...