EN JA
DDB(4)
DDB(4) FreeBSD Kernel Interfaces Manual DDB(4)

名称

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

書式

カーネルデバッグを機能を有効にするために、次を含めます:

options KDB
options DDB

カーネル panic(9) (パニック) におけるデバッガの起動を防ぐために:

options KDB_UNATTENDED

パニックに対してコンソールに現在のスレッドのスタックトレースを印刷 (表示) するために:

options KDB_TRACE

シンボリック表現に加えてシンボルの数値を印刷するために、次を定義します:

options DDB_NUMSYM

kgdb(1) でリモートデバッギングが可能とできるように、 gdb(1) バックエンドを有効にするには、次を含めます:

options GDB

解説

ddb カーネルデバッガは、 gdb(1) に発想を得た構文がある対話型デバッガです。実行中のカーネルにリンクされるなら、局所的に‘ debugkeymap(5) 動作を呼び出すことができます。また、 debug.debugger_on_panic sysctl(8) MIB 変数が、 KDB_UNATTENDED オプションが指定されない場合のデフォルトである、0 以外に設定されているなら、デバッガは、カーネル panic(9) 時に呼び出されます。

現在の位置は、 dot (ドット) と呼ばれます。 dot は、プロンプトとして 16 進数形式で表示します。コマンド examinewrite は、最後に行を検査するか最後に位置を変更したアドレスに dot を更新し、 next に検査されるか変更された次の位置のアドレスを設定します。他のコマンドは、 dot を変更せずに、 nextdot と同じになるように設定します。

一般的なコマンドのシンタックスは: command[ /modifier] address[ , count]

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

ddb デバッガは、出力に対して more(1) コマンドのようなページャ機能があります。出力行が lines 変数で設定された数を超えるなら、“ --More--”を表示して応答を待ちます。それに対する有効な応答は、次の通りです:

SPC
もうの 1 ページを表示
RET
もう 1 行を表示
q
現在のコマンドを中断し、コマンド入力モードに戻る

最終に、 ddb は、わずかな (現在 10 項目) コマンドヒストリと簡単な emacs スタイルのコマンド行編集機能を提供しています。 emacs 制御キーに加えて、普通の ANSI 矢印キーは、ヒストリバッファを閲覧したり、現在行の中でカーソルを動かすために使用できます。

コマンド

examine
x
修飾子の形式に従って指定されたアドレスの位置を表示します。複数の修飾子の形式は、複数の位置を表示します。形式が指定されていないなら、このコマンドに指定された最後の形式が使用されます。

フォーマット文字は、次の通りです:

b
バイト (8 ビット) で見ます。
h
ハーフワード (16 ビット) で見ます。
l
ロングワード (32 ビット) で見ます。
g
クワッドワード (64 ビット) で見ます。
a
表示されたロケーション (位置) を印刷 (表示) します。
A
できれば行番号付きでロケーション (位置) を印刷 (表示) します。
x
符号無し 16 進数で表示します。
z
符号付き 16 進数で表示します。
o
符号無し 8 進数で表示します。
d
符号付き 10 進数で表示します。
u
符号無し 10 進数で表示します。
r
現在の基数を符号付きで表示します。
c
下位 8 ビットを文字として表示します。印刷できない文字は、8 進数のエスケープコード (例: ‘ \000’) で表示されます。
s
ロケーションにヌル文字で終了する文字列を表示します。印刷できない文字は、8 進数のエスケープコードで表示されます。
m
各行末に文字ダンプをつけて符号無し 16 進数で表示します。位置も各行の始めに 16 進数で表示されます。
i
命令として表示。
I
マシンに依存したあり得る代替の形式で命令として表示します。
amd64
代替の形式はありません。
i386
代替の形式はありません。
ia64
代替の形式はありません。
powerpc
代替の形式はありません。
sparc64
代替の形式はありません。
S
アドレスに格納されたポインタのためのシンボル名を表示します。

xf
前方検査: 最後に実行されたコマンドによって表示された次のアドレスが開始アドレスとして使用されることを除いて、最後に指定されたパラメータで examine コマンドを実行します。

