デバッガー。デバッグを行うツール。
実行をある箇所で止めて変数の内容を見たり、あるいは書き換えたり、実行する箇所を変えたりできる。
(ここではSunStudio10試用版のもの。C言語やC++やJavaにも対応しているらしいが、C言語のしか知らない)
ccで「-g」オプションを付けてコンパイルすると、dbxを使ってデバッグをする際にソースが表示されるようになって便利。
ただし、デバッグする時にソースファイルを参照する模様。
すなわち、ソースファイルが コンパイル時点と同じ場所に存在していないと駄目。ソースファイルを消したり、実行ファイルだけを別マシンに持っていったりすると駄目だということ。
また、ソースファイルだけを書き換えてしまうと同期がとれなくて意味が無くなる(警告が出る)。
% dbx
何も指定せずに起動する。この後、プロセスをアタッチしたりするだろう。
% dbx 実行ファイル
実行ファイルに対してデバッグを行う。
実行ファイルを読み込んで実行できる状態で起動する。この後、実行時引数を設定して実行するだろう。
% dbx 実行ファイル コアファイル
コアファイル(core)に対してデバッグを行う。実行ファイルには、コアダンプしたプロセスの実行モジュールを指定する。
コアファイルの内容を確認する場合に用いる方法であり、この方法で起動した場合は 実行することは出来ない。
% dbx - コアファイル
コアファイル(core)に対してデバッグを行う。(実行ファイルの指定を省略したもの)
% dbx - プロセスID
実行中のプロセスに対してデバッグを行う。(そのプロセスに対してアタッチされる)
この方式で起動した場合、dbxを終了してもプロセスは動き続ける。
commands |
コマンドの一覧を表示する。 |
help コマンド |
コマンドの説明を表示する。 |
runargs 引数… |
実行時引数を指定する。環境変数は認識してくれないので、完全に展開した形で書く必要あり。 |
debug |
実行時引数を表示する。 |
run |
(runargsで指定された引数を使って)実行する。(中断状態から再開するにはcontを使う) |
attach プロセスID |
指定されたプロセスにアタッチする。これにより、実行中のプロセスのデバッグを行うことが出来る。 |
exit |
dbxを終了する。 プロセスをアタッチしていた場合はデタッチされ、プロセス自体は通常通り実行し続ける。 |
実行は、Ctrl+Cで中断することが出来る。
list |
ソースを表示する。(現在行から少し表示する) |
list 行番号 |
ソースを表示する。(指定した行のみ) |
list 行番号,+行数 |
ソースを表示する。(指定された行から指定された行数) |
list ソースファイル名:行番号 |
ソースを表示する。(指定されたファイル) |
func |
現在の関数名を表示する。 |
file |
現在のソースファイル名を表示する。 |
whereami |
現在の停止位置を表示する。(dbx) whereami t@2 (l@2) SignalThread で停止しました 行番号 11 ファイル "sigt.c" 11 r = sigfillset(&set); |
where |
関数呼び出しスタック(呼出状況/呼出履歴)を表示する。(現在の位置が「=> 」で示される) |
up |
関数呼び出しスタック間を移動する。 |
stop in 関数名 |
ブレークポイントを設定する。指定された関数の先頭で停止するようになる。 | stopは、条件指定が出来るコマンドの1つ。 |
stop at 行番号 |
ブレークポイントを設定する。現在のソースファイルの指定された行で停止するようになる。 | |
stop at ソースファイル名:行番号 |
ブレークポイントを設定する。ソースファイルの指定された行で停止するようになる。(dbx) stop at sigt.c:11 |
|
status |
設定されたブレークポイント等を表示する。 | |
delete 番号 |
設定されたブレークポイント等を削除する。番号は、statusで表示される番号 | |
delete all |
設定されたブレークポイント等を全て削除する。 | |
step |
ステップイン。1ステップだけ実行する。そのステップが関数呼び出しならその関数の中に入ってすぐ停止する。 | |
next |
ステップオーバー。1ステップだけ実行する。そのステップが関数呼び出しならその関数を実行する。 | |
step up |
ステップアップ。現在の関数からリターンするまで実行する。 | |
cont |
(停止していた場所から)実行を再開する。 | |
cont at 行番号 |
指定された行へ飛んで、そこから実行を再開する。 |
dump |
現在の関数の全ローカル変数を表示する。 |
print 式 |
式の結果を表示する。ポインター演算を使ったり(print *pやprint p[1]) 関数を呼び出せたり(print strlen(p))できて、けっこう高度! |
assign 変数=値 |
変数に値を設定する。 |
call 関数呼出 |
関数を呼び出す。戻り値は表示されない。 |
printやcallによって呼び出した関数がSEGV等で落ちた場合は、「pop
-c
」で復帰できる。
thread |
現在のスレッド番号を表示する。(dbx) thread 現スレッド ($thread) は t@2 です |
|
thread スレッド番号 |
現在のスレッドを変更する。 これにより、whereやup/downで表示・移動できる対象スレッドを指定する。 (dbx) thread t@1 |
2006-05-13 |
where スレッド番号 |
指定されたスレッドの関数呼び出しスタック(呼出状況/呼出履歴)を表示する。 | 2006-05-28 |
threads |
スレッドの一覧を表示する。 どのスレッドがブレークポイントで停止しているのかも分かる。 |
2006-05-28 |
cont スレッド番号 |
指定されたスレッドを実行再開する。 ブレークポイントで止まった自分のスレッド以外のスレッドを実行できる。その間、自分のスレッドは止まったままとなる。 (dbx) cont t@3 |
2006-05-28 |
cont at 行番号 スレッド番号 cont スレッド番号 at 行番号 |
指定されたスレッドを指定行から実行再開する。(dbx) cont at 11 t@2 |
|
cont |
止まっていた全スレッドを実行再開する。 | 2006-05-28 |
lwps |
LWPの一覧を表示する。LWPとは、スレッドを実行する為のCPU情報のようなものだったような… | |
lwp |
現在のLWPを表示する。 | |
lwp 番号 |
LWPを実行する。「スレッドが実行される」=「スレッドにLWPが割り当てられる」んだったような…(dbx) lwp l@2 |
|
syncs |
同期オブジェクト(mutexロックとか)の一覧を表示する。 | |
sync -info アドレス |
同期オブジェクト(そのオブジェクトのアドレスを指定)の情報を表示する。(dbx) sync -info 0xff239f68 |
特定の条件のときに何らかの動作をされるよう指定するコマンドがある。[2006-05-28]
これらの指定は、statusでどのような指定がされているか確認できるし、deleteで指定を削除できる。
stop 条件 |
条件が満たされたとき、実行を停止する。(ブレークポイントの設定) |
trace 条件 |
条件が満たされたとき、メッセージを表示する。(特定箇所を通過したかどうかの確認) |
when 条件 {コマンド群} |
条件が満たされたとき、コマンド群を実行する。 複数のコマンドを指定できるが、各コマンドの末尾にはセミコロンを付けること!(最後のコマンドにも必要) |
条件には、以下のようなものを指定できる。
条件 | 説明 | 例 |
---|---|---|
in 関数名 |
指定された関数が呼び出されたとき、関数内の先頭で発動。 | (dbx) stop in func |
at 行番号 |
指定された行に来たとき発動。 | (dbx) stop at 11 |
at ソースファイル名:行番号 |
指定されたソースの行に来たとき発動。 | (dbx) stop at src.c:11 |
change 変数 |
変数の値が変更されたときに発動。 マルチスレッドでは非推奨。かつ、accessの方が高速らしい。(「help event watchpoint」で解説が見られる) |
(dbx) trace change i
変数が変更される度に内容と位置が表示される。ただし、マルチスレッドでは正しい位置を示さない上に、実行が変に止まる。(CTRL+Cで強制停止し、contで実行する必要がある) |
access wrxab
アドレス 〔,バイト数 〕 |
指定されたアドレス(から指定バイト数内)にアクセスがあったときに発動。 アクセスの種類は以下の通り。 |
(dbx) trace access w &i,4変数が変更される度にメッセージが表示される。が、位置が表示されるわけではないので、いまいち…。 (dbx) stop access w &i,4変数が変更される度に止まる。 (dbx) when access w &i,4 { print i; where; }変数が変更される度に変数の内容と現在位置を表示する。 |
コマンド名は長いものが多いので、別名(エイリアス)を定義しておくと便利。
「.dbxrc」というファイルを用意しておくと、dbx起動時に読み込まれる。
.dbxrc:
alias c=cont alias n=next alias s="step in" alias p=print alias a=assign
エイリアス使用例:
(dbx) c at 12
;
」で区切ると、複数のコマンドを順次実行できる。(dbx) assign ret=1;cont