DBX(1) — UNIX Programmer’s Manual
名称
dbx − デバッガ
形式
dbx [ −r ] [ −i ] [ −k ] [ −I dir ] [ −c file ] [ objfile [ coredump ] ]
解説
dbx は、UNIXのもとでプログラムのソースレベルのデバッグを行うためのツールです。 objfile は、オブジェクトファイル内にシンボルテーブルが含まれるようにするために、 コンパイル時に、特定のフラグ (普通は "g") を指定して生成される オブジェクトコードです。現在のところ、 cc(1) および、 f77(1)、 pc(1) が適切なソース情報を作ります。 dbx のマシンレベルの機能は、 いかなるプログラムに対しても使用することができます。
コンパイラによって作成されたオブジェクトファイル中には、 すべてのソースファイルの名前を含むシンボルテーブルが収められています。 これらのファイルはデバッガを使用しているときに読むことが可能です。
プログラムがエラーを起こしてフォールトした時に、 “core”という名前のファイルが現ディレクトリに存在している場合、または coredump ファイルが指定された場合には、 そのプログラムがいつエラーを起こしたかを調べるために dbx を使用することができます。
ファイル“.dbxinit”が現ディレクトリに存在するときは、まず、 そこに収められているデバッガのコマンドが実行されます。 また現ディレクトリ内に“.dbxinit”がない場合には、 dbx はユーザのホームディレクトリにそのファイルがあるかどうかを チェックします。
コマンド行オプションとその意味は次のとおりです。
−r objfile を即刻実行します。それが成功のうちに終了した場合には、 dbx は終了します。 そうでない場合には、終了(エラー)の理由が報告され、 デバッグモードになります。 −r が指定されていて、標準入力が端末装置ではない場合には、 dbx は“/dev/tty”から入力を読み取ります。
−i あたかも標準入力が端末装置であるかのようにして作動することを dbx に強制します。
−k メモリアドレスをマップします。カーネルのデバッギングに役立ちます。
−I dir ソースファイルを探すときにサーチされるディレクトリのリストに dir を追加します。通常、 dbx は、ソースファイルを探すときは現ディレクトリと objfile のあるディレクトリをサーチします。また、 use コマンドを使用してディレクトリサーチパスを設定することもできます。
−c file 標準入力から読取りを行う前に、 file に収められている dbx のコマンドを実行します。
−r を指定しないとき、 dbx はプロンプトを表示してユーザがコマンドを入力するのを待ちます。
実行およびトレースコマンド
run [args] [< filename] [> filename]
rerun [args] [< filename] [> filename]
args をコマンド行引数として渡して objfile の実行を開始します。 ´<’ または ’>’ を使用して、 通常の方法で入力または出力をリダイレクトすることができます。 rerun が引数なしで使用されると、 直前に実行したときのの引数の並びがプログラムへ渡されます。 この点を除けば、 run と同じです。 最後にシンボルテーブルが読まれたときから現在までに objfile に書込みが行われた場合には、 dbx は新しい情報を読み取ります。
trace [in procedure/function] [if condition]
trace source-line-number [if condition]
trace procedure/function [in procedure/function] [if condition]
trace expression at source-line-number [if condition]
trace variable [in procedure/function] [if condition]
プログラムが実行されるときにトレース情報が表示されます。 トレースをオフにするコマンドのためにある自然数と トレースとの間に対応が付けられます。 (delete コマンド参照)。
最初の引数は、何がトレースされるのかを指定します。 これが source-line-number である場合には、 実行に先だって、その行が表示されます。 現ファイル以外のファイル内にあるソース行番号の前には、 引用符で囲まれたファイル名とコロンを付けなければなりません (例えば、"mumble.p":17)。 引数がプロシージャまたは関数名である場合には、 それが呼び出されるたびに、どのルーチンがそれを呼び出したのか、 どのソース行からそれが呼び出されたのか、 並びにそれにどのようなパラメタが渡されたのかを伝える情報が表示されます。 さらに、その復帰が知らされ、それが関数である場合には、 その関数が返している値も表示されます。 引数が at 節を持った expression である場合には、 該当するソース行に到達したときにその式の値が表示されます。 引数が変数である場合、変数の値が変化したときは、 その変数の名前と値が表示されます。 この形のトレースでは、実行速度はかなり遅くなります。 何も引数が指定されない場合、 各々のソース行が実行される前にそのソース行が表示されます。 この形のトレースでは、実行速度はかなり遅くなります。 節“ in procedure/function ”は、情報の表示を、 指定されたプロシージャまたは関数の内部で 実行が行われている間だけに限定します。 condition は、論理式であり、情報を表示する前に評価されます。 それが偽である場合には、情報は表示されません。
stop if condition
stop at source-line-number [if condition]
stop in procedure/function [if condition]
stop variable [if condition]
指定された行に到達したとき、 プロシージャまたは関数が呼び出されたとき、 変数が変化したとき、 条件が真であるときに、 実行を停止します。
status [> filename ] 現在実行中の trace および stop コマンドを表示します。
delete command-number ...
指定された番号に対応するトレースまたは停止を削除します。 トレースと停止に指定されている番号は、 status コマンドによって表示されます。
catch number
catch signal-name
ignore number
ignore signal-name
シグナルがプログラムへ送られる前に、 シグナルのトラッピングを開始または停止します。 これは、デバッグされているプログラムが 割込みのようなシグナルを扱うものである場合に役立ちます。 シグナルは、番号でも名前 (例えばSIGINT) によっても指定することができます。 シグナル名は大文字でも小文字でもよく、 “SIG”プリフィックスは省略可能です。 デフォルトによって、SIGCONT、SIGCHILD、SIGALRM、 および SIGKILL 以外のすべてのシグナルがトラップされます。
cont integer
cont signal-name
停止した箇所から実行を継続します。 シグナルが指定された場合には、 あたかもプロセスがそのシグナルを受け取ったかのように続行されます。 そうでない場合には、あたかもプロセスが停止していなかったかのように 続行されます。 プロセスが“終了した”場合、つまり、 標準プロシージャ“exit”が呼び出された場合には、 実行は継続できません。 ユーザがプログラムの状態を調べさせるために、 dbx は、プロセスが終了することを許しません。
stepソース行を 1行だけ実行します。
next次のソース行まで実行します。『step』との違いは、 行がプロシージャまたは関数に対する呼び出しを含んでいると、 『step』コマンドはそのブロックの先頭で停止するのに対して、 『next』コマンドは停止しないことです。
return [procedure]
procedure への復帰が実行されるまで、またはそれが指定されていない場合には、 現プロシージャが復帰するまで続行します。
call procedure(parameters)
指定されたプロシージャまたは関数を実行します。
変数と式の表示
名前は、まず現関数内で解釈します(静的)。 もし名前が現関数内に定義されていなければ、 次にあらゆる関数内にスコープを広げて(動的)決定されます。 静的および動的なサーチで結果が出ない場合には、 任意の記号が選ばれ、メッセージ“[using qualified name ]”が表示されます。 この名前の決定手順は、 ブロック名で識別名を修飾すること (例えば“ module.variable ”)によって無効にすることができます。 Cの場合、ソースファイルは“.c”のないファイル名によって 指定されるモジュールとして扱われます。
式は、C および Pascal (または同等な Modula-2) の構文の ほぼ共通した部分を用いて指定されます。 間接参照はプリフィックス“∗”または ポストフィックス“^”のいずれかを使用して表すことができ、 配列式は大かっこ [ ] で表されます。 フィールド参照演算子 (“.”) は、 レコードのほかにポインタでも使用することができるので、 Cの演算子“−>”はサポートされてはいますが、 この演算子の使用を不要にしています。
式のタイプがチェックされます。式のタイプは、 “type-name(expression)” を使用することによって無効にすることができます。 type-name に対応する名前付きタイプがないときには、特殊な構造 “&type-name” および “$$tag-name” を使用して、名前付きタイプまたは C の構造体タグを指すポインタを 表現することができます。
例
タイプ |名前付きタイプ
int |int
char∗ |char
struct aa |$$aa
assign variable = expression 式の値を変数に代入します。
dump [procedure] [> filename]
指定されたプロシージャ内の、または何も指定されない場合には 現プロシージャ内の、変数の名前とその値を表示します。 プロシージャとして "." が指定されたときは、 アクティブ変数がすべてダンプされます。
print expression [, expression ...]
式の値を表示します。
whatis name
指定された名前の宣言を表示します。 この名前は、前述のようにブロック名で修飾することができます。
which identifier
指定された識別名の完全修飾 (すなわちその識別名に割り当てられている 外部ブロック) を表示します。
up [count]
down [count]
名前を決定するために使用される現在の関数を、 count レベルだけスタックの上または下へ移動します。 count のデフォルトは 1 です。
where
実行中のプロシージャまたは関数のリストを表示します。
whereis identifier
指定された識別名に名前が一致するすべてのシンボルの完全修飾を表示します。 シンボルの表示される順序には特に意味がありません。
ソースファイルへのアクセス
/regular expression[/]
?regular expression[?]
指定されたパターンを探すために、 現ソースファイル内を順方向または逆方向へサーチします。
edit [filename]
edit procedure/function-name
filename または指定されていない場合には 現ソースファイルに対してエディタを呼び出します。 procedure または function が指定されている場合には、 それが収められたファイルに対してエディタが呼び出されます。 デフォルトによってどのエディタが呼び出されるかは インストレーションによって違います。 このデフォルトは、環境変数 EDITOR を希望するエディタの名前に セットすることによって無効にすることができます。
file [filename]
現ソースファイル名を filename に変更します。 何も指定されない場合には、 現ソースファイル名が表示されます。
func [procedure/function]
現関数を変更します。何も指定されない場合には、 現関数を表示します。 現関数を変更すると、その結果、 現ソースファイルは変更後の関数の収められたファイルに変更され、 さらに、名前の決定のために使用される現スコープも 暗黙のうちに変更されます。
list [source-line-number [, source-line-number]]
list procedure/function
現在のソースファイル内の、指定された第 1の行番号から 第 2の行番号 (両端を含む) までの行をリストします。 行番号が指定されない場合には、 次の 10行がリストされます。 プロシージャまたは関数の名前が指定された場合には、 n−k 行から n+k 行までがリストされます。ここで、 n はプロシージャまたは関数内の最初の文番号であり、 k は比較的小さな値です。
use directory-list
ソースファイルを探すときにサーチされるディレクトリのリストをセットします。
コマンドの別名と変数
alias name name
alias name “string”
alias name (parameters) “string”
コマンドが処理される際、まず dbx は、そのワードがコマンドまたは文字列のいずれかの 別名であるかどうかをチェックします。それが別名である場合には、次に dbx は、あたかも (パラメタと置き換えられる値を持った) 対応する文字列が入力されたかのように、 その入力を扱います。 例えば、コマンド“rerun”に別名“rr”を定義するためには、 次のようにします。
alias rr rerun
特定の行での停止をセットする“b”と呼ばれる別名を定義するためには、 次のようにします。
alias b(x) “stop at x” コマンド“b(12)”は“stop at 12”に展開されます。
set name [= expression]
set コマンドは、デバッガの変数に値を定義します。 これらの変数の名前は、 デバッグされているプログラム内にある名前と かち合うものであってはならず、 他のコマンド内で対応する式に展開されます。 次の変数は特別な意味を持っています。
$frame
この変数をあるアドレスにセットすると、 dbx は、そのアドレスによって指示されたスタックフレームを、 スタックトレースの実行とローカル変数へのアクセスのために使用します。 これは、カーネルのデバッギングに使用するためのものです。
$hexchars
$hexints
$hexoffsets
$hexstrings
セットすると、dbx はキャラクタ、整数、レジスタからのオフセット、 またはキャラクタポインタをそれぞれ 16進数で表示します。
$listwindow
この変数の値は、関数に関するリストを表示するとき、または list コマンドが引数なしで与えられたときの表示行数を指定します。 デフォルトは 10 です。
$mapaddrs
この変数をセットすると (セットしなければ)、 dbx はアドレスのマッピングを開始(停止)します。 “$frame”とともに、カーネルのデバッギングに役立ちます。
$unsafecall
$unsafeassign
“$unsafecall”がセットされると、 サブルーチンまたは関数の呼出し (例えば call 文内での呼び出し) への引数に対する厳格なチェックがオフになります。 “$unsafeassign”がセットされると、 assign における式の両サイド間での厳格なチェックがオフになります。 dbx のエラー検出機能を制限してしまうので、 これらの変数を使用する場合には十分な注意が必要です。
unalias name
指定された名前の別名を取り消します。
unset name
name の指すデバッガの変数を削除します。
マシンレベルのコマンド
tracei [address] [if cond]
tracei [variable] [at address] [if cond]
stopi [address] [if cond]
stopi [at] [address] [if cond]
マシン命令アドレスを使用して、トレースをオンにしたり、停止をセットします。
stepi
nexti step や next と同様に単一ステップで実行しますが、 ソース行ではなく、単一の命令を実行します。
address ,address/ [mode]
address / [count] [mode]
第1 の address から第2 のアドレスまたは count 数の項目が表示されるまで、メモリの内容を表示します。 アドレスが“.”である場合には、前回最後に表示されたアドレスの直後の アドレスが使用されます。 mode はメモリの表示の仕方を指定します。 省略された場合には、前回に指定されたモードが使用されます。 初期モードは“X”です。 次のモードがサポートされています。
i マシン命令を表示する。
d ワードを 10進数で表示する。
D ロングワードを 10進数で表示する。
o ワードを 8進数で表示する。
O ロングワードを 8進数で表示する。
x ワードを 16進数で表示する。
X ロングワードを 16進数で表示する。
b バイトを 8進数で表示する。
c バイトをキャラクタとして表示する。
s ナルのバイトで終了している文字列を表示する。
f 単精度の実数を表示する。
g 倍精度の実数を表示する。
シンボルアドレスは、名前の前に“&”を付けることによって指定されます。 レジスタは“$aN”、“$dN”で表されます (ここで、N はレジスタの番号)。 アドレスは、他のアドレスと演算子“+”、“−”、 および間接参照 (単項演算子“∗”) から作られる式にすることもできます。
その他のコマンド
gripedbx を担当している人へメッセージを送るために、メールプログラムを呼び出します。
helpdbx のコマンドの形式を表示します。
quitdbx を終了します。
sh command-line
コマンド行を実行のためにシェルへ渡します。 環境変数 SHELL によって使用されるシェルが決定されます。
source filename
指定された filename から dbx のコマンドを読み取ります。
関連ファイル
a.outオブジェクトファイル
関連事項
コメント
sdb でもそうであったように、 dbx は、同様の“重複包含(multiple include)”病にかかっています。 多数のオブジェクトファイルがあり、 それらの各々がヘッダファイルをインクルードする ソースファイルから作られている場合には、 それらのヘッダファイルのためのシンボルテーブルが 各オブジェクトファイル内で繰り返されてしまいます。 各リンクについて 1つのデバッガのスタートアップが行われるため、 リンカ (ld) にシンボルテーブルを再編成させたとしても、 使用されるディスクスペースをいくらか減らすことはできますが、 時間を大幅に節約することはできません。
この問題は、Cにおける #include の無制限な意味体系(語義論)の産物です。 例えば、1個のインクルードファイルには、 各ファイルの別々の本質である静的な宣言を格納することができます。 しかし、Modula-2 を用いても、 内部モジュールタイプのチェックのために必要な シンボルテーブルに相当な量の重複があります。 個々の言語のサポートにもいくつかの問題が残されています。 FORTRAN の問題点としては、論理、論理∗2、複素、 および倍精度複素変数への代入ができないこと、 整数型や実数型ではないパラメタ定数を表現できないこと、 ダミープロシージャの値の特異な表現 (ダミープロシージャのために示される 値は、実際にはプロシージャテキストの最初の数バイトです。 プロシージャのロケーションを見つけるためには、 “&”を使用してその変数のアドレスをとります。)などがあります。
NEWS-OSRelease 3.3