xb
後方検査: 最後の開始アドレスから最後に実行されたコマンドによって表示されたサイズを引かれたものが開始アドレスとして使用されることを除いて、最後に指定されたパラメータで examine コマンドを実行します。

print[ /acdoruxz]
p[ /acdoruxz]
(上で説明された examine のように) 修飾子文字に従って addr を印刷します。有効な形式は、次の通りです: a, x, z, o, d, u, rc です。修飾子が指定されていないなら、最後に定されたものが使用されます。引数 addr は、文字列で指定できます。その場合は、そのままで印刷されます。例えば:

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

は、次のように印刷されます:

eax = xxxxxx 
ecx = yyyyyy

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

警告: 式の間には、デリミタがないので、奇妙なことが起こるかもしれません。各式を括弧で囲うのが最適です。

set $ variable [ =] expr
名前付き変数やレジスタに expr の値を設定します。有効な変数名は、以下に説明されます。

break[ /u]
b[ /u]
addr にブレークポイントを設定します。 count が指定されるなら、ブレークポイントで停止する前に count - 1 回継続します。ブレークポイントが設定されるなら、ブレークポイント番号は、‘ #’で印刷されます。この数は、ブレークポイントを削除するか、条件を追加する際に使用することができます。

u 修飾子が指定されるなら、このコマンドは、ユーザ空間のアドレスにブレークポイントを設定します。 u オプションがなければ、アドレスは、カーネル空間と見なされ、間違った空間のアドレスは、エラーメッセージを付けて拒否されます。この修飾子は、マシン依存のルーチンによってサポートされる場合にだけ使用することができます。

警告: ユーザテキストが通常のユーザ空間のデバッガによって隠されているなら、ユーザ空間のブレークポイントは、正しく動作しないかもしれません。また、低レベルのコードパスにブレークポイントを設定すると、奇妙な振る舞いが引き起こされるかもしれません。

delete addr
d addr
delete # number
d # number
ブレークポイントを削除します。ターゲットのブレークポイントは、‘ #’のブレークポイント番号によって、または元の break コマンドで指定されたものと同じ addr を使用することによって指定することができます。

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

警告: 決め打ちされたカーネルメモリをウォッチする試みは、 i386 のようないくつかのシステムで復旧不能エラーを引き起こすかもしれません。ユーザアドレスでのウォッチポイントは、最もよく動作します。

hwatch addr , size
アーキテクチャによってサポートされているなら、領域のためのハードウェアウォッチポイントを設定します。領域を変更する試みが起こるとき、実行は、停止します。 size 引数は、4 がデフォルトです。

警告: ハードウェアデバッグ機能には、コマンドが行うウォッチのような別々のアドレス空間の概念がありません。カーネルアドレスの位置だけでウォッチポイントを設定するために hwatch を使用し、ユーザモードのアドレス空間で使用を避けます。

dhwatch addr , size
指定されたハードウェアウォッチポイントを削除します。

step[ /p]
s[ /p]
count 回のシングルステップ (コンマは、構文で必須です)。 p 修飾子が指定されるなら、各ステップ毎に命令を印刷します。そうでなければ、最後の命令のみ印刷します。

警告: マシンタイプによっては、何らかの低レベルのコードパスまたはユーザ空間のコードを通してシングルステップを実行できないかもしれません。ソフトウェアエミュレートでシングルステップを行うマシン (例えば、pmax) では、割り込みハンドラによって実行されたコードを通してのステップ実行は、たぶん間違ったことを行います。

continue[ /c]
c[ /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][ pid | tid][ , count]
t[ /u][ pid | tid][ , count]
where[ /u][ pid | tid][ , count]
bt[ /u][ pid | tid][ , count]
スタックトレース。 u オプションは、ユーザ空間をトレースします。省略されるなら、 trace は、カーネル空間のみをトレースします。オプションの引数 count は、トレースされるフレームの数です。 count が省略されるなら、すべてのフレームが印刷されます。

警告: ユーザ空間のスタックのトレースは、マシン依存のコードが、それをサポートする場合のみ有効です。

