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言語のキャスト演算子が使える.
例えば,変数a がchar 型であるために,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 というコマンドは存在しないため,逆にx やexamine を書いてはいけない.
|
コマンド | 動作 |
---|---|
assign $r26 = 0x1234 |
レジスタ・変数への値の設定. |
set a = 1234 |
dbx の変数値の変更.
デバッグ対象のプログラム内で定義されている変数の意味ではなく,
dbx 自身の振る舞いを設定するための変数への価の設定になることに注意.
デバッグ対象のプログラム内で定義されている変数やレジスタへの値の代入は
assign を使う.
|
ksh |
シェル(ksh)の起動. |
!! |
直前に実行したコマンドの再実行.
この手のコマンドはcsh と同じだと思っておいてよい.
|
!x |
以前実行したコマンドうち,x ではじまるもので一番最近実行したものを再実行. |
/opt/langtools/bin/wdb
)gdb
のフロントエンドとして動作するGUIデバッガ.
gdb
のコマンドを覚えていない人でもgdb
の高機能を享受できるので便利かも.
昔のHP-UXのdde
(dbx
のフロントエンドとして動作するGUIデバッガ)の後継にあたるものじゃないかと思う.
HP-UXでは,ほかにもvdb
というのがあるみたい.
これはVim 5.7をベースにした半GUI(GUIなんだけどキャラクタベース・コマンド入力操作)のデバッガ.
gdb
の各コマンドに対応したボタンが画面下部に表示されているので,コマンドを正確に暗記している必要がなくなるという意味では少し便利かも.
でも,結局のところCUIのgdbがいちばん便利のような気がするけども.
コマンドを覚えなきゃいけないといっても,覚えるべきものはわずかしかないし,
画面表示にしてもデバッグ作業についてはGUIでないと何か不都合というわけでもないから,CUI・コマンド入力ベースで得られるスピードのほうが価値があるように思う.