dbx ./a.out
デバッグ対象のプログラム(ここでは./a.out)に引数が必要な場合は,
dbx起動後にrunコマンドの後ろに指定するので,
ここで指定してはいけない.
| コマンド | 動作 |
|---|---|
stop in main |
シンボルmainにブレイクポイントを設定. |
stop in foo |
関数fooにジャンプした直後の位置にブレイクポイントを設定.
|
stop in C::methodstop 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 / 16xexamine 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・コマンド入力ベースで得られるスピードのほうが価値があるように思う.