search[ /bhl] addr value [ mask][ , count]
value をメモリで検索します。このコマンドは、検索する値が見つけられないなら、興味深い方法で失敗するでしょう。これは、 ddb が不正なメモリに作用することから常に回復されるわけではないからです。オプションの count 引数は、検索を制限します。

findstack addr
指定されたアドレスを含んでいるスレッドカーネルモードのスタックのためのスレッドアドレスを印刷します。スレッドが見つからないなら、スレッドのスタックキャッシュを検索し、キャッシュされたスタックアドレスを印刷します。そうでなければ、何も印刷しません。

show all procs[ /m]
ps[ /m]
すべてのプロセス情報を表示します。プロセス情報は、マシンでサポートされていないか、またはターゲットのプロセスのスタックの底がその時メインメモリ中にない場合、表示されないかもしれません。 m 修飾子は、プロセスの VM マップアドレスを表示し、他の情報を表示しないように変更します。

show all ttys
システム中のすべての TTY を表示します。出力は、 pstat(8) と同様でが、TTY 構造のアドレスも含めて表示します。

show allchains
"show lockchain"が行うような、同じ情報を表示しますが、システムのすべてのスレッドを表示します。

show alllocks
現在保持されているすべてのロックを表示します。このコマンドは、 witness(4) が、カーネルに含まれている場合にだけ、利用可能です。

show allpcpu
"show pcpu"と同じですが、システムに存在するあらゆる CPU を表示します。

show allrman
割り込み要求ライン、DMA 要求ライン、I/O ポート、と I/O メモリアドレスを含んで、リソース管理に関連する情報を表示します。

show apic
APIC IDT ベクトルマッピングに関するデータをダンプします。

show breaks
"break"コマンドで設定したブレークポイントを表示します。

show buffer
struct buf タイプのバッファ構造を表示します。そのような構造は、 I/O サブシステムの実装のために FreeBSD カーネル中で使用されます。出力の正確な解釈についてては、 sys/buf.h ヘッダファイルを参照してください。

show cbstat
TTY サブシステムの簡潔な情報を表示します。

show cdev
引数がないとき、devfs ノード名と struct cdev アドレスからなる、作成されたすべての cdev のリストを表示します。 cdev のアドレスが供給されるとき、cdev のいくつかの内部の devfs の状態を表示します。

show conifhk
現在 run_interrupt_driven_config_hooks() の完了を待っているフックをリストします。

show cpusets
番号付けられた root と割り当てられた CPU 類似セットを印刷します。その他の詳細については、 cpuset(2) を参照してください。

show cyrixreg
Cyrix プロセッサに特有のレジスタを表示します。

show domain addr
アドレス addr でプロトコルドメイン構造 struct domain を印刷します。構造体フィールドの正確な意味に関する、その他の詳細については、 sys/domain.h ヘッダファイルを参照してください。

show ffs [ addr]
引数が与えられるなら、アドレス addr での ffs マウントに関する簡潔な情報を表示します。そうでなければ、それぞれの ffs マウントに関する概要を提供します。

show file addr
アドレス addr に存在するファイル構造 struct file ファイルに関する情報を表示します。

show files
システム内のあらゆるファイル構造に関する情報を表示します。

show freepages
それぞれの空き (free) リストの物理的なページの数を表示します。

show geom [ addr]
addr 引数が与えられないなら、すべての GEOM トポロジを表示します。 addr が与えられるなら、与えられた GEOM オブジェクト (クラス、 geom、プロバイダまたは消費者) に関する詳細を表示します

show idt
IDT レイアウトを表示します。最初のカラムは、IDT ベクトルを指定します。 2 番目のものは、割り込み/トラップハンドラの名前です。それらの関数は、マシン依存です。

show inodedeps [ addr]
それぞれの inodedep 構造に関する簡潔な情報を表示します。 addr が与えられるるなら、供給されたアドレスに位置する fs に属する inodedeps だけが表示されます。

show inpcb addr
addr に存在する IP Control Block struct in_pcb の情報を表示します。

show intr
割り込みハンドラに関する情報をダンプします。

show intrcnt
割り込み統計をダンプします。

