dbx

dbxの起動

dbx ./a.out

デバッグ対象のプログラム(ここでは./a.out)に引数が必要な場合は, dbx起動後にrunコマンドの後ろに指定するので, ここで指定してはいけない.

ブレイクポイント

コマンド 動作
stop in main シンボルmainにブレイクポイントを設定.
stop in foo 関数fooにジャンプした直後の位置にブレイクポイントを設定.
stop in C::method
stop in method
C++のメソッドにブレークポイントを設定したい場合,メソッド名がユニークであれば,クラス名の部分を省略できるようだ. メソッド名がユニークでない場合は, C::methodのようにスコープ解決演算子(::)を使って指定すればよい.
stop at 50 ソースコードの50行目にブレイクポイントを設定する.

データの表示

コマンド 動作
print a 変数aの内容を表示する.構造体などでも適当な形式で表示してくれる. C言語のキャスト演算子が使える. 例えば,変数achar型であるために,print aとすると, '^R'のように表示されてしまうような場合には, print (int)aのようにキャストしてやると18と整数値で表示されるようになる.
print 1 + 1 式を入力すると答えを表示してくれる. print a + 1のように式の中に変数を用いることもできる.
print foo(a) 手続きfoo(a)を実行する.
print $r28 汎用レジスタr28の内容を表示する. ただ,この用法ではregistersの方が便利かな.
dump 現在の関数内のローカル変数群の名前と内容を表示する.
registers レジスタの現在値を表示する.

移動

コマンド 動作
file foo.c 操作対象のソースファイルを変更する. パスが深くても,ファイル名が一意であれば,パスなしで発見してくれるようだ.
list 50, 70 現在操作対象になっているソースファイルの50行目から70行目までを表示する. 区切り記号がハイフン(-)ではなくてコンマ(,)であることに注意. とってもよく間違える.ハイフンでもよいことにしておいてくれてもよさそうなものなのに,実際にはハイフンはエラーになる. list 50とすると,50行目だけを表示する. 50行目の前後10行を表示するというような便利なコマンドはないようなので, 自分で暗算してlist 40, 60と打たなければならない.
/foo
?foo
fooを検索する.“/”だと下向き検索,“?”だと上向き検索になる. 検索パターンには正規表現が使える. “/”だけを入力すると前回指定したパターンが使われる. したがって,最初の1回だけパターンを書いて,あとは“/”だけでよい. パターンは“/”と“?”で共有しているので, “/”を何回か打ったのち,引き返したくなった場合はパターンを指定せず“?”だけで1個前にもどれる.
listi list instructions. アセンブリ言語リストを表示する.

実行

コマンド 動作
run 実行を開始する.
run -i foo.dat 実行するプログラムにコマンドライン引数を与える場合には, runの後ろに指定する. dbx ./foo -i foo.datは間違いなので注意.
cont continue. (ブレイクポイントで停止したあとで)実行を再開する.
step ステップ実行(高級言語ソースレベルの1ステップ).
next ステップオーバー. 次に実行するコードが手続き(関数)だった場合に, stepだと その手続きの中に入っていくけど, nextだと,関数の中には入らず(関数は1個のコードとして一気に実行されて)次の行に進む.
return 現在実行中の手続き(関数)を脱出したところで停止する.
stepi ステップ実行(機械語レベルの1ステップ).

メモリ内容の表示

コマンド例 動作
0x20000490, 0x20000500 /
0x20000490 /
0x20000490, 0x20000500 / s 文字列(string)として表示する.
(Solaris)
x 0x1be418 / 16x
examine 0x1be418 / 16x
Solarisでは“x”または“examine”が必要.
(注意)AIXではxは“registers”コマンドの省略形になっていて, examineというコマンドは存在しないため,逆にxexamineを書いてはいけない.

その他

コマンド動作
assign $r26 = 0x1234 レジスタ・変数への値の設定.
set a = 1234 dbxの変数値の変更. デバッグ対象のプログラム内で定義されている変数の意味ではなく, dbx自身の振る舞いを設定するための変数への価の設定になることに注意. デバッグ対象のプログラム内で定義されている変数やレジスタへの値の代入は assignを使う.
ksh シェル(ksh)の起動.
!! 直前に実行したコマンドの再実行. この手のコマンドはcshと同じだと思っておいてよい.
!x 以前実行したコマンドうち,xではじまるもので一番最近実行したものを再実行.

資料


はたいたかし
http://exlight.net/
2006-06-22 改訂
Home > 開発ツール > Debugger