DDB(4)

名称
ddb - 対話型カーネルデバッガ

書式
options DDB

解説
ddb カーネルデバッガは古い kdb のほとんどの機能を、 gdb(1) の影響を受けた合理的なシンタックスでサポートしています。

現在のロケーションは `dot' と呼ばれます。 `dot' はプロンプトに 16 進数の形式で表示されます。 検査と書き込みコマンドは、 最後に検査したか最後に変更したロケーションに `dot' を更新します。 そして、`next' を次に検査もしくは変更するロケーションのアドレスにセットします。 他のコマンドは `dot' を変更せず、`next' を `dot' と同じにします。

一般的なコマンドシンタックスは command[/modifier] address[,count] となります。

空白行は直前のコマンドをアドレス `next' からカウントを 1、 修飾子 (modifier) なしとして繰り返し実行します。 address を指定すると `dot' はそのアドレスに設定されます。 address を省略すると `dot' がアドレスとして使われます。 count が指定されないと、表示コマンドに対しては 1 が指定されたものとされ、 スタックトレースに対しては無限が指定されたものとなります。

ddb デバッガは出力に対し more(1) のような機能をサポートしています。 出力行が変数 $lines で指定されている数を越えると、 “--db_more--” を表示し応答を待ちます。 これに対する有効な応答は以下の通りです。

SPC 次の 1 ページを表示します
RET 次の 1 行を表示します
q   現在のコマンドを中断し、コマンド入力モードに戻ります

ddb は小さい (現在は 10 項目) コマンドヒストリや、 簡単な Emacs 風のコマンド行編集機能を提供しています。 Emacs のコントロールキーに加え、 通常の ANSI の矢印キーでもヒストリバッファをブラウズしたり、 現在行の中でカーソルを動かしたりすることができるでしょう。

コマンド
examine
x
修飾子のフォーマットによって、 指定されたアドレスロケーションの内容を表示します。 複数の修飾子を指定すると、複数のロケーションが表示されます。 フォーマットが指定されないと、 このコマンドに最後に使われたフォーマットが使われます。

フォーマット文字は以下の通りです。
b   バイト (8 ビット) で表示します。
h   ハーフワード (16 ビット) で表示します。
l   ロングワード (32 ビット) で表示します。
a   表示されたロケーションを表示します。
A   可能ならばロケーションを行番号で表示します。
x   符号無しの 16 進数で表示します。
z   符号付きの 16 進数で表示します。
o   符号無しの 8 進数で表示します。
d   符号付きの 10 進数で表示します。
u   符号無しの 10 進数で表示します。
r   現在の基数を符号付きで表示します。
c   下位 8 ビットを文字として表示します。 表示できない文字は 8 進数のエスケープコード (例: `\000') で表示されます。
s   そのロケーションをナル文字で終了する文字列として表示します。 表示できない文字は 8 進数のエスケープコードで表示されます。
m   各行末に文字ダンプをつけて符号無しの 16 進数で表示します。 各行頭にロケーションも 16 進数で表示されます。
i   命令として表示します。
I   マシンに依存したおそらく別のフォーマットで命令として表示します。
    VAX 外部ラベルを手続きのエントリマスクとして想定しません。
    i386
        続くロングワードの境界の丸めを行いません。
    MIPS
        レジスタの内容を表示します。
xf
前方検査: 最後に指定されたパラメータを使って、検査コマンドを実行します。 最後に実行されたコマンドによって表示されたアドレスが 開始アドレスとして使われます。
xb
後方検査: 最後に指定されたパラメータを使って、検査コマンドを実行します。 最後に実行されたコマンドによって表示されたアドレスから 表示されたもののサイズを引いた結果が開始アドレスとして使われます。
print[/acdoruxz]
指定された修飾子文字 (上述の examine 参照) にしたがって、 addr を表示します。 有効なフォーマットは a, x, z, o, d, u, r, c です。 修飾子が指定されないと、最後に指定されたものが使われます。 addr は文字列で指定することができます。 その場合はその通りに表示されます。 例えば、

    print/x "eax = " $eax "\necx = " $ecx "\n"