show irqs
割り込みラインとそれらのそれぞれのカーネルスレッドを表示します。

show jails
jail(8) の例のリストを表示します。 jls(8) が表示するものに加えて、カーネルの内部の詳細もリストします。

show lapic
この CPU のためのローカルの APIC レジスタから情報を表示します。

show lock addr
ロック構造を表示します。出力形式は、次の通りです:
class:
ロックのクラス。指定できるタイプは、 mutex(9), rmlock(9), rwlock(9), sx(9) です。
name:
ロックの名前。
flags:
ロック初期化関数に渡されるフラグ。正確に指定可能なものに関しては、指定できるロックタイプのマニュアルページを参照してください。
state:
現在のロックの状態。 flags と同様に、それは、ロック特有です。
owner:
ロックの所有者。

show lockchain addr
アドレス addr の特定のスレッドがスリープ不可能で非スピンロックに基づいてウェートしているすべてのスレッドを表示します。

show lockedbufs
"show buf"と同じ情報を表示しますが、あらゆるロックされた struct buf オブジェクトを表示します。

show lockedvnods
システムのすべてのロックされた vnodes をリストします。

show locks
現在取得されるすべてのロックを印刷します。このコマンドは、 witness(4) が、カーネルに含まれている場合にだけ、利用可能です。

show locktree

show malloc
malloc(9) メモリアロケータ統計を印刷します。出力形式は、次の通りです:

Type
一種のメモリを指定します。それは、 MALLOC_DECLARE(9) で与えられたメモリタイプを定義している間に使用される記述文字列と同じです。
InUse
free(9) がまだ、呼び出されていない、与えられたタイプのメモリアロケーションの数。
MemUse
与えられた割り付けタイプによって消費されたメモリを合計。
Requests
与えられたメモリタイプのためのメモリ割り付け要求の数。

vmstat -m”でユーザ空間の同じ情報を集めることができます。

show map[ /f] addr
addr で VM オブジェクトを印刷します。 f 修飾子が指定されるなら、完全なマップが印刷されます。

show msgbuf
システムのメッセージバッファを印刷します。それは、“ dmesg”の場合と同じ出力です。利用者がカーネルパニックとなり、シリアルケーブルをマシンにアタッチし、システムハングの前からブートメッセージを得たいなら、役に立ちます。
show mount
すべてのマウントされたファイルシステムに関する短い情報を表示します。

show mount addr
与えられたマウントポイントに関する詳細を表示します。

show object[ /f] addr
addr で VM オブジェクトを印刷します。 f オプションが指定されるなら、完全なオブジェクトが印刷されます。

show page
VM ページの統計を表示します。

show pageq
VM ページキューの統計を表示します。

show pciregs
PCI バスレジスタを印刷します。“ pciconf -lv”を実行することによって、ユーザ空間で同じ情報を集めることができます。

show pcpu
現在のプロセッサ状態を印刷します。出力形式は、次の通りです:

cpuid
プロセッサ識別子。
curthread
スレッドのポインタ、プロセスの識別子、とスレッドの名前。
curpcb
制御ブロックポインタ。
fpcurthread
FPU スレッドポインタ。
idlethread
アイドルスレッドポインタ。
APIC ID
APIC から来る CPU 識別子。
currentldt
LDT ポインタ。
spin locks held
保持されているスピンロックの名前。

show pgrpdump
システム中の現在のプロセスグループをダンプします。

show proc [ addr]
[ addr]が指定されないなら、現在のプロセスの情報を印刷します。そうでなければ、アドレス addr でプロセスの情報を表示します。

show procvm
プロセス仮想記憶レイアウトを表示します。

show protosw addr
アドレス addr でプロトコルスイッチ構造 struct protosw を印刷します。

show registers[ /u]
レジスタセットを表示します。 u 修飾子が指定されるなら、カーネルレジスタまたは現在保存しているものの代わりにユーザレジスタを表示します。

警告: u 修飾子のサポートは、マシンに依存します。サポートしていないなら、不正確な情報が表示されます。

show rman addr
アドレス addr でリソース管理プログラムオブジェクト struct rman を参照してください。 "show allrman"コマンドで特定のポインタのアドレスを集めることができます。

