.\" .\" Mach Operating System .\" Copyright (c) 1991,1990 Carnegie Mellon University .\" All Rights Reserved. .\" .\" Permission to use, copy, modify and distribute this software and its .\" documentation is hereby granted, provided that both the copyright .\" notice and this permission notice appear in all copies of the .\" software, derivative works or modified versions, and any portions .\" thereof, and that both notices appear in supporting documentation. .\" .\" CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" .\" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR .\" ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. .\" .\" Carnegie Mellon requests users of this software to return to .\" .\" Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU .\" School of Computer Science .\" Carnegie Mellon University .\" Pittsburgh PA 15213-3890 .\" .\" any improvements or extensions that they make and grant Carnegie Mellon .\" the rights to redistribute these changes. .\" .\" changed a \# to #, since groff choked on it. .\" .\" HISTORY .\" ddb.4,v .\" Revision 1.1 1993/07/15 18:41:02 brezak .\" Man page for DDB .\" .\" Revision 2.6 92/04/08 08:52:57 rpd .\" Changes from OSF. .\" [92/01/17 14:19:22 jsb] .\" Changes for OSF debugger modifications. .\" [91/12/12 tak] .\" .\" Revision 2.5 91/06/25 13:50:22 rpd .\" Added some watchpoint explanation. .\" [91/06/25 rpd] .\" .\" Revision 2.4 91/06/17 15:47:31 jsb .\" Added documentation for continue/c, match, search, and watchpoints. .\" I've not actually explained what a watchpoint is; maybe Rich can .\" do that (hint, hint). .\" [91/06/17 10:58:08 jsb] .\" .\" Revision 2.3 91/05/14 17:04:23 mrt .\" Correcting copyright .\" .\" Revision 2.2 91/02/14 14:10:06 mrt .\" Changed to new Mach copyright .\" [91/02/12 18:10:12 mrt] .\" .\" Revision 2.2 90/08/30 14:23:15 dbg .\" Created. .\" [90/08/30 dbg] .\" .\" %Id: ddb.4,v 1.6 1997/04/12 21:54:48 joerg Exp % .\" $FreeBSD$ .\" .\" WORD: wired ハードコーディングされた [Jargon File] .\" WORD: modifier 修飾子 .\" .Dd January 16, 1996 .Dt DDB 4 .Os FreeBSD .Sh 名称 .Nm ddb .Nd 対話型カーネルデバッガ .Sh 書式 .Cd options DDB .Sh 解説 .Nm カーネルデバッガは古い kdb のほとんどの機能を、 .Xr gdb 1 の影響を受けた合理的なシンタックスでサポートしています。 .Pp 現在のロケーションは `dot' と呼ばれます。 `dot' はプロンプトに 16 進数の形式で表示されます。 検査と書き込みコマンドは、 最後に検査したか最後に変更したロケーションに `dot' を更新します。 そして、`next' を次に検査もしくは変更するロケーションのアドレスにセットします。 他のコマンドは `dot' を変更せず、`next' を `dot' と同じにします。 .Pp 一般的なコマンドシンタックスは .Cm command Ns Op Li \&/ Ns Ar modifier .Ar address Ns Op Li , Ns Ar count となります。 .Pp 空白行は直前のコマンドをアドレス `next' からカウントを 1、 修飾子 (modifier) なしとして繰り返し実行します。 .Ar address を指定すると `dot' はそのアドレスに設定されます。 .Ar address を省略すると `dot' がアドレスとして使われます。 .Ar count が指定されないと、表示コマンドに対しては 1 が指定されたものとされ、 スタックトレースに対しては無限が指定されたものとなります。 .Pp .Nm デバッガは出力に対し .Xr more 1 のような機能をサポートしています。 出力行が変数 .Li \&$lines で指定されている数を越えると、 .Dq Em --db_more-- を表示し応答を待ちます。 これに対する有効な応答は以下の通りです。 .Pp .Bl -tag -compact -width SPC .It Li SPC 次の 1 ページを表示します .It Li RET 次の 1 行を表示します .It Li q 現在のコマンドを中断し、コマンド入力モードに戻ります .El .Pp .Nm は小さい (現在は 10 項目) コマンドヒストリや、 簡単な Emacs 風のコマンド行編集機能を提供しています。 Emacs のコントロールキーに加え、 通常の ANSI の矢印キーでもヒストリバッファをブラウズしたり、 現在行の中でカーソルを動かしたりすることができるでしょう。 .Sh コマンド .Bl -ohang -compact .It Cm examine .It Cm x 修飾子のフォーマットによって、 指定されたアドレスロケーションの内容を表示します。 複数の修飾子を指定すると、複数のロケーションが表示されます。 フォーマットが指定されないと、 このコマンドに最後に使われたフォーマットが使われます。 .Pp フォーマット文字は以下の通りです。 .Bl -tag -compact -width indent .It Li b バイト (8 ビット) で表示します。 .It Li h ハーフワード (16 ビット) で表示します。 .It Li l ロングワード (32 ビット) で表示します。 .It Li a 表示されたロケーションを表示します。 .It Li A 可能ならばロケーションを行番号で表示します。 .It Li x 符号無しの 16 進数で表示します。 .It Li z 符号付きの 16 進数で表示します。 .It Li o 符号無しの 8 進数で表示します。 .It Li d 符号付きの 10 進数で表示します。 .It Li u 符号無しの 10 進数で表示します。 .It Li r 現在の基数を符号付きで表示します。 .It Li c 下位 8 ビットを文字として表示します。 表示できない文字は 8 進数のエスケープコード (例: `\e000') で表示されます。 .It Li s そのロケーションをナル文字で終了する文字列として表示します。 表示できない文字は 8 進数のエスケープコードで表示されます。 .It Li m 各行末に文字ダンプをつけて符号無しの 16 進数で表示します。 各行頭にロケーションも 16 進数で表示されます。 .It Li i 命令として表示します。 .It Li I マシンに依存したおそらく別のフォーマットで命令として表示します。 .Bl -tag -width MIPS -compact .It Tn VAX 外部ラベルを手続きのエントリマスクとして想定しません。 .It Tn i386 続くロングワードの境界の丸めを行いません。 .It Tn MIPS レジスタの内容を表示します。 .El .El .It Cm xf 前方検査: 最後に指定されたパラメータを使って、検査コマンドを実行します。 最後に実行されたコマンドによって表示されたアドレスが 開始アドレスとして使われます。 .It Cm xb 後方検査: 最後に指定されたパラメータを使って、検査コマンドを実行します。 最後に実行されたコマンドによって表示されたアドレスから 表示されたもののサイズを引いた結果が開始アドレスとして使われます。 .It Cm print Ns Op Cm /acdoruxz 指定された修飾子文字 (上述の .Li examine 参照) にしたがって、 .No Ar addr を表示します。 有効なフォーマットは .Li a , .Li x , .Li z , .Li o , .Li d , .Li u , .Li r , .Li c です。 修飾子が指定されないと、最後に指定されたものが使われます。 .Ar addr は文字列で指定することができます。 その場合はその通りに表示されます。 例えば、 .Bd -literal -offset indent print/x \&"eax = \&" $eax \&"\enecx = \&" $ecx \&"\en\&" .Ed .Pp は次のように表示されます。 .Bd -literal -offset indent eax = xxxxxx ecx = yyyyyy .Ed .It Xo .Cm write Ns Op Cm /bhl .No Ar addr Ar expr1 Op Ar "expr2 ..." .Xc コマンド行で .Ar addr の後に指定された式を .Ar addr からはじまるロケーションに書き込みます。 書き込みサイズの単位は修飾子として文字 .Li b (バイト), .Li h (ハーフワード), .Li l (ロングワード) としてそれぞれ指定できます。 これが省略されると、ロングワードが指定されたものとみなされます。 .Pp .Sy 警告 : 式の間にはデリミタがないので、奇妙なことが起こり得ます。 各式は括弧で括ったほうがいいでしょう。 .It Xo .Cm set .No Li \&$ Ns Ar variable .Op Li = .Ar expr .Xc 名前つき変数やレジスタに .Ar expr の値をセットします。 有効な変数名は後述します。 .It Cm break Ns Op Cm /u .Ar addr にブレークポイントをセットします。 .Ar count が指定されたら、ブレークポイントで停止するまで、 .Ar count - 1 回継続します。 ブレークポイントがセットされたら、ブレークポイント番号が .Sq Li \&# で表示されます。 この数字はブレークポイントを削除したり、 それに条件を追加するのに使うことができます。 .Pp 修飾子 .Li u が指定されると、 このコマンドはユーザ空間アドレスにブレークポイントをセットします。 .Li u オプションが指定されない場合は、 アドレスはカーネル空間のものであると判断され、 空間アドレスが間違っていると、 それは受け付けられずエラーメッセージが表示されます。 この修飾子は マシン依存ルーチンによってサポートされているときのみ使うことができます。 .Pp .Sy 警告 : ユーザテキストが通常のユーザ空間デバッガによってシャドウされている場合は、 ユーザ空間のブレークポイントは正しく動作しません。 また、低レベルのコードパスにおいてブレークポイントをセットすると 奇妙なことも起こるかもしれません。 .It Cm delete Ar addr .It Cm delete Li \&# Ns Ar number ブレークポイントを削除します。 削除対象のブレークポイントは .Li # でブレークポイント番号を指定するか、 元の .Cm break コマンドで指定したものと同じ .Ar addr によって指定します。 .It Cm step Ns Op Cm /p .Ar count 回シングルステップで実行します (ここではコンマは必ず付けなければなりません)。 修飾子 .Li p が指定されると、各ステップ毎に命令を表示します。 これが指定されない場合は、最後の命令のみを表示します。 .Pp .Sy 警告 : マシンのタイプによって異なります。 いくつかの低レベルのコードパスやユーザコードのシングルステップ実行は できないかもしれません。 ソフトウェアによってシングルステップをエミュレートしているマシン (例: pmax) では、割り込みハンドラで実行されているコードからの ステップ実行はおそらく間違ったことを行うことになるでしょう。 .It Cm continue Ns Op Cm /c ブレークポイントかウォッチポイントまで実行を継続します。 修飾子 .Li c が指定されると、実行中の命令をカウントします。 pmax のようないくつかのマシンでは load と store もカウントします。 .Pp .Sy 警告 : カウント中はデバッガは何も表示せずにシングルステップを実行しています。 これは低レベルのコードでのシングルステップ実行が奇妙な振舞いを引き起こす かもしれないことを意味しています。 .It Cm until Ns Op Cm /p 次の call か return 命令で止まります。 修飾子 .Li p が指定されると、 深くネストした call と命令の累積カウントを各 call もしくは return で表示します。 この指定がなければ、マッチする return にヒットした時にのみ表示します。 .It Cm next Ns Op Cm /p .It Cm match Ns Op Cm /p マッチする return 命令で止まります。 修飾子 .Li p が指定されると、 深くネストした call と命令の累積カウントを各 call もしくは return で表示します。 この指定がなければ、マッチする return にヒットした時にのみ表示します。 .It Xo .No Cm trace Ns Op Cm /u .Op Ar frame .Op Ar ,count .Xc スタックトレース。 オプション .Li u を指定すると、ユーザ空間をトレースします。 これがなければ、 .Cm trace はカーネル空間のみをトレースします。 .Ar count はトレースされるフレーム数です。 .Ar count が省略されると、全てのフレームが表示されます。 .Pp .Sy 警告 : ユーザ空間スタックトレースは、 マシン依存コードによってサポートされている場合のみ有効となります。 .It Xo .No Cm search Ns Op Cm /bhl .Ar addr .Ar value .Op Ar mask .Op Ar ,count .Xc メモリ中で .Ar value を検索します。 もし検索した値が見つからなければ、 このコマンドは興味深い方法で失敗するでしょう。 これは ddb がメモリを不正にアクセスした場合に常にリカバーしているわけでは ないことに起因しています。 オプションの引数 .Ar count によって検索を制限します。 .It Cm show all procs Ns Op Cm /m .It Cm ps Ns Op Cm /m 全てのプロセスの情報を表示します。 プロセスの情報はマシンによってサポートされていない場合や、 ターゲットのプロセスのスタックの底がその時にメインメモリにない場合は 表示されないかもしれません。 修飾子 .Li m によって、プロセスの VM マップアドレスを表示し、 他の情報を表示しないようにできます。 .It Cm show registers Ns Op Cm /u レジスタセットを表示します。 オプション .Li u が指定されると、カーネルか現在セーブされているものの代わりに ユーザレジスタが表示されます。 .Pp .Sy 警告 : 修飾子 .Li u のサポートはマシンに依ります。 サポートされていない場合は、正しくない情報が表示されるでしょう。 .It Xo .Cm show map Ns Op Cm /f .Ar addr .Xc .Ar addr における VM マップを表示します。 修飾子 .Li f が指定されると、完全なマップが表示されます。 .It Xo .Cm show object Ns Op Cm /f .Ar addr .Xc .Ar addr における VM オブジェクトを表示します。 オプション .Li f が指定されると、完全なオブジェクトが表示されます。 .It Cm "show watches" 全てのウォッチポイントを表示します。 .It Xo .Cm watch .No Ar addr Ns Li \&, Ns Ar size .Xc ある領域にウォッチポイントをセットします。 その領域への変更が試みられた時に、実行は停止します。 引数 .Ar size のデフォルトは 4 です。 間違った空間アドレスを指定すると、その要求は拒否されエラーメッセージが 表示されます。 .Pp .Sy 警告 : ハードコーディングされたカーネルメモリをウォッチポイントにセットすると、 i386 のようないくつかのシステムでは復旧不可能なエラーが発生することがあります。 ユーザアドレスでのウォッチポイントがもっともうまく動作します。 .It Cm gdb リモート GDB モードと DDB モードを切り替えます。 リモート GDB モードでは、 リモートデバッグ機能を使って .Xr gdb 1 を実行するためにターゲットマシンのシリアルコンソールに接続されているもう 1 台のマシンが必要となります。 現在は .Em i386 アーキテクチャでのみ利用することができます。 .It Cm help 利用可能なコマンドとコマンドの短縮形の要約を表示します。 .El .Sh 変数 デバッガはレジスタと変数を .No Li \&$ Ns Em name としてアクセスします。 レジスタ名は .Dq Cm show registers コマンドで示されるものです。 変数には変数名の頭に数字を付加したり、 変数名の直後にコロンに続いていくつかの修飾子を指定することができます。 たとえば、レジスタ変数は .Li $eax:u のように修飾子 .Li u をつけてユーザレジスタを表すことができます。 .Pp 現在サポートされているビルトイン変数には次のものがあります。 .Bl -tag -width tabstops -compact .It Li radix 入力と出力の基数 .It Li maxoff offset が maxoff より大きくなければ、 アドレスは 'symbol'+offset として表示されます。 .It Li maxwidth 表示行の幅 .It Li lines 行数。"more" 機能で使われます。 .It Li tabstops タブストップ幅。 .It Li work Ns Ar xx ワーク変数。 .Ar xx は 0 から 31 の値をとることができます。 .El .Sh 式 .Sq Li \&~ と .Sq Li \&^ と 単項演算子の .Sq Li \&& を除き、C 言語のほとんど全ての式の演算子がサポートされています。 .Nm での特別ルールは以下の通りです。 .Bl -tag -width Identifiers .It Em 識別子 シンボルの名称はシンボルの値に翻訳されます。 それは対応するオブジェクトのアドレスとなります。 .Sq Li \&. と .Sq Li \&: は識別子に使うことができます。 オブジェクトフォーマット依存ルーチンによってサポートされていれば、 .No Xo .Op Em filename Ns Li \&: .Em func Ns Li \&: Ns Em lineno .Xc と .No Xo .Op Em filename Ns Li \&: .Em variable .Xc と .No Xo .Op Em filename Ns Li \&: .Em lineno .Xc はシンボルとして受け入れられます。 .It Em 数字 基数は最初の 2 文字で決定されます。 .Li 0x は 16 進数, .Li 0o は 8 進数, .Li 0t は 10 進数となり、これらの他は現在の基数にしたがいます。 .It Li \&. `dot' .It Li \&+ `next' .It Li \&.. 検査した最後の行の始めのアドレス。 `dot' や `next' とは違い、これは .Dq Li examine か .Dq Li write コマンドでのみ変更されます。 .It Li \&' 明示的に指定した最後のアドレス。 .It Li \&$ Ns Em variable 指定された変数の値に翻訳されます。 これに .Li : と修飾子を前述したように続けることができます。 .It Em a Ns Li \&# Ns Em b 左側を右側の次の倍数に切り上げる 2 項演算子。 .It Li \&* Ns Em expr 間接。 これに .Sq Li : と修飾子を前述したように続けることができます。 .El .Sh 関連項目 .Xr gdb 1 .Sh 歴史 .Nm デバッガは Mach 用に開発され、386BSD 0.1 に移植されました。 このマニュアルページは Garrett Wollman によって .Fl man マクロから書き換えられました。