S-JIS[2006-04-14/2006-05-28] 変更履歴

dbx

デバッガー。デバッグを行うツール。
実行をある箇所で止めて変数の内容を見たり、あるいは書き換えたり、実行する箇所を変えたりできる。
(ここでは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
down
関数呼び出しスタック間を移動する。

ブレークポイントコマンド

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 関数呼出 関数を呼び出す。戻り値は表示されない。

printcallによって呼び出した関数がSEGV等で落ちた場合は、「pop -c」で復帰できる。

スレッド関連コマンド

thread 現在のスレッド番号を表示する。
(dbx) thread
現スレッド ($thread) は t@2 です
 
thread スレッド番号 現在のスレッドを変更する。
これにより、whereup/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 アドレス,バイト数 指定されたアドレス(から指定バイト数内)にアクセスがあったときに発動。

アクセスの種類は以下の通り。
w…領域に書き込まれたとき
r…領域を読み込んだとき
a…変更後に発動(省略時のデフォルト)
b…変更前に発動

(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
コマンド先打ち
dbx上でプロセスを実行している間にコマンドを入力しておくと、ブレークポイントで止まった瞬間にコマンドが実行される。
また、contの後にセミコロンで続けてコマンドを書いておくと、実行再開後のブレークポイントで止まった瞬間に続きのコマンドが実行される。
まぁ、どこで止まるか予想できていないと予期せぬ動きをするリスクはあるけど…。
Ctrl+Cで実行を中断した場合は、先打ちしていたコマンドは実行されずに消える。

UNIXコマンドへ戻る
メールの送信先:ひしだま