show rtc
リアルタイムクロック値を表示します。長いデバッギングセッションの役に立ちます。

show sleepchain
特定のスレッドが、スリープ可能なロックに基づいてウェートしている、すべてのスレッドを表示します。

show sleepq
show sleepqueue
両方のコマンドは、同じ機能性を提供します。それらは、スリープキュー struct sleepqueue 構造を表示します。スリープキューは、書き込みの時点は、次の通りである、 (ロックを保持しているスレッドが、スリープするか、またはコンテキストスイッチされるかもしれない) スリープ可能な同期基本関数を実装するために FreeBSD 内で使用されます: condvar(9), sx(9) と標準の msleep(9) インタフェース。

show sockbuf addr
show socket addr
それらのコマンドは、 addr に置かれた struct sockbufstruct socket オブジェクトを印刷します。出力は、言及された構造に存在するすべての値から成ります。正確な解釈とその他の詳細については、 sys/socket.h ヘッダファイルを参照してください。

show sysregs
システムレシスタ (例えば、i386 の cr0-4 を表示します。いくつかのプラットフォームでは存在しません。

show tcpcb addr
アドレス addr にある TCP 制御ブロック struct tcpcb を印刷します。出力の正確な解釈については、 netinet/tcp.h ヘッダファイルを参照してください。

show thread [ addr]
addr が指定されないなら、現在のスレッドに関する詳細な情報を表示します。そうでなければ、 addr のスレッドにカンスル情報が、印刷されます。

show threads
システム中のすべてのスレッドを表示します。出力形式は、次の通りです:

最初のカラム
スレッド識別子 (TID)
2 番目のカラム
スレッド構造アドレス
3 番目のカラム
バックトレース

show tty addr
読み込み可能な形式で TTY 構造の内容を表示します。

show turnstile addr
アドレス addr で turnstile (回転ドア) struct turnstile 構造を表示します。 turnstile は、特定のタイプのロックを保持している間に、スリープすることができないか、または別のスレッドにコンテキストスイッチできない、同期基本関数実装するために FreeBSD カーネル中で使用される構造です。現在、それらは、次の通りです: mutex(9), rwlock(9), rmlock(9)

show uma
UMA アロケータ統計を表示します。出力は、次の 5 つのカラムから成ります:

Zone
UMA ゾーンの名前。最初の引数として uma_zcreate(9) に渡された同じ文字列。
Size
与えられたメモリオブジェクト (slab) のサイズ。
Used
現在使用されている slab の数。
Free
UMA ゾーン中の空き (free) の slab の数。
Requests
与えられたゾーンへの割り付け要求のの数。

全く同じ情報は、“ vmstat -z”の助けでユーザ空間に集められます。

show unpcb addr
アドレス addr に存在する UNIX ドメインソケットのプライベート制御ブロック struct unpcb を表示します。

show vmochk
内部の VM オブジェクトが、どこかにマップされているか、そして、0 の参照カウントがないかどうかを印刷します。

show vmopag
これは、VM オブジェクトによって消費された物理アドレスを表示するはずです。現在、 witness(4) がカーネルでコンパイルされるとき、このコマンドを使用することはできません。

show vnode [ addr]
[ addr]にある vnode struct vnode 構造を印刷します。出力の正確な解釈については、 sys/vnode.h ヘッダファイルを参照してください。

show vnodebufs addr
addr に位置する vnode のクリーン/汚いバッファリストを表示します。

show watches
すべてのウォッチポイントを表示します。 "watch"コマンドで設定されたウォッチポイントを表示します。

show witness
witness(4) サブシステムから来るロック獲得に関する情報を表示します。

gdb
リモート GDB と DDB モードを切り替えます。リモート GDB モードでは、ターゲットマシンのシリアルコンソールポートに接続されたリモートデバッグ機能を使用する gdb(1) を実行する別のマシンが必要とされます。現在は、i386 アーキテクチャでのみ利用可能です。

halt
システムを停止 (halt) します。

kill sig pid
シグナル sig をプロセス pid に送ります。シグナルは、デバッガから戻るとき作用します。ハングアップしているシステムの場合に、リソースの競合を起こすプロセスを kill するために、このコマンドを使用することができます。シグナルのリストに関して signal(3) を参照してください。引数は、 kill(2) と比べて逆にされることに注意してください。

reboot [ seconds]
reset [ seconds]
システムをハードリセットします。オプションの引数 seconds が与えられるなら、デバッガは、リブートの前に最大でも 1 週間、これを待ちます。

help
利用可能なコマンドとコマンドの略語の要約を印刷します。

capture on
capture off
capture reset
capture status
ddb は、 sysctl(2) を使用してユーザ空間からデバッグコマンドの結果を検索するために使用することができる、基本的な出力獲得機能をサポートします。 capture on 出力獲得を有効にします。 capture off 獲得を無効にします。 capture reset は、獲得バッファをクリアして、獲得を無効にします。 capture status は、現在のバッファ使用、バッファサイズと出力獲得の傾向を報告します。

ユーザ空間のプロセスは、次の sysctl(8) を使用して ddb 獲得状態を検査して、管理します:

debug.ddb.capture.bufsize は、現在の獲得バッファサイズを問い合わせるる、または設定するために使用されます。

debug.ddb.capture.maxbufsize は、獲得バッファサイズでのコンパイル時間の制限について問い合わせるために使用されます。

debug.ddb.capture.bytes は、獲得バッファの現在の出力のバイト数を問い合わせるために使用されます。

debug.ddb.capture.data は、適切に特権があるプロセスへの文字列としてバッファの内容を返します。

この機能は、スクリプト記述されたデバッグ出力が、後で解析するために textdump の一部としてディスクを獲得して、コミット (収容) できる、スクリプト記述と textdump(4) 機能と合わせて特に役に立ちます。また、獲得バッファの内容は、 kgdb(1) を使用してカーネルコアダンプで検査することができます。

run
script
scripts
unscript
実行する、定義する、記載する、削除するスクリプト。スクリプト記述の機能に関する詳細については、 スクリプト記述 セクションを参照してください。

textdump dump
textdump set
textdump status
textdump unset
直ちに textdump を行なうために textdump dump コマンドを使用します。より多くの情報は、 textdump(4) にあります。 textdump set コマンドは、伝統的なメモリダンプまたは minidump でなく textdump となるように次のカーネルコアダンプを強制するために使用されます。 textdump status は、textdump がスケジュールされているかどうかを報告します。 textdump unset は、次のカーネルコアダンプとして textdump を実行する要求をキャンセルします。

変数

デバッガは、レジスタと $ name として変数をアクセスします。レジスタ名は、“ show registers”コマンドで見られます。いくつかの変数は、数字の接尾辞が付けられ、変数名の直後にコロンが続く何らかの修飾子があるかもしれません。例えば、レジスタ変数は、ユーザレジスタ (例えば、“ $eax:u”) を示す u 修飾子を持つことができます。

現在サポートされている組み込みの変数は、次の通りです:

radix
入力と出力の基数。
maxoff
アドレスは、 offsetmaxoff より大きくない場合は、“ symbol + offset”として印刷されます。
maxwidth
表示される行の幅。
lines
行の数。それは、組み込みページャによって使用されます。
tabstops
タブストップ幅。
work xx
作業変数。 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
間接指定。‘ :’と上で説明される修飾子を続けることができます。

スクリプト記述

ddb は、タスクまたは特定のイベントへの応答を自動化を可能とするために基本的スクリプト記述の機能をサポートしています。各スクリプトは、連続して実行される DDB コマンドのリストから成り、ユニークな名前に割り当てられます。特定のスクリプト名には、特別な意味があり、それらの名前のスクリプトが定義されたなら、様々な ddb イベントで自動的に実行されます。

script コマンドは、名前によってスクリプトを定義するために使用されます。スクリプトは、‘ ;’文字で分離された一連の ddb コマンドから成ります。例えば:

script kdb.enter.panic=bt; show pcpu 
script lockinfo=show alllocks; show lockedvnods

scripts コマンドは、現在定義されたスクリプトをリストします。

run コマンドは、名前によってスクリプトを実行します。例えば:

run lockinfo

unscript コマンドは、名前によってスクリプトを削除するために使用されます。例えば:

unscript kdb.enter.panic

また、これらの関数は、 ddb(8) コマンドを使用してユーザ空間から実行されます。

特定のスクリプトは、定義されるなら、特定の ddb イベントに対して自動的に実行されます。次のスクリプトは、様々なイベントが起こるとき実行されます:

kdb.enter.acpi
acpi(4) イベントの結果として、カーネルデバッガに入りました。
kdb.enter.bootflags
ブート時に設定されるデバッガブートフラグの結果として、カーネルデバッガに入りました。
kdb.enter.break
シリアルまたはコンソール割り込みの結果として、カーネルデバッガに入りました。
kdb.enter.cam
CAM(4) イベントの結果として、カーネルデバッガに入りました。
kdb.enter.mac
TrustedBSD MAC Framework の mac_test(4) モジュールでアサーションの失敗の結果として、カーネルデバッガに入りました。
kdb.enter.ndis
ndis(4) ブレークポイントイベントの結果として、カーネルデバッガに入りました。
kdb.enter.netgraph
netgraph(4) イベントの結果として、カーネルデバッガに入りました。
kdb.enter.panic
panic(9) が呼び出されます。
kdb.enter.powerfail
sparc64 プラットフォームで powerfail NMI の結果として、カーネルデバッガに入りました。
kdb.enter.powerpc
powerpc プラットフォームで実装されていない割り込みタイプの結果として、カーネルデバッガに入りました。
kdb.enter.sysctl
設定されている debug.kdb.enter sysctl の結果として、カーネルデバッガに入りました。
kdb.enter.trapsig
sparc64 プラットフォームでトラップシグナル (trapsig) イベントの結果として、カーネルデバッガに入りました。
kdb.enter.unionfs
ユニオン (union) ファイルシステムでアサーションの失敗の結果として、カーネルデバッガに入りました。
kdb.enter.unknown
理由が何も設定されずに、カーネルデバッガに入りました。
kdb.enter.vfslock
VFS ロック違反の結果として、カーネルデバッガに入りました。
kdb.enter.watchdog
ウォッチドッグ (watchdog) が発火する結果として、カーネルデバッガに入りました。
kdb.enter.witness
witness(4) 違反の結果として、カーネルデバッガに入りました。

これらのスクリプトで見つけられないイベントで、 ddb は、デフォルトのスクリプトを実行することを試みます:

kdb.enter.default
カーネルデバッガに入りましたが、入るための理由に正確に一致しているスクリプトが、定義されていませんでした。特に興味がない場合を扱うためにすべてをキャッチするために、これを使用できます。例えば、 kdb.enter.witness は、特別の取り扱いを持つために定義され、 kdb.enter.default は、単にパニックしてリブートするために定義されます。

ヒント

ISA 拡張バスがあるマシン上で、簡単な NMI 生成カードは、 A01 と B01 (CHCHK# と GND) カードフィンガの間の押しボタンを接続することによって構築することができます。これらを 2 つのフィンガを一緒にショートする瞬間に、ブリッジチップセットは、NMI を発生させるかもしれません。その NMI は、カーネルに ddb の制御を渡します。いくつかのブリッジチップセットは、CHCHK# 上の NMI を発生させないので、利用者のマイレージ (利点) は、異なるかもしれません。 NMI は、問題を診断するために反応しなくなったマシンでデバッガでのブレーク (中断) を許します。他のバスのブリッジチップセットは、バスの特有の方法を使用することで NMI を発生できるかもしれません。

関連ファイル

下記の /usr/include ディレクトリで、このマニュアルページで言及されているヘッダファイルを見つけることができます。

  • sys/buf.h
  • sys/domain.h
  • netinet/in_pcb.h
  • sys/socket.h
  • sys/vnode.h

歴史

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

Robert N. M. Watson は、 FreeBSD 7.1ddb 出力獲得、 textdump(4) とスクリプト記述のサポートを追加しました。

September 30, 2013 FreeBSD