は次のように表示されます。

    eax = xxxxxx
    ecx = yyyyyy

write[/bhl] addr expr1 [expr2 ...] コマンド行で addr の後に指定された式を addr からはじまるロケーションに書き込みます。 書き込みサイズの単位は修飾子として文字 b (バイト), h (ハーフワード), l (ロングワード) としてそれぞれ指定できます。 これが省略されると、ロングワードが指定されたものとみなされます。

警告: 式の間にはデリミタがないので、奇妙なことが起こり得ます。 各式は括弧で括ったほうがいいでしょう。

set $variable [=] expr 名前つき変数やレジスタに expr の値をセットします。 有効な変数名は後述します。
break[/u]
addr にブレークポイントをセットします。 count が指定されたら、ブレークポイントで停止するまで、 count - 1 回継続します。 ブレークポイントがセットされたら、ブレークポイント番号が ‘#’ で表示されます。 この数字はブレークポイントを削除したり、 それに条件を追加するのに使うことができます。

修飾子 u が指定されると、 このコマンドはユーザ空間アドレスにブレークポイントをセットします。 u オプションが指定されない場合は、 アドレスはカーネル空間のものであると判断され、 空間アドレスが間違っていると、 それは受け付けられずエラーメッセージが表示されます。 この修飾子は マシン依存ルーチンによってサポートされているときのみ使うことができます。

警告: ユーザテキストが通常のユーザ空間デバッガによってシャドウされている場合は、 ユーザ空間のブレークポイントは正しく動作しません。 また、低レベルのコードパスにおいてブレークポイントをセットすると 奇妙なことも起こるかもしれません。
delete addr
delete #number
ブレークポイントを削除します。 削除対象のブレークポイントは # でブレークポイント番号を指定するか、 元の break コマンドで指定したものと同じ addr によって指定します。
step[/p]
count 回シングルステップで実行します (ここではカンマは必ず付けなければなりません)。 修飾子 p が指定されると、各ステップ毎に命令を表示します。 これが指定されない場合は、最後の命令のみを表示します。

警告: マシンのタイプによって異なります。 いくつかの低レベルのコードパスやユーザコードのシングルステップ実行は できないかもしれません。 ソフトウェアによってシングルステップをエミュレートしているマシン (例: pmax) では、割り込みハンドラで実行されているコードからの ステップ実行はおそらく間違ったことを行うことになるでしょう。
continue[/c]
ブレークポイントかウォッチポイントまで実行を継続します。 修飾子 c が指定されると、実行中の命令をカウントします。 pmax のようないくつかのマシンでは load と store もカウントします。

警告: カウント中はデバッガは何も表示せずにシングルステップを実行しています。 これは低レベルのコードでのシングルステップ実行が奇妙な振舞いを引き起こす かもしれないことを意味しています。
until[/p]
次の call か return 命令で止まります。 修飾子 p が指定されると、 深くネストした call と命令の累積カウントを各 call もしくは return で表示します。 この指定がなければ、マッチする return にヒットした時にのみ表示します。
next[/p]
match[/p]
マッチする return 命令で止まります。 修飾子 p が指定されると、 深くネストした call と命令の累積カウントを各 call もしくは return で表示します。 この指定がなければ、マッチする return にヒットした時にのみ表示します。

trace[/u] [frame] [,count] スタックトレース。 オプション u を指定すると、ユーザ空間をトレースします。 これがなければ、 trace はカーネル空間のみをトレースします。 count はトレースされるフレーム数です。 count が省略されると、全てのフレームが表示されます。

警告: ユーザ空間スタックトレースは、 マシン依存コードによってサポートされている場合のみ有効となります。

