スポンサーリンク

DDB(4) FreeBSD カーネルインタフェースマニュアル 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 マクロから書き換えられました。

FreeBSD January 16, 1996 FreeBSD

スポンサーリンク