search[/bhl] addr value [mask] [,count] メモリ中で value を検索します。 もし検索した値が見つからなければ、 このコマンドは興味深い方法で失敗するでしょう。 これは ddb がメモリを不正にアクセスした場合に常にリカバーしているわけでは ないことに起因しています。 オプションの引数 count によって検索を制限します。
show all procs[/m]
ps[/m]
全てのプロセスの情報を表示します。 プロセスの情報はマシンによってサポートされていない場合や、 ターゲットのプロセスのスタックの底がその時にメインメモリにない場合は 表示されないかもしれません。 修飾子 m によって、プロセスの VM マップアドレスを表示し、 他の情報を表示しないようにできます。
show registers[/u]
レジスタセットを表示します。 オプション u が指定されると、カーネルか現在セーブされているものの代わりに ユーザレジスタが表示されます。

警告: 修飾子 u のサポートはマシンに依ります。 サポートされていない場合は、正しくない情報が表示されるでしょう。

show map[/f] addr addr における VM マップを表示します。 修飾子 f が指定されると、完全なマップが表示されます。

show object[/f] addr addr における VM オブジェクトを表示します。 オプション f が指定されると、完全なオブジェクトが表示されます。
show watches
全てのウォッチポイントを表示します。

watch addr,size ある領域にウォッチポイントをセットします。 その領域への変更が試みられた時に、実行は停止します。 引数 size のデフォルトは 4 です。 間違った空間アドレスを指定すると、その要求は拒否されエラーメッセージが 表示されます。

警告: ハードコーディングされたカーネルメモリをウォッチポイントにセットすると、 i386 のようないくつかのシステムでは復旧不可能なエラーが発生することがあります。 ユーザアドレスでのウォッチポイントがもっともうまく動作します。
gdb
リモート GDB モードと DDB モードを切り替えます。 リモート GDB モードでは、 リモートデバッグ機能を使って gdb(1) を実行するためにターゲットマシンのシリアルコンソールに接続されているもう 1 台のマシンが必要となります。 現在は i386 アーキテクチャでのみ利用することができます。
help
利用可能なコマンドとコマンドの短縮形の要約を表示します。

変数
デバッガはレジスタと変数を $name としてアクセスします。 レジスタ名は “show registers” コマンドで示されるものです。 変数には変数名の頭に数字を付加したり、 変数名の直後にコロンに続いていくつかの修飾子を指定することができます。 たとえば、レジスタ変数は $eax:u のように修飾子 u をつけてユーザレジスタを表すことができます。

現在サポートされているビルトイン変数には次のものがあります。
radix
    入力と出力の基数
maxoff
    offset が maxoff より大きくなければ、 アドレスは 'symbol'+offset として表示されます。
maxwidth
    表示行の幅
lines
    行数。"more" 機能で使われます。
tabstops
    タブストップ幅。
workxx
    ワーク変数。 xx は 0 から 31 の値をとることができます。

式
‘~’ と ‘^’ と 単項演算子の ‘&’ を除き、C 言語のほとんど全ての式の演算子がサポートされています。 ddb での特別ルールは以下の通りです。

識別子 シンボルの名称はシンボルの値に翻訳されます。 それは対応するオブジェクトのアドレスとなります。 ‘’. と ‘’: は識別子に使うことができます。 オブジェクトフォーマット依存ルーチンによってサポートされていれば、 [filename]: func:lineno と [filename]: variable と [filename]: lineno はシンボルとして受け入れられます。

数字  基数は最初の 2 文字で決定されます。 0x は 16 進数, 0o は 8 進数, 0t は 10 進数となり、これらの他は現在の基数にしたがいます。

.   `dot'

+   `next'

..  検査した最後の行の始めのアドレス。 `dot' や `next' とは違い、これは “examine” か “write” コマンドでのみ変更されます。

'   明示的に指定した最後のアドレス。

$variable
    指定された変数の値に翻訳されます。 これに: と修飾子を前述したように続けることができます。

a#b 左側を右側の次の倍数に切り上げる 2 項演算子。

*expr
    間接。 これに ‘’: と修飾子を前述したように続けることができます。

関連項目
gdb(1)

歴史
ddb デバッガは Mach 用に開発され、386BSD 0.1 に移植されました。 このマニュアルページは Garrett Wollman によって -man マクロから書き換えられました。