Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2018年8月8日
 
 

mdb(1)

名前

mdb - モジュラーデバッガ

形式

mdb [-fkmuwyAFKMSUW] [∓o 
option] [-p pid] [
-s distance] 
     [-I path] [-L 
path] [-P prompt] [
-R root] 
     [-V dis-version] [object [core…] | core… | suffix]

説明

はじめに

mdb ユーティリティーは、稼働中のオペレーティングシステム、オペレーティングシステムのクラッシュダンプ、ユーザープロセス、ユーザープロセスのコアダンプ、およびオブジェクトファイルの低レベルのデバッグと編集を行うための拡張可能なユーティリティーです。mdb の機能の詳細については、マニュアルOracle Solaris Modular Debugger Guideを参照してください。

デバッギングとは、欠陥を取り除くために、ソフトウェアプログラムの実行と状態を分析するプロセスのことです。従来のデバッグ用のツールは、実行制御の機能を備えたもので、それによって、プログラマは制御された環境でプログラムを実行し直したり、プログラムデータの現在の状態を表示したり、プログラム開発に使用するソース言語の表現を評価したりできます。

残念ながら、これらの手法は、バグが再現しない、プログラムの状態が大規模で分散しているオペレーティングシステムなどの複雑なソフトウェアシステムのデバッグには適さないことがよくあります。また、高度に最適化され、デバッグ情報が削除されている、それ自体が低レベルのデバッグ用ツールであるプログラムや、開発者が事後情報にしかアクセスできない顧客環境にも適しません。

mdb では、前述のようなプログラムや状況をデバッグするために、徹底的にカスタマイズできます。mdb に含まれている動的なモジュール機能を使用して、プログラム固有の分析を行う場合に、プログラマ独自のデバッギングコマンドを実行できます。プログラムの実行時、事後分析時などさまざまな状況で、各 mdb モジュールをプログラム検査に使用できます。

定義

ターゲットとは、デバッガによって検査されるプログラムのことです。mdb は現在、次の種類のターゲットをサポートしています。ユーザープロセス、ユーザープロセスのコアファイル、稼働中のオペレーティングシステム (/dev/kmem および /dev/ksyms 経由)、オペレーティングシステムのクラッシュダンプ、オペレーティングシステムのクラッシュダンプ内に記録されたユーザープロセスイメージ、ELF オブジェクトファイル、および raw バイナリファイル。各ターゲットは、1 つ以上のアドレス空間、1 つ以上のシンボルテーブル、ロードオブジェクトセット、後述のデバッガコマンドを使って検査できるスレッドセットなど、プロパティーの標準セットをエクスポートします。

デバッガコマンド (mdb 用語法では、dcmd と表記し、「ディーコマンド」と読む) は、デバッガルーチンで、現ターゲットのどのプロパティーにもアクセスできます。mdb は、標準入力からコマンドを構文解析し、次に対応する dcmd を実行します。各 dcmd は、文字列や数値引数のリストも受け取ることができます (後述の構文の説明を参照)。あとで説明しますが、mdb には、常に使用可能な組み込み dcmd セットが入っています。独自の dcmd を記述して、mdb そのものの機能を拡張することもできます (Oracle Solaris Modular Debugger Guideを参照)。

walker は、特定のプログラムデータ構造体の要素を調べたり、繰り返し調べたりする方法を記述するルーチンセットです。walker は、dcmd や mdb そのものからデータ構造体の実装状態をカプセル化します。walker は、対話処理でも使用でき、ほかの dcmd や walker を構築するためのプリミティブとしても使用できます。dcmd の場合と同様に、独自の walker をデバッガモジュールの一部として実装することにより、mdb を拡張できます。

デバッガモジュール (dmod と表記し、「ディーモッド」と読む) は、動的に読み込まれるライブラリで、一連の dcmd と walker が含まれています。初期設定の状態では、mdb は、ターゲット内に存在するロードオブジェクトに対応する dmod を読み込もうとします。その後、mdb を実行している間はいつでも、dmod の読み込みや読み込み解除ができます。mdb には、Solaris カーネルをデバッグするための標準 dmod セットが付属しています。独自のデバッガモジュールの開発に関する詳細は、Oracle Solaris Modular Debugger Guideを参照してください。

「マクロファイル」とは、実行するコマンドセットが入っているテキストファイルのことです。一般的に、マクロファイルは、単純データ構造体の表示プロセスを自動化するときに使用されます。mdb には、adb(1) 用に記述されたマクロファイルの実行に関して完全な下位互換性があり、Solaris インストールには、エディタツールで使用できる Solaris カーネルのデバッグ用マクロファイルセットが含まれています。

構文

デバッガは、標準入力からコマンドを処理します。端末からの標準入力の場合、mdb では端末編集機能が使用できます。また、mdb は、マクロファイルからのコマンドや dcmd パイプラインからのコマンドも処理できます。これについては後述します。言語構文は、ターゲット内のメモリーアドレスに代表されるような、式の値を計算し、次に dcmd をそのアドレスに適用するという構想に基づいて設計されています。現在のアドレス位置はドットとして参照され、その値は「.」を使って参照されます。

メタキャラクタには、次のような文字があります。

[   ]   |   !   /   \   ?   =   >   $   :   ;   
            NEWLINE   SPACE   TAB

ブランク (blank) は、タブ (TAB) またはスペース文字 (SPACE) のことです。ワード (word) とは、1 つまたは複数の引用符なしのメタキャラクタで区切られた文字列のことです。ただし、コンテキストによっては単に区切り記号として機能するメタキャラクタもあるので、これについては後述します。識別子とは、文字、下線、またはピリオドで始まる、一連の文字列、数字、下線、ピリオド、逆引用符のことです。識別子は、シンボル名、変数、dcmd、 walker として使用されます。コマンドは、復帰改行文字やセミコロン (;) で区切ります。

dcmd は、次のようなワードまたはメタキャラクタで表されます。

/   \   ?   =   >   $character   :character  ::identifier

メタキャラクタで設定された dcmd や、$: を接頭辞として 1 つ持つ dcmd は、組み込み演算子として提供され、レガシー adb(1) ユーティリティーのコマンドセットとの互換性を備えています。dcmd が解析されると、/\?=>$: の各文字は、引数リストが終了するまでメタキャラクタとして認識されなくなります。

単純コマンドとは、空白文字で区切られた、0 個以上の一連のワードが後ろに続く dcmd のことです。これらのワードは、呼び出される dcmd に引数として渡されます。ただし、後述の「クォート」と「算術展開」で特に指定されているワードは例外です。各 dcmd は、処理の成功、失敗、または無効な引数を受け取ったことを示す終了ステータスを返します。

パイプライン (pipeline) は、パイプ (|) で区切られた 1 つ以上の単純コマンドの並びです。シェルの場合とは異なり、mdb のパイプラインの dcmd は、別々のプロセスとしては実行されません。mdb では、パイプラインが構文解析されたあとに、それぞれの dcmd が左から右へと順に呼び出されます。各 dcmd の出力は、処理されたあとに格納されます (後述の「dcmd パイプライン」を参照)。左側の dcmd 処理が終了すると、その出力はパイプライン内の次の dcmd への入力として使用されます。いずれかの dcmd が終了ステータスとして正常終了を返さない場合、そのパイプラインは強制終了します。

式 (expression) は一連のワードで表され、64 ビットの符号なし整数を計算するために評価されます。ワードは、後述の「算術展開」に示す規則を使用して評価されます。

コマンド

コマンドは、次のいずれかです。

pipeline [! word . . .] [ ; ]

単純コマンドまたはパイプラインは、接尾辞として感嘆符 (!) を付けることもできます。この場合、デバッガは pipe(2) を開いたあと、mdb パイプライン内の最後の dcmd の標準出力を、$SHELL –c の実行により作成された外部プロセスへ送ります。c オプションのあとには、感嘆符 (!) の後ろのワードを結合して生成される文字列が続きます。詳細については、後述の「シェルエスケープ」を参照してください。

expression pipeline [ ! word . . .] [ ; ]

単純コマンドまたはパイプラインは、接頭辞として式を付けることもできます。この場合、パイプラインが実行される前に、ドットの値 (「.」で表される変数) が式の値に設定されます。

expression , expression pipeline [! word ] [ ; ]

単純コマンドまたはパイプラインは、接頭辞として式を 2 つ付けることもできます。最初の式は新しいドット値を判定するために評価され、2 番目の式はパイプライン内の最初の dcmd の繰り返し回数を判定するために評価されます。この場合、dcmd は、判定された回数繰り返し実行し、そのあとにパイプライン内の次の dcmd を実行します。繰り返し回数は、パイプライン内の最初の dcmd にだけ適用されます。

, expression pipeline [! word . . .] [ ; ]

式の値に応じて、パイプライン内の最初の dcmd が繰り返されます。ただし、先頭の式が省略されている場合、ドットは変更されません。

expression [! word . . .] [ ; ]

コマンドは、算術式だけで構成される場合があります。この場合、式が評価されたあと、その値にドット変数が設定されます。次に、直前の dcmd と引数が新しいドット値を使用して実行されます。

expression, expression [! word . . .] [ ; ]

コマンドは、ドット式と繰り返し回数式だけで構成される場合があります。この場合、最初の式の値がドットに設定されたあと、2 番目の式で指定された回数、直前の dcmd と引数が繰り返し実行されます。

, expression [ ! word . . .] [ ; ]

直前の dcmd と引数が、繰り返し回数式の値で指定された回数、繰り返し実行されます。ただし、先頭の式が省略されている場合は、ドットは変更されません。

! word . . . [ ; ]

コマンドが感嘆符 (!) で始まっている場合、どの dcmd も実行されません。つまり、デバッガは感嘆符 (!) の後ろに指定されたワードを結合して、その文字列を $SHELL –c の後ろに指定して実行するだけです。

Comments

// を付けると、その後の復帰改行文字まで、ワードや文字列がすべて無視されます。

演算機能の拡張

mdb コマンドの前に、開始アドレスを表すオプション式や、開始アドレスと繰り返し回数を表すオプション式がある場合は、演算機能が拡張されます。また、dcmd に使用する数値引数を計算する場合にも、演算機能が拡張されます。演算式は、ドル記号の後ろに角括弧で囲んだ引数リスト ($[ expression ]) で表され、その式の値に置き換えられます。

式には、次の特殊ワードのどれかを使用できます。

integer

特定の整数値。整数値は、接頭辞として 0i または 0I を付けると 2 進数値、0o または 0O を付けると 8 進数値、0t または 0T を付けると 10 進数値、0x または 0X を付けると 16 進数値 (デフォルト) を表します。

0[tT][0-9]+.[0-9]+

指定された 10 進数の浮動小数点値。IEEE 倍精度浮動小数点表示に変換されます。

'cccccccc'

各文字を ASCII 値に等しいバイトに変換することによって計算された整数値。最大 8 文字までを文字定数に指定できます。文字列は、最下位のバイトから始まって、右から左へと逆方向に整数の中へ格納されます。

<identifier

識別子 (identifier) によって指定される変数値。

identifier

識別子 (identifier) によって指定されるシンボル値。

(expression)

式 (expression) の値。

.

ドット値。

&

dcmd を実行するために使用される最新のドット値。

+

現在のインクリメントによって増分されるドット値。

^

現在のインクリメントによって減分されるドット値。

インクリメントとは、最後にフォーマット dcmd によって読み込まれる合計バイトを格納する大域変数のことです。インクリメントの詳細については、後述の「フォーマット dcmd」を参照してください。

単項演算子は右結合で、2 項演算子よりも優先順位は高くなります。単項演算子を次に示します。

#expression

論理否定。

~expression

ビット単位の補数。

-expression

整数否定。

%expression

ターゲットの仮想アドレス空間内の仮想アドレス式に対応するオブジェクトファイル位置でのポインタサイズの数量値。

%/[csil]/expression

ターゲットの仮想アドレス空間内の仮想アドレス式に対応するオブジェクトファイル位置での char サイズ、short サイズ、int サイズ、または long サイズの数量値。

%/[1248]/expression

ターゲットの仮想アドレス空間内の仮想アドレス式に対応するオブジェクトファイル位置での 1 バイト、2 バイト、4 バイト、または 8 バイトの数量値。

%/<var/expression

仮想アドレス式に対応するオブジェクトファイル位置からの値。値のサイズは変数 var から読み取られます。

*expression

ターゲットの仮想アドレス空間内の仮想アドレス式でのポインタサイズの数量値。

*/[csil]/expression

ターゲットの仮想アドレス空間内の仮想アドレス式での char サイズ、short サイズ、int サイズ、または long サイズの数量値。

*/[1248]/expression

ターゲットの仮想アドレス空間内の仮想アドレス式での 1 バイト、2 バイト、4 バイト、または 8 バイトの数量値。

*/<var/expression

仮想アドレス式に対応するターゲットの仮想アドレス空間からの値。値のサイズは変数 var から読み取られます。

*/type member/expression

仮想アドレス式に対応するターゲットの仮想アドレス空間からのデータ構造体メンバーの値。読み取られるサイズおよびオフセットは、メンバーによって指定されます。

たとえば、uid がゼロでないカーネル内のすべてのプロセスを一覧表示するには、次のようにします。

> ::walk proc | ::grep '*/proc p_cred->cr_uid/.!=0'

2 項演算子は左結合で、単項演算子よりも優先順位は低くなります。次に 2 項演算子を、優先度の高いものから順に示します。

*

整数の乗算。

%

整数の除算。

#

左辺を右辺の最小の倍数に切り上げる。

+

整数の加算。

-

整数の減算。

<<

ビット単位で左へシフト。

>>

ビット単位で右へシフト。

==

等しい。

!=

異なる。

&

ビット単位の論理積。

^

ビット単位の排他的論理和。

|

ビット単位の論理和。

クォート

「構文」で説明したように、各メタキャラクタは引用符で囲まないとワードを終了します。mdb を使用して各文字を特別な意味のない文字そのものとして解釈させるには、それらを単一引用符 (' ') または二重引用符 (“ ”) で囲めば、文字列として引用できます。単一引用符を、単一引用符で囲んで表示させることはできません。二重引用符内では、mdb は C プログラミング言語の文字エスケープシーケンスを認識します。

シェルエスケープ

! 文字を使用して、mdb コマンドとユーザーのシェル間のパイプラインを作成できます。$SHELL 環境変数が設定されている場合、mdb はそのプログラムをシェルエスケープのためにフォーク (fork) したり、実行 (exec) したりします。変数が設定されていない場合は、/bin/sh コマンドが使用されます。シェルは、–c オプション付きで呼び出されます。c オプションのあとには、感嘆符 (!) の後ろのワードを結合して生成される文字列が続きます。! 文字は、ほかのどのメタキャラクタよりも高い優先度を持っています。ただし、セミコロン (;) と復帰改行文字は例外です。シェルエスケープが検出されたら、次のセミコロンまたは復帰改行文字までの残りの文字列は、そのままシェルへ渡されます。シェルの出力コマンドを mdb dcmd へパイプすることはできません。シェルエスケープによって実行されたコマンドは、その出力を mdb へは送らずに、直接端末へ送ります。

変数

変数は、変数名、対応する整数値、および一連の属性を持ちます。変数名は、一連の文字列、数字、下線、ピリオドなどで表されます。変数には、> dcmd や ::typeset dcmd を使用して値を割り当てることができます。また、その属性は、::typeset dcmd を使用して変更できます。各変数の値は、64 ビットの符号なし整数として表されます。変数は、1 つまたは複数の属性を持つことができます。 たとえば、読み取り専用 (ユーザーによって変更されない)、固定表示 (ユーザーによって設定解除されない)、タグ (ユーザー定義のインジケータ) などです。

次の変数の属性は固定表示として定義されています。

0

/ \?= の dcmd を使用して出力された最新の値。

9

$< dcmd とともに使用された最新のカウント。

b

データセクションの基底仮想アドレス。

d

データセクションのバイトサイズ。

e

エントリポイントの仮想アドレス。

m

ターゲットのプライマリオブジェクトファイルの初期バイト (マジックナンバー)。オブジェクトファイルがまだ読み出されていない場合はゼロ。

t

テキストセクションのバイトサイズ。

hits

一致したソフトウェアイベント指定子が一致した回数。後述の「イベントコールバック」を参照してください。

thread

現在の代表スレッドのスレッド識別子。この識別子の値は、現在のターゲットが使用しているスレッド化モデルによって変わります。後述の「スレッドのサポート」を参照してください。

さらに、mdb カーネルとプロセスターゲットは、代表スレッドのレジスタセットの現在値を設定変数としてエクスポートします。これらの変数の名前は、ターゲットのプラットフォームや命令セットのアーキテクチャーによって決まります。

シンボルの名前解決

前述の「構文」で説明しているように、式コンテキスト内にあるシンボル識別子は該当するシンボルの値を求めるために評価します。一般的に、この値は、ターゲットの仮想アドレス空間内のシンボルと関連付けられる、記憶領域の仮想アドレスを表します。ターゲットは、プライマリ実行可能シンボルテーブル、プライマリ動的シンボルテーブル、実行時リンクエディタシンボルテーブル、およびロードオブジェクト (ユーザープロセスの共有ライブラリや Solaris カーネルのカーネルモジュールなど) の各番号の標準シンボルテーブルと動的シンボルテーブルを含む (ただし、これらに限定されません) 複数のシンボルテーブルをサポートできます。一般的に、ターゲットは、最初にプライマリ実行可能シンボルテーブルを検索し、次にほかの 1 つまたは複数のシンボルテーブルを検索します。ELF シンボルテーブルには、外部シンボル、大域シンボル、静的シンボルなどへのエントリだけが含まれます。自動シンボルは、mdb によって処理されるシンボルテーブルにはありません。

さらに、mdb が提供する専用のユーザー定義シンボルテーブルは、ほかのどのターゲットシンボルテーブルよりも先に検索されます。専用シンボルテーブルは、最初は空の状態ですが、::nmadd dcmd や ::nmdel dcmd を使用して操作できます。::nm –P オプションは、専用のシンボルテーブルの内容を表示するために使用されます。専用のシンボルテーブルによって、元のプログラムでは抜け落ちていたプログラム機能やデータのシンボル定義を作成できます。次からは、mdb がシンボル名をアドレスに変換したり、アドレスをもっとも近くのシンボルへ変換したりするときにはいつでも、これらの定義が使用可能となります。

ターゲットには複数のシンボルテーブルが含まれていて、各シンボルテーブルには複数のオブジェクトファイルからシンボルを入れることができるので、同じ名前で異なるシンボルが存在することもあります。このような場合に、プログラマが希望するシンボル値を得られるように、mdb はシンボル名適用範囲演算子として、逆引用符 (`) を使用します。プログラマは、シンボル名の解釈に使用する範囲を次のように指定できます。つまり、object`namefile`name、または object`file`name です。オブジェクトの識別子は、ロードオブジェクトの名前を参照します。ファイル識別子は、ソースファイルのベース名を参照します。ソースファイルは、指定されたオブジェクトのシンボルテーブル内に STT_FILE 型のシンボルを持っています。オブジェクト識別子の解釈は、ターゲットタイプによって決まります。

mdb カーネルターゲットでは、オブジェクトが、読み込まれたカーネルモジュールのベース名を指定すると考えられます。たとえば、次のシンボル名を考えてみましょう。

specfs`_init

これは、 specfs カーネルモジュール内の _init シンボルの値を求めるために評価します。

mdb プロセスターゲットでは、オブジェクトが、実行可能な名前、または読み込まれた共用ライブラリの名前を指定すると考えられます。この場合、次の形式のどれかが使用されます。

  1. 完全一致 (つまり、フルパス名): /usr/lib/libc.so.1

  2. ベース名に完全に一致: libc.so.1

  3. ベース名の冒頭から接尾辞の「.」まで一致: libc.so または libc

  4. リテラル文字列 a.out は、実行可能な名前の別名として受け入れられます。

プロセスターゲットも前述の 4 つの形式を受け入れることができますが、この場合、接頭辞としてオプションのリンクマップ ID (lmid) が付きます。lmid 接頭辞は、LM、リンクマップ ID (16 進数)、および逆引用符の順番で構成されます。たとえば、次のシンボル名を考えてみましょう。

LM0`libc.so.1`_init

これは、libc.so.1 ライブラリにある _init シンボルの値として評価して、この値がリンクマップ 0 (LM_ID_BASE) 上に読み込まれます。同じライブラリが複数のリンクマップ上に読み込まれている場合、シンボル名の重複を解決するためにリンクマップ指定子が必要になることもあります。リンクマップの詳細は、Oracle Solaris 11.4 Linkers and Libraries Guideおよび dlopen(3C) を参照してください。リンクマップ識別子を表示するには、showlmid オプションの設定に従ってシンボルを出力します (「オプション」を参照)。

シンボルと 16 進整数値で名前が重複した場合、mdb は、最初にあいまいなトークンをシンボルとして評価し、次に整数値として評価しようとします。たとえば、f というトークンが、デフォルトの 16 進数では 10 進整数の 15 を表し、同時にターゲットのシンボルテーブル内の f という名前の大域変数を表す場合もあります。あいまいな名前を持つシンボルが存在するときには、明示的な 0x または 0X の接頭辞を用いることによって、整数値を明確に指定できます。

dcmd と walker の名前解決

前述のように、mdb の各 dmod は、一連の dcmd と walker を提供します。dcmd と walker は、2 つの異なる大域名前空間でトラックされます。また、mdb も、各 dmod に関連付けられた dcmd と walker の名前空間をトラックし続けます。1 つの dmod 内で、dcmd や walker に同じ名前を付けることはできません。このような名前の重複がある dmod は、読み込みに失敗します。異なる dmod から提供された dcmd や walker 間での名前の重複は、大域名前空間では許されます。名前の重複がある場合、その特定の読み込まれる名前を持つ dcmd または walker のうち、最初のものが大域名前空間で優先権を与えられます。ほかの定義は、読み取り順にリストに保存されます。逆引用符 (`) は、ほかの定義を選択するための参照範囲演算子として、dcmd や walker の名前に使用されます。たとえば、dmod m1m2 が、それぞれ dcmd d を提供する場合に、m1 の方が m2 よりも先に読み込まれたときには、次のようになります。

::d

m1d 定義を実行します。

::m1`d

m1d 定義を実行します。

::m2`d

m2d 定義を実行します。

現時点で m1 モジュールが読み込まれていない場合は、大域定義リスト上の次の dcmd である m2`d が、大域定義として使用されます。dcmd や walker の現在の定義は、次に示すように、::which dcmd を使用して定義できます。大域定義リストは、::which –v を使用して表示できます。

dcmd パイプライン

dcmd は、縦棒演算子 (|) を使ってパイプラインの中へ入れることができます。パイプラインの目的は、一般的に仮想アドレスのような値のリストを、1 つの dcmd や walker から次の dcmd や walker へと渡していくことです。パイプラインステージは、あるデータ構造体タイプのポインタを、それに対応するデータ構造体のポインタへと対応付けるために使用します。その目的は、アドレスリストをソートしたり、あるプロパティーを持つ構造体のアドレスを選択したりすることです。

mdb は、パイプライン内の各 dcmd を左から右へと順番に実行します。現在のドット値、またはコマンドの開始時に明示的な式によって指定された値を使って、もっとも左にある dcmd が実行されます。縦棒演算子 (|) を見つけると、mdb は、その左側までの dcmd 出力、mdb 構文解析部、および空の値リストとの間に、パイプすなわち共用バッファーを作成します。dcmd を実行するにしたがって、その標準出力はパイプの中に配置され、次に構文解析部によって使用され、評価されます。それは、あたかも mdb が標準出力からデータを読み込んでいるように見えます。各行には、終端に復帰改行文字またはセミコロン (;) を持つ算術式が含まれます。その算術式の値は、パイプに関連付けられた値のリストに追加されます。構文エラーが発見されると、そのパイプラインは異常終了します。

縦棒演算子 (|) の左側までの dcmd が完了すると、そのパイプに関連付けられた値のリストは、縦棒演算子 (|) の右側の dcmd を呼び出すために使用されます。リストの各値については、ドットにその値が設定されたあと、右側の dcmd が実行されます。パイプラインのもっとも右にある dcmd だけが、その出力を標準出力に表示します。パイプライン内のいずれかの dcmd が標準エラー出力を生じた場合は、それらのメッセージを直接標準エラーに出力するので、パイプラインの一部としては処理されません。

シグナル処理

デバッガは、PIPE および QUIT シグナルを無視します。INT シグナルの場合、現在実行中のコマンドが中止されます。ILLTRAPEMTFPEBUS、および SEGV のシグナルの場合、デバッガは中断され、特別な処理を行います。これらのシグナルが非同期的に生成された場合 (つまり、kill(2) を使用して別のプロセスから配信された場合)、mdb はシグナルをそのデフォルトの設定に復元して、コアダンプを生成します。しかし、これらのシグナルがデバッガプロセス自身によって同期的に生成され、外部的に読み込まれた dmod から dcmd が現在実行されており、さらに、標準入力が端末である場合、ユーザーは mdb が提供するメニューを使用して、強制的にコアダンプを生成するか、コアダンプを生成せずに終了するか、停止してデバッガに接続するか、あるいは、そのまま再開するかを選択できます。再開オプションを選択した場合、すべてのアクティブなコマンドは中止され、障害が発生したときに dcmd がアクティブであった dmod を読み込み解除します。この後、ユーザーは dmod を読み込み直すことができます。dcmd にバグがある場合に対して、再開オプションは制限付きの保護機能を提供します。再開オプションの危険性については、後述の「警告」にある「エラー回復メカニズムの使用」を参照してください。

コマンド行の再入力

端末デバイスから入力した最後の HISTSIZE (デフォルトは 128) 個のコマンドのテキストはメモリーに保存されます。次に説明するインライン編集機能が提供するキーマッピングを使用すると、この履歴リストから以前入力したコマンドを検索および取得できます。

インライン編集機能

標準入力が端末デバイスである場合、コマンド行を編集するために、mdb が提供するいくつかのシンプルな emacs スタイルの機能を使用できます。編集モードの searchprevious、および next コマンドを使用すると、履歴リストにアクセスできます。検索するときに一致するのは、パターンではなく、文字列だけです。次に示すリストにおいて、制御記号はキャレット文字 (^) とそれに続く大文字の英字で表記されます。エスケープシーケンスは M- とそれに続く文字で表記されます。たとえば、M-f (「メタエフ」と呼ぶ) を入力するには、まず <ESC> を押して、次に「f」を押すか、あるいは Meta キーをサポートしているキーボード上では、まず Meta キーを押して、次に「f」を押します。コマンド行を発行および実行するには、復帰改行文字 (RETURN または NEWLINE) を使用します。編集コマンドは次のとおりです。

^F

カーソルを 1 文字だけ前方 (右) に移動します。

M-f

カーソルを 1 単語だけ前方に移動します。

^B

カーソルを 1 文字だけ後方 (左) に移動します。

M-b

カーソルを 1 単語だけ後方に移動します。

^A

カーソルを行の先頭に移動します。

^E

カーソルを行の末尾に移動します。

^D

カーソルのある行が空でない場合、カーソル位置の文字を削除します。カーソルのある行が空である場合、^D は EOF を意味し、デバッガは終了します。

M-^H

(メタ - バックスペース) 直前の単語を削除します。

^K

カーソルから行の末尾までを削除します。

^L

画面を消去して、現在の行を出力し直します。

^T

現在の文字と次の文字を入れ換えます。

^N

履歴リストから次のコマンドを取得します。^N を入力するたびに、さらに次のコマンドが取得されます。

^P

履歴リストから前のコマンドを取得します。^P を入力するたびに、さらに前のコマンドが取得されます。

^R[string]

履歴リストから文字列を含むコマンドを後方に検索します。文字列は復帰改行文字 (RETURN または NEWLINE) で終了する必要があります。文字列を省略した場合、前回入力した文字列を含むコマンドを検索します。

編集モードはまた、次のようなユーザー定義シーケンスも編集コマンドとして解釈します。ユーザー定義シーケンスを読み取ったり、変更したりするには、stty(1) コマンドを使用します。

erase

ユーザー定義の消去文字 (通常は ^H または ^?)。前の 1 文字を削除します。

intr

ユーザー定義の割り込み文字 (通常は ^C)。現在のコマンドを中断して、新しいプロンプトを出力します。

kill

ユーザー定義の強制終了文字 (通常は ^U)。現在のコマンド行全体を強制終了します。

quit

ユーザー定義の終了文字 (通常は ^\)。デバッガを終了します。

suspend

ユーザー定義の中断文字 (通常は ^Z)。デバッガを中断します。

werase

ユーザー定義の単語消去文字 (通常は ^W)。直前の単語を消去します。

矢印キーのある拡張キーパッドをサポートするキーボードでは、mdb は次のキーストロークを編集コマンドとして解釈します。

up-arrow

履歴リストから前のコマンドを取得します (^P と同じ)。

down-arrow

履歴リストから次のコマンドを取得します (^N と同じ)。

left-arrow

カーソルを 1 文字だけ後方に移動します (^B と同じ)。

right-arrow

カーソルを 1 文字だけ前方に移動します (^F と同じ)。

出力ページャー

mdb は、組み込み出力ページャーを備えています。出力ページャーを使用できるのは、デバッガの標準出力が端末デバイスである場合だけです。コマンドを実行するたびに、mdb は 1 画面分の出力を生成してから中断し、次のようなページャーのプロンプトを表示します。

>> More [<space>, <cr>, q, n, c, a] ?

出力ページャーは次のようなキーシーケンスを認識します。

スペース

次の 1 画面分の出力を表示します。

a、A

現在のトップレベルのコマンドを中止して、プロンプトに戻ります。

c、C

現在のトップレベルのコマンドが完了するまで、画面ごとに中断するのではなく、出力を表示し続けます。

n、N、復帰改行文字 (NEWLINE または RETURN)

次の 1 行分の出力を表示します。

q、Q、^C、^\

現在の dcmd を終了 (中止) します。

フォーマット dcmd

/\?= などのメタキャラクタを使用して、特別な出力書式の dcmd を表します。各 dcmd では、1 つまたは複数の書式制御文字を含む引数リスト、繰り返し回数、または引用文字列を使用できます。書式制御文字は、次の表に示すように、ASCII 文字の一種です。書式制御文字を使用して、ターゲットからデータを読み取り、フォーマットします。繰り返し回数は、書式制御文字の前に位置する正の整数で、基数は、常に 10 進数として解釈されます。また、繰り返し回数は、先頭にドル記号を付けた角括弧で囲まれた式 ($[ ]) として指定される場合もあります。文字列の引数は、二重引用符 (“ ” ) で囲みます。フォーマット引数の間には、空白は不要です。

フォーマット dcmd は、次のとおりです。

/

ドットで指定される仮想アドレスで始まるターゲットの仮想アドレス空間からデータを表示します。

\

ドットで指定される物理アドレスで始まるターゲットの物理アドレス空間からデータを表示します。

?

ドットで指定される仮想アドレスに対応するオブジェクトファイル位置で始まるターゲットのプライマリオブジェクトファイルからデータを表示します。

=

指定されたデータ書式のそれぞれにおいて、ドット値そのものを表示します。したがって、= dcmd は、基底間の変換と計算を行うときに便利です。

#

人間が読める形式のバイト数 (8 バイト) を表示します。

また、mdb は、ドットのほかに、インクリメントと呼ばれる大域値も絶えずトラックしています。インクリメントは、ドットと、最後のフォーマット dcmd によって読み込まれるすべてのデータが後に続くアドレスとの距離を表します。たとえば、フォーマット dcmd を、A というアドレスに等しいドットで実行した結果、4 バイトの整数が出力された場合、この dcmd が終了したあとには、ドットはまだ A ですが、インクリメントは 4 に設定されています。前述の「算術展開」で説明したように、ここでは、正符号 (+) は、A + 4 の値を出すための評価をします。その後、正符号は、次に続く dcmd 用のデータオブジェクトのアドレスにドットを設定し直します。

次の表に示すように、ほとんどの書式制御文字は、データ書式のサイズに対応するバイトの数だけ、インクリメントの値を増分します。書式制御文字表は、::formats dcmd を使用して、mdb の内部から表示できます。書式制御文字は、次のとおりです。

+
カウントの数だけドットを増分する (変数サイズ)
-
カウントの数だけドットを減分する (変数サイズ)
B
16 進数 int (1 バイト)
C
C の文字表記法を使う文字 (1 バイト)
D
10 進数の符号付き int (4 バイト)
E
10 進数の符号なし long (8 バイト)
F
double (8 バイト)
G
8 進数の符号なし long (8 バイト)
H
スワップバイトと short (4 バイト)
I
アドレスと分解命令 (変数サイズ)
J
16 進数 long (8 バイト)
K
16 進数 uintptr_t (4 または 8 バイト)
N
改行
O
8 進数の符号なし int (4 バイト)
P
シンボル (4 または 8 バイト)
Q
8 進数の符号付き int (4 バイト)
R
2 進数 int (8 バイト)
S
C の文字列表記法を使った文字列 (変数サイズ)
T
水平タブ
U
10 進数の符号なし int (4 バイト)
V
10 進数の符号なし int (1 バイト)
W
デフォルト基数の符号なし int (4 バイト)
X
16 進数 int (4 バイト)
Y
復号化される time32_t (4 バイト)
Z
16 進数 long (8 バイト)
^
インクリメント * カウントの数だけドットを減分する (変数サイズ)
a
symbol+offset としてのドット
b
8 進数の符号なし int (1 バイト)
c
文字 (1 バイト)
d
10 進数の符号付き short (2 バイト)
e
10 進数の符号付き long (8 バイト)
f
float (4 バイト)
g
8 進数の符号付き long long (8 バイト)
h
スワップバイト (2 バイト)
i
命令の分解 (変数サイズ)
n
改行
o
8 進数の符号なし short (2 バイト)
p
シンボル (4 または 8 バイト)
q
8 進数の符号付き short (2 バイト)
r
余白
s
raw 文字列 (変数サイズ)
t
水平タブ
u
10 進数の符号なし short (2 バイト)
v
10 進数の符号付き int (1 バイト)
w
符号なしのデフォルト基数 short (2 バイト)
x
16 進数 short (2 バイト)
y
復号化される time64_t (8 バイト)

/\、および ? のフォーマット dcmd を使用して、ターゲットの仮想アドレス空間、物理アドレス空間、またはオブジェクトファイルに書き込みを行うことができます。この場合には、次の修飾子の 1 つを最初の書式制御文字として指定し、次に、即値またはドル記号のあとの角括弧に囲まれた式 ($[ ]) で表されるワードのリストを指定します。

書き込み修飾子は、次のとおりです。

v

各式の値の最下位バイトを、ドットで指定された位置から始まるターゲットに書き込む。

w

各式の値の最下位 2 バイトを、ドットで指定された位置から始まるターゲットに書き込む。

W

各式の値の最下位 4 バイトを、ドットで指定された位置から始まるターゲットに書き込む。

Z

各式の値の 8 バイトすべてを、ドットで指定された位置から始まるターゲットに書き込む。

/\、および ? のフォーマット dcmd を使用して、ターゲットの仮想アドレス空間、物理アドレス空間、およびオブジェクトファイル内の特定の整数値をそれぞれ検索できます。この場合には、次の修飾子の 1 つを最初の書式制御文字として指定し、次に、値とオプションマスクを指定します。各値とマスクは、即値またはドル記号の後の角括弧に囲まれた式として指定されます。値だけが指定されている場合、mdb は、適当なサイズの整数値を読み取り、一致する値が含まれるアドレスのところで終了します。また、V という値と、M というマスクが指定されている場合、mdb は、適当なサイズの整数値を読み取り、(X & M) == V となるような値 X が含まれるアドレスのところで終了します。dcmd が終了すると、ドットは、一致した値が含まれるアドレスに更新されます。一致する値が見つからなかった場合、ドットは、最後に読み込まれたアドレスに残されます。

検索修飾子は、次のとおりです。

l
指定された 2 バイトの値を検索する。
L
指定された 4 バイトの値を検索する。
M
指定された 8 バイトの値を検索する。

ユーザーターゲットでも、カーネルターゲットでも、アドレス空間は、一般的に不連続セグメントセットで構成されています。対応するセグメントを持たないアドレスから読み込むことはできません。セグメント内で一致するものが検索されない場合には、検索は強制的に終了します。

実行制御

mdb には、動作中のプログラムの実行を制御および追跡する機能があります。現在、ユーザープロセスターゲットだけが実行制御をサポートしています。mdb はシンプルな実行制御モデルを提供します。ターゲットプロセスを起動するには、::run を使用してデバッガ内から起動するか、:A::attach、または –p コマンド行オプション (後述の説明を参照) を使用して mdb を既存のプロセスに接続します。ユーザーは追跡対象「ソフトウェアイベント」のリストを指定できます。追跡対象イベントがターゲットプロセス内で発生するごとに、ターゲット内のすべてのスレッドが停止して、そのイベントをトリガーしたスレッドが代表スレッドとして選択され、デバッガに制御が戻ります。ターゲットプログラムが「running (動作中)」と設定されると、ユーザー定義割り込み文字 (通常は ^C) を入力して、非同期的にデバッガに制御を戻すことができます。

ソフトウェアイベント」とは、デバッガが監視しているターゲットプログラムにおける状態遷移のことです。たとえば、デバッガは、プログラムカウンタレジスタが特定の値 (ブレークポイント) に変更されたり、特定のシグナルが送られたりするのを監視できます。

ソフトウェアイベント指定子」とは、デバッガがどのようなイベントを監視するかをターゲットプログラムに指示するときに使用するソフトウェアイベントのクラスのことです。ソフトウェアイベント指定子のリストを表示するには、::events dcmd を使用します。各ソフトウェアイベント指定子には標準プロパティーセットが関連付けられています (後述の「::events」を参照)。

デバッガはさまざまなソフトウェアイベント (たとえば、ブレークポイント、ウォッチポイント、シグナル、マシン障害、およびシステムコールなど) を監視できます。::bp::fltbp::sigbp::sysbp、または ::wp を使用すると、新しいソフトウェアイベント指定子を作成できます。各指定子には、コールバック (コマンド行に入力された場合と同じように動作する mdb コマンド文字列) とプロパティーセットが関連付けられています (後述の説明を参照)。異なるコールバックとプロパティーを持つのであれば、任意の数の指定子を同じイベントに作成できます。追跡イベントの現在のリストや対応するイベント指定子のプロパティーを表示するには、::events dcmd を使用します。イベント指定子のプロパティーの定義については、後述の「::events dcmd」と「::evset dcmd」を参照してください。

実行制御組み込み dcmd (後述の説明を参照) はいつでも利用できますが、実行制御がサポートされないターゲットに適用しようとすると、「このターゲットはサポートされません」というエラーメッセージが表示されます。デバッガの実行制御による exec、attach、release、およびジョブ制御との対話の詳細については、後述の「注意事項」を参照してください。

イベントコールバック

::evset dcmd とイベント追跡用の dcmd を使用すると、(–c オプションを使用して)、イベント指定子ごとにイベントコールバックを関連付けることができます。「イベントコールバック」とは、ターゲットにおいて対応するイベントが発生したときに実行される mdb コマンドを表す文字列のことです。このようなコマンドは、コマンドプロンプトに入力された場合と同じように実行されます。各コールバックが実行される前に、dot 変数には代表スレッドのプログラムカウンタの値が設定され、「hits」変数には該当する指定子が一致した回数 (現在の一致も含む) が設定されます。

ターゲットを継続するための 1 つまたは複数のコマンド (たとえば、::cont::step) が、イベントコールバック自身に含まれる場合、このようなコマンドはターゲットをすぐに継続したり、ターゲットがもう一度停止するまで待機したりしません。その代わりに、このようなターゲットを継続する dcmd は「現在、継続操作が中断されている」ということをイベントコールバック内部に示して、すぐに戻ります。したがって、複数の dcmd がイベントコールバックに含まれている場合、ステップまたは継続用の dcmd は最後に指定する必要があります。「すべて」のイベントコールバックを実行したあと、一致した「すべて」のイベントコールバックが継続を要求している場合、ターゲットはすぐに実行を再開します。要求された継続操作が競合する場合、どの種類の操作を継続するかは、優先順位がもっとも高い継続操作が決定します。優先順位は (高いものから)、 「ステップ (step)」、「ステップオーバー (step-over) または次 (next)」、「ステップアウト(step-out)」、そして「継続 (continue)」の順番になります。

スレッドのサポート

mdb は、ターゲットに関連する各スレッドのスタックとレジスタを調査する機能を提供します。永続的な「スレッド」変数には、現在の代表スレッド識別子が入っています。スレッド識別子の書式はターゲットによって異なります。::regs dcmd と ::fpregs dcmd を使用すると、代表スレッドのレジスタセットや、別のスレッドのレジスタセットが現在利用できる場合はそのレジスタセットを調査できます。さらに、代表スレッドのレジスタセットは名前付き変数セットとしてエクスポートされます。1 つまたは複数のレジスタの値を変更するには、対応する名前付き変数に > dcmd を適用します。

mdb カーネルターゲットは、対応する内部スレッド構造体の仮想アドレスを指定されたスレッドの識別子としてエクスポートします。Solaris カーネル内のスレッドのデバッグに関するサポートの詳細は、Oracle Solaris Modular Debugger Guideを参照してください。mdb プロセスターゲットは、マルチスレッド化されたユーザープロセスの検査に対する適切なサポートを提供します。動作中のユーザープロセスをデバッグするとき、mdb はそのスレッド化モデルのビューをその場で自動的に調整します。プロセスターゲットスレッド識別子は、アプリケーションが使用するスレッド化モデルに基づいて、代表スレッドの lwpid_tthread_t、または pthread_t に対応付けられます。

mdb がユーザープロセスターゲットをデバッグしているとき、コンパイラによってサポートされるスレッドに局所的な記憶領域をターゲットが利用している場合、mdb は自動的に、スレッドに局所的な記憶領域を参照するシンボル名を、現在の代表スレッドに対応する記憶領域のアドレスで評価します。::tls 組み込み dcmd を使用すると、代表スレッド以外のスレッドのシンボルの値も表示できます。

組み込み dcmd

mdb は、常に定義されている組み込み dcmd セットを備えています。これらの dcmd のなかには、特定のターゲットだけに適用されるものもあります。dcmd が現在のターゲットに適用できない場合、その dcmd は停止し、「コマンドが現在のターゲットに適用されません」という内容のメッセージが表示されます。mdb は、多くの場合、レガシー adb(1) dcmd の名前に対応するニーモニック (::identifier) を提供します。たとえば、::quit は、$q に相当します。adb(1) の使用経験を持つプログラマや、簡略符号あるいは難解なコマンドを認識するプログラマは、組み込みコマンドの $: 形式の方を好むかもしれません。一方、mdb に慣れていないプログラマは、より詳細でわかりやすい :: 形式を好むでしょう。次に組み込みコマンドを、アルファベット順に説明します。$ または : の形式に ::identifier に対応するものがある場合、::identifier 形式の下に $ または : の形式を示します。組み込み dcmd は、次のとおりです。

> variable-name
>/modifier/variable-name

指定された名前の変数にドット値を割り当てます。変数が読み取り専用の場合には、変更できません。> の後ろに / / で囲まれた修飾子がある場合、ドット値は割り当ての一部として変更されます。修飾子は、次のとおりです。

c

符号なし char の量 (1 バイト)

s

符号なし short の量 (2 バイト)

i

符号なし int の量 (4 バイト)

l

符号なし long の量 (32 ビットでは 4 バイト、64 ビットでは 8 バイト)

これらの演算子はキャストを実行しません。代わりに、指定された数の下位バイト (リトルエンディアンアーキテクチャーの場合) または上位バイト (ビッグエンディアンアーキテクチャーの場合) を取得します。修飾子には下位互換性があります。ただし、mdb の */modifier/ および %/modifier/ 構文を使用する必要があります。

$< macro-name

指定したマクロファイルからコマンドを読み取り、実行します。ファイル名は、絶対パスまたは相対パスとして与えられます。ファイル名に「/」が含まれない場合は単純名です。単純名の場合、mdb は、マクロファイル組み込みパス内でそのファイル名を検索します。現時点で別のマクロファイルが処理されている場合、そのファイルは閉じられ、代わりに新しいファイルが処理されます。

$<< macro-name

$< と同様に、指定されたマクロファイルからコマンドを読み取って実行しますが、現在開いているマクロファイルは閉じません。

$?

ターゲットがユーザープロセスまたはコアファイルの場合、まず、ターゲットのプロセス ID と現在のシグナルを出力して、次に、代表スレッドの汎用レジスタセットを出力します。

[ address ] $C [ count ]

C スタックのバックトレースを、スタックフレームポインタの情報も含めて出力します。この dcmd の前に明示的な address がある場合には、その仮想記憶アドレスから始まるバックトレースを表示します。その他の場合には、代表スレッドのスタックを表示します。オプションのカウント値が引数として指定されている場合には、出力の各スタックフレームに対して、count 引数で指定された数の引数だけが表示されます。

[ base ] $d

デフォルトの出力基数を取得または設定します。この dcmd の前に明示的な式がある場合には、デフォルトの出力基数は、指定された base に設定されます。その他の場合には、現在の基数が 10 進数で出力されます。デフォルトの基数は 16 (16 進数) です。

$e

既知の外部すなわち大域的なオブジェクト型シンボルや関数シンボルのリスト、そのシンボルの値、およびターゲットの仮想アドレス空間内の対応位置に格納される最初の 4 バイト (32 ビット mdb) または 8 バイト (64 ビット mdb) のリストを出力します。::nm dcmd には、シンボルテーブルの表示用にさらに柔軟なオプションが用意されています。

$P prompt-string

指定された prompt-string にプロンプトを設定します。デフォルトのプロンプトは、現在のターゲットに > を付加したものとなります。::set -P または –P コマンド行オプションを使用しても、プロンプトは設定できます。

distance $s

アドレスからシンボル名へ変換するための、シンボルマッチングディスタンスを取得または設定します。シンボルマッチングディスタンスのモードについては、「オプション」の –s コマンド行オプションで説明します。::set –s オプションを使用しても、シンボルマッチングディスタンスは変更できます。距離が指定されない場合には、現在の設定が表示されます。

$v

指定された変数のうち、ゼロ以外の値を持つ変数のリストを出力します。::vars dcmd を使用すると、変数の一覧表示にほかのオプションを付けることができます。

width $w

出力のページ幅を指定された値に設定します。通常は、mdb が端末に幅の照会をしてサイズを変更するので、このコマンドは必要ありません。

$W

ターゲットを書き込み用にもう一度開きます (–w オプションをコマンド行に指定して mdb を実行する場合と同じ)。::set –w オプションを使用しても、書き込みモードを有効にできます。

[ pid ] ::attach [ core | pid ]
[ pid ] :A [core | pid ]

ユーザープロセスターゲットが動作中の場合には、指定されたプロセス ID またはコアファイルに接続して、デバッグします。コアファイルのパス名は、文字列引数として指定されます。プロセス ID は、この dcmd の前で、文字列引数として、または式の値として指定されます。デフォルトは 16 進数であることを忘れないでください。したがって、pgrep(1) ps(1) を使用して得た 10 進数のプロセス ID (PID) を式として指定する場合には、その先頭に「0t」を付けてください。

[address] ::bp [ +/–dDesT] [–c cmd] [–n count] sym
address :b [cmd …]

指定された場所にブレークポイントを設定します。::bp dcmd は、指定されたアドレスまたはシンボル (dcmd の前にある明示的な式で指定されたオプションのアドレスを含む) ごと、そして、dcmd の後ろにある文字列または即値ごとにブレークポイントを設定します。引数には、指定された特定の仮想アドレスを示すシンボル名または即値を指定できます。シンボル名を指定した場合、ターゲットプロセス内でまだ評価できないシンボルを参照できます。つまり、まだ読み込んでいないオブジェクト内のオブジェクト名や関数名を参照できます。この場合、ターゲット内のブレークポイントは延期され、指定された名前に一致するオブジェクトが読み込まれるまでアクティブ (有効) になりません。オブジェクトが読み込まれると、このブレークポイントは自動的に有効になります。共用ライブラリ内に定義されたシンボル上のブレークポイントを設定する場合、アドレスは実際のシンボル定義ではなく、対応する PLT (Procedure Linkage Table) エントリを参照する可能性があるので、必ず、アドレス式ではなく、シンボル名を使用する必要があります。PLT エントリ上で設定されたブレークポイントは、その PLT エントリがあとで実際のシンボル定義に解釈されると、実行時リンクエディタによって上書きされることがあります。–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです (後述の説明を参照)。dcmd の :b 形式を使用した場合、ブレークポイントは dcmd の前にある式で指定した仮想アドレスだけに設定されます。:b dcmd の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

::cat [ –v variable-name ] filename

ファイルを連結および表示します。各ファイル名は、相対パス名または絶対パス名として指定できます。ファイルの内容は、標準出力に表示されますが、出力ページャーには渡されません。この dcmd は、| 演算子とともに使用するようになっています。したがって、プログラマは外部ファイルに格納されたアドレスリストを使用してパイプラインを処理できます。

オプションの variable-name が指定された場合、指定された変数に、返された値が割り当てられます。

::cont [ SIG ]
:c [ SIG ]

デバッガを中断し、ターゲットプログラムを継続し、指定されたソフトウェアイベントが発生したあとにターゲットプログラムが終了または停止するまで待機します。–o nostop オプションを有効にしてデバッガを動作中のプログラムに接続しており、ターゲットがすでに動作している場合、この dcmd は単に、指定されたソフトウェアイベントが発生したあとにターゲットプログラムが終了または停止するまで待機します。オプションのシグナルの名前または番号 (signal.h(3HEAD) を参照) が引数として指定された場合、このシグナルはターゲットの実行を再開するための一部として、すぐにターゲットに送られます。SIGINT シグナルを追跡している場合、ユーザー定義割り込み文字 (通常は ^C) を入力すると、非同期的にデバッガに制御を戻すことができます。この SIGINT シグナルは自動的にクリアされ、次回ターゲットが継続される場合、ターゲットにはこのシグナルは送られません。現在、ターゲットプログラムが動作していない場合、::cont は、::run を実行した場合と同じように、新しいプログラムの実行を起動します。

address ::context
address $p

指定されたプロセスへのコンテキストスイッチ。コンテキストスイッチの操作は、カーネルターゲットを使用している場合にだけ有効です。プロセスのコンテキストを指定するには、カーネルの仮想アドレス空間において、そのプロセスの proc 構造体の address を使用します。特別なコンテキストアドレス「0」は、カーネルそのもののコンテキストを表すときに使用されます。カーネルページだけの場合とは対照的に、指定されたユーザープロセスの物理メモリーページがクラッシュダンプに含まれる場合、クラッシュダンプを検査するときに mdb が実行できるのはコンテキストスイッチだけです。dumpadm(8) を使用して、すべてのページまたは現在のユーザープロセスのページをダンプするようにカーネルクラッシュダンプ機能を構成できます。::status dcmd を使用すると、現在のクラッシュダンプの内容を表示できます。

ユーザーがカーネルターゲットからコンテキストスイッチを要求した場合には、mdb は指定されたユーザープロセスに相当する新しいターゲットを作成します。スイッチが発生すると、新しいターゲットは、自身の dcmd を大域レベルに置きます。したがって、このとき、/ dcmd が、ユーザープロセスの仮想アドレス空間からデータをフォーマットして表示したり、::mappings dcmd が、ユーザープロセスのアドレス空間でマッピングを表示したりするようになります。0::context を実行すると、カーネルターゲットを復元できます。

::dcmds

使用可能な dcmd を一覧表示し、各 dcmd の簡単な説明を出力します。

[ address ] ::delete [ id | all ]
[ address ] :d [ id | all ]

指定された ID 番号のイベント指定子を削除します。id 番号引数はデフォルトで 10 進数として解釈されます。オプションのアドレスを dcmd の前に指定した場合、指定された仮想アドレスに関連するすべてのイベント指定子 (たとえば、そのアドレスに影響するすべてのブレークポイントまたはウォッチポイント) が削除されます。特別な引数「all」を指定した場合、すべてのイベントが削除されます。ただしスティッキー (T フラグ) がマークされたイベントは除きます。::events dcmd はイベント指定子の現在のリストを表示します。

[ address ] ::dis [ –fw ] [ –n count ] [ address ]

最後の引数または現在のドット値によって指定されたアドレス、またはそのアドレス周辺から、逆アセンブルします。アドレスが既知の関数の最初の部分に一致した場合は、関数全体が逆アセンブルされます。その他の場合は、指定されたアドレスの前後の命令の「ウィンドウ」が、コンテキストの理解のために出力されます。デフォルトでは、命令はターゲットの仮想アドレス空間から読み取られます。–f オプションを指定した場合は、命令はターゲットのオブジェクトファイルから読み取られます。デバッガが現在、動作中のプロセス、コアファイル、またはクラッシュダンプに接続されていない場合、–f オプションはデフォルトで有効になります。また、アドレスが既知の関数の最初の部分に一致した場合でも、–w オプションを指定すると、「ウィンドウ」を強制的に開くモードに設定できます。デフォルトでは、ウィンドウのサイズは命令 10 個分です。–n オプションを使用すれば、命令の数を明示的に指定できます。

::disasms

使用可能な逆アセンブラのモードを一覧表示します。ターゲットが初期化されている場合には、mdb は適切な逆アセンブラモードを選択しようとします。また、::dismode dcmd を使用して、ユーザーは、初期モードを一覧表のどれかに変更できます。

::dismode [ mode ]
$V [ mode ]

逆アセンブラモードを受け取るか、設定します。引数が指定されていないと、現在の逆アセンブラモードを出力します。mode 引数が指定されている場合には、逆アセンブラを指定されたモードに切り替えます。また、::disasms dcmd を使用して、使用可能な逆アセンブラのリストを表示できます。

::dmods [ –l ] [ module-name ]

読み込まれたデバッガモジュールを一覧表示します。–l オプションが指定されていると、各 dmod に関連付けられた dcmd や walker の一覧がその dmod 名の下に出力されます。特定の dmod の名前を追加の引数として指定すれば、出力はその dmod に限定されます。

[ address ] ::dump [ –eqrstu ] [ –f|–p ] [ –g bytes ] [ –w paragraphs ]

ドットによって指定されたアドレスを含む、16 バイトで割り当てられた記憶領域のメモリーダンプを 16 進数の ASCII 形式で出力します。::dump に繰り返し回数を指定すると、ダンプする繰り返し数としてではなく、ダンプするバイト数として解釈されます。また、::dump dcmd は、次のオプションも認識します。

–e

エンディアンに合わせて調整します。–e オプションでは、4 バイトのワードを使用できます。–g オプションを使用して、デフォルトのワードサイズを変更できます。

–f

ターゲットの仮想アドレス空間からではなく、指定された仮想アドレスに対応するオブジェクトファイルの位置からデータを読み取ります。デバッガが現在、動作中のプロセス、コアファイル、またはクラッシュダンプに接続されていない場合、–f オプションはデフォルトで有効になります。

–g bytes

バイトをバイトのグループで表示します。デフォルトの group サイズは 4 バイトです。group サイズは行幅を分割する 2 のべき乗にする必要があります。

–p

address を、仮想アドレスではなく、ターゲットのアドレス空間内の物理的なアドレス位置として解釈します。

–q

データの ASCII 形式の復号化を出力しません。

–r

各行に、絶対的なアドレスではなく、開始アドレスからの相対的な行数を与えます。このオプションを指定すると、–u オプションも暗黙的に指定されます。

–s

繰り返しの行を省略します。

–t

行全体を読み取って出力するのではなく、指定されたアドレスの内容だけを読み取って表示します。

–u

段落の境界に配列するのではなく、配列せずに出力します。

–w paragraphs

1 行あたり 16 バイトの段落で段落を表示します。デフォルトの段落数は 1 です。–w の最大値は 16 です。

::echo [ string | value …]

空白文字で区切られ、復帰改行文字で終わる引数を標準出力に出力します。$[ ] で囲まれた式は値に評価されて、デフォルトで出力されます。

::eval command

指定された文字列をコマンドとして評価し、実行します。コマンドがメタキャラクタやスペースを含む場合は、引用符や二重引用符で囲みます。

::events [ –av ]
$b [ –av ]

ソフトウェアイベント指定子のリストを表示します。各イベント指定子には一意の ID 番号が割り当てられ、この ID 番号を使用すると、あとでイベント指定子を削除または変更できます。デバッガは、それ自体の内部イベントで追跡を有効にすることもできます。それらのイベントは、–a オプションが指定されている場合にのみ表示されます。–v オプションを指定した場合、たとえば、指定子がアクティブになっていない理由などの、より詳細な情報が表示されます。次に、一部の出力例を示します。

> ::events
   ID S TA HT LM Description            Action
----- - -- -- -- ---------------------- ------
[ 1 ] - T   1  0 stop on SIGINT         -                    
[ 2 ] - T   0  0 stop on SIGQUIT        -                    
[ 3 ] - T   0  0 stop on SIGILL         -                    
 …
[ 11] - T   0  0 stop on SIGXCPU        -                    
[ 12] - T   0  0 stop on SIGXFSZ        -                    
[ 13] -     2  0 stop at libc`printf    ::echo printf        
>

次に、各カラムの意味を説明します。::help events を使用しても、この情報のサマリーを表示できます。

ID

イベント指定子の識別子。この識別子は、指定子が有効である場合は角括弧「[ ]」で囲まれ、指定子が無効である場合は丸括弧「( )」で囲まれ、指定された指定子に一致するイベントが発生したあとにターゲットプログラムが現在停止している場合は山括弧「< >」で囲まれます。

S

イベント指定子の状態。この状態は次のシンボルのうちの 1 つです。

-

イベント指定子はアイドル状態です。どのターゲットプログラムも動作していないとき、すべての指定子はアイドル状態になります。ターゲットプログラムが動作しているとき、評価できない指定子はアイドル状態になることがあります。(たとえば、共用オブジェクトがまだ読み込まれておらず、共用オブジェクト内のブレークポイントが延期されている場合)。

+

イベント指定子はアクティブです。ターゲットが継続されると、この種類のイベントがデバッガによって検出されます。

*

イベント指定子は作動準備されてます。この状態は、ターゲットが現在動作しており、この種類のイベントが監視されていることを意味します。この状態を表示できるのは、–o nostop オプションを使用してデバッガを動作中のプログラムに接続している場合だけです。

!

オペレーティングシステムのエラーのために、イベント指定子は作動準備されていません。::events –v オプションを使用すると、監視が失敗した理由についてより詳細な情報が表示されます。

TA

Temporary、Sticky、および Automatic というイベント指定子のプロパティー。次のシンボルのうちの 1 つまたは複数が表示されます。

t

このイベント指定子は一時的であり、次回ターゲットが停止すると、一致するかどうかにかかわらず削除されます。

T

このイベント指定子はスティッキーであり、::delete all または :z では削除されません。このイベント指定子を削除するには、その ID を明示的に ::delete に指定します。

d

このイベント識別子は、ヒット回数がヒット制限に到達すると自動的に無効になります。

D

このイベント識別子は、ヒット回数がヒット制限に到達すると自動的に削除されます。

s

このターゲットは、ヒット回数がヒット制限に到達すると自動的に停止します。

HT

現在のヒット回数。このカラムには、当該イベント指定子が作成されたあとに、対応するソフトウェアイベントがターゲット内で発生した回数が表示されます。

LM

現在のヒット制限。このカラムには、自動無効、自動削除または自動停止が発生するときのヒット回数の制限が表示されます。このような動作を構成するには、::evset dcmd を使用します (後述の説明を参照)。

「説明」

指定された指定子に一致するソフトウェアイベントの種類の説明。

アクション

対応するソフトウェアイベントが発生したときに実行されるコールバック文字列。このコールバックは、コマンドプロンプトに入力された場合と同じように実行されます。

[id] ::evset [ +/–dDestT] [–c cmd] [–n count] id

1 つまたは複数のソフトウェアイベント指定子のプロパティーを変更します。プロパティーは、dcmd の前にあるオプションの式と dcmd の後ろにあるオプションの引数リストによって識別される指定子ごとに設定されます。基数が明示的に指定されない限り、引数リストは 10 進数の整数のリストとして解釈されます。::evset dcmd は次のオプションを認識します。

–d

ヒット回数がヒット制限に到達すると、イベント識別子を無効にします。+d 形式のオプションを指定した場合、この動作は無効になります。イベント指定子が無効になると、もう一度有効になるまで、デバッガは対応する監視をすべて削除し、対応するソフトウェアイベントを無視します。–n オプションを指定しない場合、指定子はすぐに無効になります。

–D

ヒット回数がヒット制限に到達すると、イベント識別子を削除します。–D 形式のオプションを指定した場合、この動作は無効になります。–D オプションは –d オプションよりも優先されます。ヒット制限を構成するには、–n オプションを使用します。

–e

イベント指定子を有効にします。–e 形式のオプションを指定した場合、この動作は無効になります。

–s

ヒット回数がヒット制限に到達すると、ターゲットプログラムを停止します。–s 形式のオプションを指定した場合、この動作は無効になります。–s オプションを指定すると、デバッガは指定子のコールバックが実行されるたびに (ただし、N 回目の実行を除く (N は指定子のヒット制限の現在の値))、::cont が発行されたかのように動作します。–s オプションは –D オプションと –d オプションよりも優先されます。

–t

イベント指定子を「一時的」であるとマークします。一時的な指定子は、次回ターゲットが停止すると、指定した指定子に対応するソフトウェアイベントの結果によって停止したかどうかに関わらず、自動的に削除されます。–t 形式のオプションを指定した場合、「一時的」マーカーは削除されます。–t オプションは –T オプションよりも優先されます。

–T

イベント指定子を「スティッキー」であるとマークします。Sticky 指定子は、::delete all または :z によって削除されません。対応する指定子の ID を ::delete への明示的な引数として指定することによって削除できます。–T 形式のオプションを指定した場合、「スティッキー」プロパティー は削除されます。イベント指定子のデフォルトセットには初めから「スティッキー」のマークが付いています。

–c

対応するソフトウェアイベントがターゲットプログラム内で発生するたびに、指定された cmd 文字列を実行します。現在のコールバック文字列を表示するには、::events を使用します。

–n

ヒット制限の現在の値を count に設定します。ヒット制限を現在設定せずに、–n オプションと一緒に –s または D オプションを指定していない場合、ヒット制限は 1 に設定されます。

::help evset を使用しても、この情報のサマリーを表示できます。

::files
$f

既知のソースファイルの一覧、すなわち、種々のターゲットシンボルテーブルの中にある STT_FILE 型のシンボルを出力します。

[flt] ::fltbp [ +/–dDestT] [–c cmd] [–n count] flt

指定されたマシン障害を追跡します。障害を特定するには、dcmd の前にオプションの障害番号を指定するか、dcmd の後ろに障害の名前または番号のリストを指定します (<sys/fault.h> を参照)。–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。

[ thread ] ::fpregs
[ thread ] $x, $X, $y, $Y

代表スレッドの浮動小数点レジスタセットを出力します。スレッドを指定すると、そのスレッドの浮動小数点レジスタが表示されます。スレッド式は、前述の「スレッドのサポート」で説明したスレッド識別子の 1 つである必要があります。

::formats

/\?= などのフォーマット dcmd とともに使用する、利用可能な出力書式制御文字の一覧を表示します。フォーマットとその使用法については、前述の「フォーマット dcmd」で説明しています。

::grep command

指定されたコマンド文字列を評価したあと、新しいドット値がゼロ以外の場合には、古いドット値を出力します。command にスペースやメタキャラクタが含まれる場合は、必ず引用符で囲んでください。パイプライン内で ::grep dcmd を使用すると、アドレスリストをフィルタ処理できます。

::help [ dcmd-name ]

引数がない場合には、::help dcmd は、mdb で使用可能なヘルプ機能の概要を簡潔に出力します。dcmd-name が指定されている場合には、mdb は、その dcmd の使用法の概略を出力します。

signal :i

ターゲットが動作中のユーザープロセスである場合、指定されたシグナルを無視して、透過的にターゲットにそのシグナルを送ります。指定されたシグナルの送り先を追跡しているイベント指定子はすべて、追跡イベントのリストから削除されます。デフォルトでは、無視されるシグナルは、デフォルトでプロセスがコアをダンプする原因となるシグナルセット (signal.h(3HEAD ) を参照) の補集合に初期化されます (ただし、デフォルトで追跡される SIGINT を除く)。

$i

デバッガが無視して、ターゲットが直接処理するシグナルのリストを表示します。追跡対象シグナルについてのより詳細な情報を取得するには、::events dcmd を使用します。

[ address ] ::if [–p] {type member tests | [type] [at off] test}

テストを評価し、テストが真である場合に古いドット値を出力します。

–p

仮想アドレスではなく、物理アドレスを使用します。

2 種類のテストがあります。最初のものを使用すると、構造体やユニオンのメンバーの値をテストできます。2 番目のものでは、ドットからのオフセットをテストできます。次に、これらのテストを AND または OR を使って結合して、より複雑なテストを構築できます。

最初の例では、構造体のメンバーをテストします:

::if "struct foo" namep <> 0

構造体 foo 内の要素 namep が 0 でない場合、この文は古いドット値を出力します。

::if "struct foo" namep <> 0 AND namep->name <> 0 AND
namep->name streq "bar"

foo 内の namep が指し示す構造体内の要素 name が 0 でなく、文字列 bar を含む文字列を指し示す場合、前の文は古いドット値を出力します。

::if "struct foo" name <> 0 AND name streq "bar" and value = 0x123

前の文で出力が行なわれるのは、名前が barvalue が 0x123 である場合だけです。

2 番目の形式では、指定したオフセットのタイプが指定した値を保持するかどうかをテストします。次に例を示します。

::if uint_t at 0x34 = 0x123

これは、uint_t のオフセット 0x34 の値が 0x123 である場合に出力します。ここでも、ANDOR を使用して、これをほかのテストと組み合わせることができます。この形式では、::if には、シンボリックタイプ情報がない場合でも使用可能な内部の組み込みタイプの数が含まれます。これらのタイプを次に示します:

char, uchar, short, ushort, int, uint, long, ulong,
longlong, ulonglong, pointer, addr

タイプが addr の場合、そのアドレスの値ではなく実際のアドレスがテストされます。このため、次のステートメント:

::if addr at 0x34 = 0x100034

は、ドット + 0x34 が 0x100034 である場合にのみ、ドットの値を報告します。一方:

::if pointer at 0x34 = 0x100034

は、値がドット + 0x34 の場合にのみ出力します。

より実用性の高い、次の文:

::if "char *' at 0x34 streq "foo"

は、オフセット 0x34 で指し示す文字列が foo の場合に、古いドット値を出力します。

実行可能なテストは次のとおりです:

&           - The values ANDed together are non zero.
%           - The left value modulus the right is non zero.
^           - The values XORed together are non zero.
streq       - The strings exactly match.
strneq      - The strings don't match.
strcaseeq   - The strings match case insensitively.
strcaseneq  - The strings do not match case insensitively.
strstr      - The string contains the string.
strcasestr  - The string contains the case insensitive string.
strnstr     - The string does not contain the string.
strcasenstr - The string does not contain the case insensitive string.
strleneq    - The string is this length.
strlenne    - The string is not this length.
strlengt    - The string is longer than this.
strlenlt    - The string is shorter than this.
strlenge    - The string is this long or longer.
strlenle    - The string is this long or shorter.

streq で使用できるオプションは、次のとおりです。

–i

大文字、小文字を無視してテストします。

–n

一致がない場合は true を返します。

–o offset

オフセットから文字列の検索を開始します。

–s

部分文字列を検索します。

strstr で使用できるオプションは、次のとおりです。

–i

大文字、小文字を無視してテストします。

–n

一致がない場合は true を返します。

–v variable

見つかった文字列のアドレスを変数内に格納します。

regex で使用できるオプションは、次のとおりです。

–i

大文字、小文字を無視してテストします。

–n

一致がない場合は true を返します。

–v variable

見つかった文字列のアドレスを変数内に格納します。

–x

完全一致を要求します。

streqstrneqstrcaseeqstrcaseneqstrstr、および strcasestr は次のオプションを受け入れます。

–s

部分文字列を検索します。

–o offset

オフセットから文字列の検索を開始します。

strstr および strcasestr は次のオプションを受け入れます。

–v variable

見つかった文字列のアドレスを変数内に格納します。

テストの右側には、次のいずれかを指定できます:

  • 構造体またはユニオン内の要素。

  • シンボルからの値。

  • 絶対値。

  • <var — 変数 var の値。

  • $[expr] - mdbexpr の評価後のドット値。例:

    $[<var=J]

    は、変数 var の値を取得します。

::kill
:k

ターゲットが動作中のユーザープロセスである場合、強制的にターゲットを終了します。また、ターゲットが本来デバッガで ::run を使用して作成されていた場合、デバッガを終了すると、ターゲットは強制的に終了されます。

$l

ターゲットがユーザープロセスである場合、代表スレッドの LWPID を出力します。

$L

ターゲットがユーザープロセスである場合、ターゲット内にある各 LWP の LWPID を出力します。

[ address ] ::list [–b back_member] [–p] [–L] [type] member [ variable-name ]

リンクリストデータ構造体の要素を調べて、リスト内の各要素のアドレスを出力します。リスト内の最初の要素のアドレスは、オプションのアドレスを使用して指定できます。その他の場合には、リストは現在のドット値から始まるものとみなされます。mdb が適切なサイズのオブジェクトから読み取ることができるように、type パラメータは C 言語の構造体または共用体を指定する必要があり、リスト内の要素の型を記述するのに使用されます。::list でタイプを変別できる場合は、type を省略できます。member パラメータは、リスト内の次の要素へのポインタを含む、type のメンバーを指定するのに使用されます。::list dcmd が反復処理を続行するのは、NULL ポインタに遭遇するか、最初の要素に再度達する (循環リスト) か、ループ検出が有効 (–L) でかつループが検出されるか、バックメンバーチェックが有効 (–b) であるか、不良バックポインタが検出されるか、または要素の読み取り時にエラーが発生するまでです。オプションの variable-name が指定されている場合には、mdb がパイプラインの次のステージを呼び出すときに walk の各ステップが返す値に、指定変数が割り当てられます。

–b back_member

back_member がリストの直前のメンバーを指し示すことを確認します。リストの最初のメンバーには、NULL バックポインタの保持が許可されます。

–L

リスト内のループをチェックします。リスト内のすべての要素を 1 回出力します。

–p

仮想アドレスではなく、物理アドレスから読み取ります。

::list dcmd を使用できるのは、mdb で使用するように設計されているシンボリックデバッギング情報を含むオブジェクトに対してのみです。詳細は、後述の「注意事項」の「シンボリックデバッギング情報」を参照してください。

addr ::tail [+-]num|[+-]n num [|::dcmd …]

パイプ内の最後の要素を出力します。

-n num または -num

パイプ内の最後の num 個の要素のみを渡します。

+n num または +num

最初の num 個を除くすべての要素を渡します (num は 10 進数)。

次の属性を持っています。

ターゲット

proc

モジュール

mdb

インタフェースの安定性

開発中

addr ::head [-+]num|[-+]n num [|::dcmd …]

パイプ内の要素数を制限します。

-n num または -num

パイプ内の最初の num 個の要素のみを渡します。

+n num または +num

最後の num 個を除くすべての要素を渡します (num は 10 進数)。

次の属性を持っています。

ターゲット

proc

モジュール

mdb

インタフェースの安定性

開発中

::load [ –s ] module-name

指定された dmod をロードします。モジュール名は、絶対パスまたは相対パスとして指定します。module-name が単純名、つまり「/」を含んでいない場合には、mdb はモジュールライブラリパス内で検索します。モジュールの名前に重複があった場合には、そのモジュールは読み込まれません。その場合は、まず既存のモジュール名を読み込み解除する必要があります。–s オプションを指定すると、mdb はモジュールを発見または読み込めなくても何も出力せず、エラーメッセージも表示しません。

::log [ –d | [ –e ] filename ]
$> [ filename ]

出力ログを有効にしたり、無効にしたりします。mdb は、相互ログ機能を提供しているので、まだユーザーとの対話処理が行われているときにも、入力コマンドと標準出力の両方が同じファイルに記録できます。–e オプションでファイルを指定すると、指定したファイルへのログの書き込みが有効になり、ファイル名を指定しない場合、前回のログファイルへの書き込みが再度有効になります。–d オプションは、ログを無効にします。また、$> dcmd を使用する場合、ファイル名引数が指定されているときには、ログが有効になります。その他の場合、ログは無効になります。指定されたログファイルがすでに存在する場合、mdb は新しいログ出力をそのファイルに追加します。

::map command

文字列引数として指定される command を使用して、ドット値を対応する値へ割り当ててから新しい値を出力します。command にスペースやメタキャラクタが含まれる場合は、必ず引用符で囲んでください。::map dcmd をパイプライン内で使用すると、アドレスのリストを新しいアドレスリストに変換できます。

[ address ] ::mappings [ name ]
[ address ] $m [ name ]

ターゲットの仮想アドレス空間内の各割り当てを、アドレス、サイズ、それぞれの割り当て記述などを含めて一覧表示します。address が dcmd の前にある場合、mdb は指定されたアドレスを含む割り当てだけを表示します。文字列 name の引数を指定した場合、mdb はその説明と一致する割り当てだけを表示します。

::next [ SIG ]
:e [ SIG ]

ターゲットプログラムを 1 命令だけ実行しますが、サブルーチンの呼び出しまでは進めます。オプションのシグナルの名前または番号 (signal.h(3HEAD) を参照) が引数として指定された場合、このシグナルはターゲットの実行を再開するための一部として、すぐにターゲットに送られます。どのターゲットプログラムも動作していない場合、::next は、::run を実行したかのように新しいプログラムを起動し、最初の命令で停止します。

[ address ] ::nm [ –DPdghnopuvx ] [ –t types ] [ –f format ] [ object ]

現在のターゲットに関連付けられたシンボルテーブルを出力します。オプションの address を dcmd の前に指定した場合、address に対応するシンボル用のシンボルテーブルエントリだけが表示されます。object を指定すると、この読み込みオブジェクト用のシンボルテーブルだけが表示されます。また、::nm dcmd は、次のオプションも認識します。

–D

.symtab の代わりに .dynsym (動的シンボルテーブル) を出力します。

–P

.symtab の代わりに専用シンボルテーブルを出力します。

–d

値とサイズフィールドを 10 進数で出力します。

–g

大域シンボルだけを出力します。

–h

ヘッダー行を抑制します。

–n

名前順にシンボルをソートします。

–o

値とサイズフィールドを 8 進数で出力します。

–p

シンボルを、一連の ::nmadd コマンドとして出力します。このオプションは –P とともに使用して、マクロファイルを作成できます。その後、$< コマンドを用いて、このマクロファイルをデバッガに読み込みます。

–u

未定義のシンボルだけを出力します。

–v

値順にシンボルをソートします。

–x

値とサイズフィールドを 16 進数で出力します。

–t type[,type … ]

指定された型のシンボルだけを出力します。有効な型引数文字列は次のとおりです。

noty

STT_NOTYPE

objt

STT_OBJECT

func

STT_FUNC

sect

STT_SECTION

file

STT_FILE

comm

STT_COMMON

tls

STT_TLS

regi

STT_SPARC_REGISTER

–f format[,format … ]

指定されたシンボル情報だけを出力します。有効な書式化引数文字列は次のとおりです。

ndx

シンボルテーブルのインデックス

val

シンボル値

size

サイズ (単位はバイト)

type

シンボルの型

bind

結合

oth

その他

shndx

セクションのインデックス

name

シンボル名

ctype

シンボルの C 言語の型 (既知の場合)

obj

シンボルを定義するオブジェクト

value ::nmadd [ –fo ] [ –e end ] [ –s size ] name

指定されたシンボルの名前を、専用シンボルテーブルへ追加します。mdb は、構成可能な専用シンボルテーブルを用意しています。前述の「シンボルの名前解決」で説明したように、この専用テーブルは、ターゲットのシンボルテーブル内に置くことができます。また、::nmadd dcmd は、次のオプションも認識します。

–e

シンボルのサイズを end - value に設定します。

–f

シンボルのタイプを STT_FUNC に設定します。

–o

シンボルのタイプを STT_OBJECT に設定します。

–s

シンボルのサイズを size に設定します。

::nmdel name

指定されたシンボルの名前を専用シンボルテーブルから削除します。

::objects [ –v ]

既知の読み込みオブジェクトのプライマリ割り当て (通常はテキストセクション) に対応するマッピングだけを表示して、そのターゲットの仮想アドレス空間の割り当てを出力します。–v オプションは、各ロードオブジェクトのバージョンを表示します。すべてのロードオブジェクトのバージョン情報が得られるわけではありません。バージョン情報のないロードオブジェクトは、バージョンが「不明」のオブジェクトとして –v オプションの出力に表示されます。

::offsetof member

指定された型のメンバーのオフセットを出力します。型は、C 言語の構造体の名前にします。メンバーが指定されない場合は、この型の全メンバーが報告されます。

オフセットはバイトで出力されます。ただし、メンバーがビットフィールドの場合、オフセットはビットで出力されます。分かりやすくするために、出力の末尾には常に適切な単位が付きます。型名には、前述の「シンボルの名前解決」で説明した逆引用符 (`) 有効範囲規則を使用できます。::offsetof dcmd は、mdb で使用されるように設計されたシンボルデバッグ情報を含むオブジェクトだけに使用できます。詳細は、後述の「注意事項」の「シンボルデバッグ情報」を参照してください。

address ::print [ –aCdiLptx ] [ –c lim ] [ –l lim ]
[ type [ member … ] ]

指定された仮想 address にあるデータ構造体を、指定された type 情報を使用して出力します。type パラメータは C 言語の構造体、共用体、列挙型、基本的な整数型、あるいは、これらの型へのポインタを指定できます。型名にスペース文字が含まれる場合 (たとえば、「struct foo」)、単一引用符または二重引用符で囲む必要があります。型名には、前述の「シンボルの名前解決」で説明した逆引用符 (`) 有効範囲規則を使用できます。type が構造化された型である場合、::print dcmd は構造体または共用体の各メンバーを再帰的に出力します。type 引数を指定せず、かつ、静的または大域的な STT_OBJECT シンボルがアドレスに一致する場合、::print は自動的に適切な型を推測します。type 引数を指定した場合は、その後ろに member 式のリストをオプションで指定できます。その場合は、指定された type のメンバーまたはサブメンバーだけが表示されます。type にその他の構造化された型が含まれる場合、区切り記号のピリオド (「.」) で区切ったメンバー名のリストを生成することで、各メンバー文字列はサブ構造体要素を参照できます。::print dcmd は、mdb で使用されるように設計されたシンボルデバッグ情報を含むオブジェクトだけに使用できます。詳細は、後述の「注意事項」の「シンボルデバッグ情報」を参照してください。データ構造体を表示したあと、::print はドットを type のサイズ分 (バイト) だけインクリメントします。

–a オプションを指定すると、各メンバーのアドレスが表示されます。–p オプションを指定すると、::print はアドレスを、仮想メモリーアドレスではなく、物理メモリーアドレスとして解釈します。–t オプションを指定すると、各メンバーの型が表示されます。–d または –x オプションを指定した場合は、すべての整数が 10 進数 (–d) または 16 進数 (–x) で表示されます。デフォルトでは、発見的方法を使用して、値が 10 進数で表示されるか 16 進数で表示されるかを判別します。文字列として読み取りまたは表示される文字配列内の文字数は –c オプションで制限できます。–C オプションを指定すると、文字数は制限されません。読み取りまたは表示される標準配列内の要素数は –l オプションで制限できます。–L オプションを指定すると、文字数は制限されず、配列内のすべての要素が表示されます。–c–l オプションのデフォルト値を変更するには、「オプション」で説明する ::set または –o コマンド行オプションを使用します。

–i オプションを指定した場合、アドレス値は出力する即値として解釈されます。値を解釈する型を指定する必要があります。型が 64 ビットより小さい場合、即値は型のサイズである場合と同じように解釈されます。–i オプションを –p オプションとともに使用することはできません。–a オプションを指定した場合、表示されるアドレスはゼロから始まるバイトオフセットです。

address ::printf [ –t format … ] format [type] …

printf format コマンドを使用してデータ構造体を出力します。format の引数は次のいずれかになります。

  • 構造体またはユニオン内の要素。

  • シンボルからの値

  • 絶対値。

  • <var: 変数 var の値。

  • $expr: mdbexpr の評価後のドット値。これは、二重引用符 ("") を使って囲む必要があります。たとえば、"$<var=J" は、変数 var の値を取得します。

オプション引数 –t は、ほかのすべての出力が生成される前に 1 回だけ出力されるタイトルを指定する場合に使用します。書式文字列で発生する可能性のある展開については、::help printf コマンドを参照してください。

::quit
$q

デバッガを終了します。

[ thread ] ::regs
[ thread ] $r

代表スレッドの汎用レジスタセットを出力します。スレッドを指定すると、そのスレッドの汎用レジスタセットが表示されます。スレッド式は、前述の「スレッドのサポート」で説明したスレッド識別子の 1 つである必要があります。

::release [ –a ]
:R [ –a ]

以前に接続されたプロセスまたはコアファイルを解放します。–a オプションを指定すると、プロセスは解放され、停止および中断されたままになります。このようなプロセスを継続するには prun (1) を使用し (proc(1) を参照)、再開するには mdb などのデバッガを適用します。デフォルトでは、解放されたプロセスは、mdb::run で作成された場合には強制的に終了され、mdb–p オプション、::attach または :A dcmd で接続されていた場合には解放および実行状態に設定されます。

::run [ args … ]
:r [ args … ]

指定された引数を使用して、新しいターゲットプログラムの実行を起動し、接続します。引数はシェルによって解釈されません。デバッガがすでに動作中のプログラムを検査している場合、::release が実行された場合と同じように、最初にこのプログラムから切断します。

[ addr ] ::save [–p] [type] [member] variable

パイプライン内で変数を使用できるようにするために、値を mdb 変数に保存します。変数のみが指定された場合、現在のドットの値が変数に保管され、ドットが出力されます。型およびメンバーがコマンド行にある場合、メンバーが変数に保管されます。ドットは常に、その値が変更されずに出力されます。

::set [ –wF ] [ +/–o option ] [ –s distance ] [ –I path ]
[ –L path ] [ –P prompt ]

デバッガの種々のプロパティーを取得または設定します。いずれのオプションも指定されていない場合には、デバッガのプロパティーの現在の設定が表示されます。::set dcmd は次のオプションを認識します。

–F

その次のユーザープロセスで、::attach が適用されているプロセスを強制的に引き継ぎます (–F オプションをコマンド行に指定して mdb を実行する場合と同じ)。

–I

マクロファイルを検出するためのデフォルトパスを設定します。パス引数は特殊トークンを使用できます。「オプション」の –I コマンド行オプションの説明を参照してください。

–L

デバッガモジュールを検出するためのデフォルトパスを設定します。パス引数は特殊トークンを使用できます。「オプション」の –I コマンド行オプションの説明を参照してください。

–o

指定したデバッガオプションを有効にします。–o 書式が使用されている場合には、そのデバッガオプションを無効にします。オプションの文字列については、–o コマンド行オプションとともに「オプション」で説明されています。

–P

コマンドプロンプトを、指定されたプロンプト文字列に設定します。

–s

シンボルマッチングディスタンスを指定された距離に設定します。詳細は、「オプション」の –s コマンド行オプションの説明を参照してください。

–w

ターゲットを書き込み用にもう一度開きます (–w オプションをコマンド行に指定して mdb を実行する場合と同じ)。

[address]::shell [–o b|o|d|x|s] "shell command"

指定されたシェルコマンドを使用してアドレスをパイプし、シェルコマンドの出力を mdb パイプラインにパイプし直すことができるようにします。

–o オプションが入力された場合は、指定された数値ベースに従ってシェルコマンドの出力を解釈します。–o の引数は次のとおりです。

b

2 進数

o

8 進数

d

10 進数

x

16 進数

s

出力を解釈せずに文字列として処理する

例:

::walk proc | ::shell "tail -10" | ::print proc_t
::showrev [ –pv ]

ハードウェアおよびソフトウェアの変更情報を表示します。オプションを指定しないと、一般的なシステム情報が表示されます。–v オプションは、すべてのロードオブジェクトのバージョン情報を表示します。–p オプションは、パッチの一部としてシステムにインストールされたロードオブジェクトのバージョン情報だけを表示します。すべてのロードオブジェクトのバージョン情報が得られるわけではありません。バージョン情報のないロードオブジェクトは、–p オプションの出力から省略され、バージョンが「不明」のオブジェクトとして –v オプションの出力に表示されます。

[signal] ::sigbp [+/–dDestT] [–c cmd] [–n count] SIG
[signal] :t [+/–dDestT] [–c cmd] [–n count] SIG

指定されたシグナルの送り先を追跡します。シグナルを特定するには、dcmd の前にオプションのシグナル番号を指定するか、dcmd の後ろにシグナルの名前または番号のリストを指定します (signal.h(3HEAD) を参照)。–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。最初に、デフォルトでプロセスがコアをダンプする原因となるシグナルセット ( signal.h (3HEAD) を参照) と SIGINT が追跡されます。

::sizeof [–s size] [–r min max] [type [member …]]

オプションは、次のとおりです:

–s size

このサイズのエントリの型を示します。

–r min max

サイズ範囲のエントリの型を示します。

指定された型のサイズをバイトで表示します。type パラメータは C 言語の構造体、共用体、列挙型、基本的な整数型、あるいは、これらの型へのポインタを指定できます。型名には、前述の「シンボルの名前解決」で説明した逆引用符 (`) 有効範囲演算子を使用できます。member は、標準の C 言語構文で、配列インデックス作成演算子 “[ index]”、構造体メンバー演算子 “.” を使用して指定できます。

::sizeof dcmd は、mdb で使用されるように設計されたシンボルデバッグ情報を含むオブジェクトだけに使用できます。詳細は、後述の「注意事項」の「シンボルデバッグ情報」を参照してください。

::sort [–u [–c] [–v var]] [type] [–s [–i]] [–r] [at] offset|member
[[–s [–i]] [–r] [–u] member]… [|::dcmd …]

指定されたルールに基づいて、アドレスをソートします。引数なしの ::sort を使用すると、アドレスの数値に基づいてアドレスがソートされます。型が指定された場合、::sort は、指定された構造体または共用体のメンバーに基づいてソートされます。オフセットが指定された場合、ソートはその値での単純な型の値に基づいてソートされます。複数のソートキーを指定でき、各ソートキーには独自のオプションを指定できます。「ソートキーオプション」を参照してください。

単純な型

char, uchar, short, ushort, int, uint, long, ulong, longlong, ulonglong, pointer, addr

オプション

–u

Uniq.ソート基準に一度一致したアドレスのみ出力します。

–R

Not uniq.ソートの結果、一致を持たない行を抑制します。

–U

Really uniq.ソートの結果、一意のエントリのみ出力します。

–c

パイプに出力せず、uniq フラグを使用する場合、各アドレスの前に一致した数を出力します。

–v

一意のエントリの数を変数 var に格納します。

ソートキーオプション

–r

このテストの順序を逆にします。

–s

このアイテムを文字列として扱います。

–i

ソート文字列が大文字と小文字を無視する場合。

–u

このキーで一意。残りのキーを使用してソートしますが、このキーに一致した最後のエントリのみ出力します。例については、::help ソートを参照してください。

–l len

ソートポインタがポインタを間接参照し、len バイトを比較します。

[ address ] ::stack [ count ]
[ address ] $c [ count ]

C スタックのバックトレースを出力します。この dcmd の前に明示的な address がある場合には、その仮想記憶アドレスから始まるバックトレースを表示します。その他の場合には、代表スレッドのスタックを表示します。オプションのカウント値が引数として指定されている場合には、出力の各スタックフレームに対して、count 引数で指定された数の引数だけが表示されます。

::status

現在のターゲットに関連した情報のサマリーを出力します。

::step [ over | out ] [ SIG ]
:s [ SIG ]
:u [ SIG ]

ターゲットプログラムを 1 命令だけ実行します。オプションのシグナルの名前または番号 (signal.h(3HEAD) を参照) が引数として指定された場合、このシグナルはターゲットの実行を再開するための一部として、すぐにターゲットに送られます。 over 引数を指定した場合、::step はサブルーチンの呼び出しまで進めます。::step over 引数は ::next dcmd と同じです。オプションの out 引数を指定した場合、代表スレッドが現在の関数から戻ってくるまで、ターゲットプログラムは実行を継続します。どのターゲットプログラムも動作していない場合、::step out は、::run を実行したかのように新しいプログラムを起動し、最初の命令で停止します。:s dcmd は ::step と同じです。:u dcmd は ::step out と同じです。

[ syscall ] ::sysbp [ +/–dDestT ] [ –io ] [ –c cmd ]
[ –n count ] syscall

エントリを追跡するか、指定されたシステムコールから終了します。システムコールを特定するには、dcmd の前にオプションのシステムコール番号を指定するか、dcmd の後ろにシステムコールの名前または番号のリストを指定します (<sys/syscall.h> を参照)。–i オプションを指定した場合 (デフォルト)、イベント指定子はシステムコールごとにカーネルに入るトリガーとなります。–o オプションを指定した場合、イベント指定子はカーネルから終了するトリガーとなります。–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。

thread ::tls symbol

指定されたスレッドのコンテキストにおいて、指定された TLS (Thread-Local Storage) シンボル用の記憶領域のアドレスを出力します。スレッド式は、前述の「スレッドのサポート」で説明したスレッド識別子の 1 つである必要があります。シンボル名には、前述の「シンボルの名前解決」で説明している任意の有効範囲規則を使用できます。

::typeset [ +/–t] variable-name

指定された変数に属性を設定します。1 つまたは複数の名前が指定されている場合は、それらを定義して、ドット値に設定します。–t オプションを指定すると、各変数に関連付けられたユーザー定義のタグが設定されます。–t オプションを指定すると、そのタグは削除されます。変数名が何も指定されていない場合には、変数のリストとその値を出力します。

::unload module-name

指定された dmod を読み込み解除します。::dmods dcmd を使用すると、動作中の dmod のリストを出力できます。組み込みモジュールは、読み込み解除できません。使用中のモジュール、すなわち現在実行中の dcmd を提供しているモジュールは、解除できません。

::unset variable-name

定義された変数リストから、指定された変数の設定を解除、すなわち削除します。mdb によってエクスポートされている変数の中には、永続的と指定されていて、ユーザーが削除できないものがあります。

::vars [–npt]

指定された変数の一覧を表示します。–n オプションを指定すると、その出力は、ゼロ以外の変数に限定されます。–p を指定すると、変数は $< dcmd を使用して、デバッガの再処理に適切な形式で出力されます。このオプションを使用すると、変数をマクロファイルに記録しておき、あとでこれらの値を復元できます。–t を指定すると、タグ付き変数だけが出力されます。変数にタグを付けるには、::typeset dcmd の –t オプションを使用します。

::version

デバッガのバージョン番号を出力します。

address ::vtop [–a as]

可能な場合、指定された仮想アドレスに対する物理アドレスのマッピングを出力します。::vtop dcmd を利用できるのは、カーネルターゲットを検査しているとき、あるいは、::context dcmd を実行したあとで、カーネルクラッシュダンプ内のユーザープロセスを検査しているときだけです。

カーネルコンテキストからカーネルターゲットを検査しているとき、–a オプションを使用すると、仮想アドレスから物理アドレスへの変換で使用される代替アドレス空間構造体のアドレス (as) を指定できます。デフォルトでは、この変換にはカーネルのアドレス空間が使用されます。ダンプに含まれるのがカーネルページだけの場合でも、このオプションはアクティブなアドレス空間に対して利用できます。

[ address ] ::walk walker-name [ variable-name ]

指定された walker を使用して、データ構造体の要素を調べます。::walkers dcmd を使用すると、使用可能な walker を一覧表示できます。walker は、大域的なデータ構造体について動作する場合もあり、開始アドレスを必要としないものがあります。たとえば、カーネル内の proc 構造体のリストを調べる場合などです。その他の walker は、アドレスが明示的に指定されている固有のデータ構造体上で動作します。たとえば、アドレス空間でポインタを指定して、セグメントのリストを調べる場合です。対話処理で使用される場合、::walk dcmd は、データ構造体内の各要素のアドレスをデフォルト形式で出力します。また、この dcmd は、パイプラインにアドレスリストを提供するときにも使用できます。walker 名には、前述の dcmd and Walker Name Resolution で説明した逆引用符 (`) 有効範囲規則を使用できます。オプションの variable-name が指定されている場合には、mdb がパイプラインの次のステージを呼び出すときに walk の各ステップが返す値に、指定変数が割り当てられます。

::walkers

使用可能な walker の一覧と、各 walker の簡潔な説明を出力します。

::whence [ –v ] name
::which [ –v ] name

指定された dcmd と walker をエクスポートする dmod を出力します。これらの dcmd を使用すると、指定された dcmd または walker の大域定義を現在提供しているのはどの dmod かを判断できます。大域的な名前解決の詳細については、前述の「dcmd と walker の名前解決」のセクションを参照してください。–v オプションを指定すると、各 dcmd や walker の代替定義を優先順に出力します。

addr [ ,len ] ::wp [ +/–dDestT ] [ –rwx ] [ –c cmd ] [ –n count ]
addr [ ,len ] :a [ cmd … ]
addr [ ,len ] :p [ cmd … ]
addr [ ,len ] :w [ cmd … ]

指定された場所にウォッチポイントを設定します。監視される領域の長さをバイト数で設定するには、dcmd の前に繰り返し回数を指定します。長さを明示的に設定しない場合、デフォルトは 1 バイトです。::wp dcmd を使用すると、読み取り (–r オプション)、書き込み (–w オプション)、または実行 (–x オプション) のアクセス権の任意の組み合わせでのトリガーが可能となるようにウォッチポイントを構成できます。–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。:a dcmd は、指定されたアドレスに読み取り権のウォッチポイントを設定します。:p dcmd は、指定されたアドレスに実行権のウォッチポイントを設定します。:w dcmd は、指定されたアドレスに書き込み権のウォッチポイントを設定します。:a:p、および :w dcmd の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

addr ::array [–t member_type|–s member_size|–S array_size]
[–v variable] [type] [member] [count] [variable] [|::dcmd …]

配列内の各要素のアドレスを出力します。その最初の形式で、::array は、ドットをタイプ type および長さ count の配列の開始として扱います。

::array type count

その 2 番目の形式で、::array は、ドットを配列または埋め込み配列のどちらかへのポインタであるメンバーを含む、タイプ type の構造体または共用体のアドレスとして扱います。

::array type member count

この形式では、count に整数、変数、または構造体/共用体フィールドを指定できます。構造体/共用体フィールドの場合は、そのフィールドの値が使用されます。

また、「–s」、「–S」、または「–t」オプションのいずれかを使用して配列のサイズを指定することもできます。これは、その配列が「void *」を使用してポイントされているため、ポインタのタイプから正しいサイズを推測できない場合に役立ちます。

–S および –s フラグへの引数は、整数、mdb 変数 (<var)、評価 ($[ mdb eval ])、グローバル変数、global (*global) によってポイントされた整数、またはデータ構造体のメンバーで指定できます。

–v var

ドットを変数 var に保存します。これは、変数を指定するための望ましい方法です。

–S array_size

配列の合計サイズを指定します。

–s member_size

配列の要素のサイズを指定します。

–t member_type

配列の要素のタイプを指定します。

::xdata

現在のターゲットによってエクスポートされた外部データバッファーを一覧表示します。外部データバッファーは、現在のターゲットに関連付けられた情報を示します。この情報は、標準ターゲット機能ではアクセスできないもので、アドレス空間、シンボルテーブル、レジスタセットなどが含まれています。これらのバッファーは dcmd によって消費されます。詳細は、Oracle Solaris Modular Debugger Guide を参照してください。

:z

すべてのイベント指定子を追跡対象ソフトウェアイベントのリストから削除します。::delete を使用しても、イベント指定子は削除できます。

オプション

サポートしているオプションは、次のとおりです。

–A

mdb モジュールの自動読み込みを無効にします。デフォルトでは、mdb は、ユーザープロセスまたはコアファイルのアクティブな共用ライブラリに対応しているデバッガモジュール、または稼働中のオペレーティングシステムかオペレーティングシステムのクラッシュダンプにある読み込み済みのカーネルモジュールに対応しているデバッガモジュールを読み込もうとします。

–f

強制的に raw ファイルデバッギングモードに入ります。デフォルトでは、mdb は、オブジェクトとコアファイルのオペランドがユーザーの実行可能ファイルとコアダンプを参照しているのか、または 1 組のオペレーティングシステムのクラッシュダンプファイルを参照しているのかを判断しようとします。ファイルのタイプを推測できない場合、デバッガはデフォルトでそのファイルをプレーンなバイナリデータとして調査します。–f オプションを使用すると、mdb は引数を調査すべき raw ファイルセットとして解釈します。

–F

必要に応じて、指定されたユーザープロセスに強制的に接続します。デフォルトでは、mdb は、すでに truss(1) など別のデバッグ用ツールの制御下にあるユーザープロセスへの接続を拒否します。–F オプションを指定すると、mdb はこれらのプロセスに接続します。これによって、mdb とプロセスを制御しようとしているほかのツールとの間で予期しない相互作用が発生する可能性があります。

–I path

マクロファイルを検出するためのデフォルトのパスを設定します。マクロファイルは、 $< または $<< dcmd を使用して読み取ります。このときのパスは、一連のディレクトリ名をコロン (:) 文字で区切ったものです。–I include パスと –L library パス (以降を参照) には、次のトークンを含めることができます。

%i

現在の命令セットアーキテクチャー (ISA ) の名前 (「sparc」、「sparcv9」、または「i386」) に展開されます。

%o

変更対象のパスの古い値まで展開されます。これは、既存のパスの前または後ろにディレクトリを追加するときに有用です。

%p

現在のプラットフォーム文字列 (uname –i またはプロセスのコアファイルあるいはクラッシュダンプに格納されているプラットフォーム文字列) に展開されます。

%r

ルートディレクトリのパス名まで展開されます。–R オプションを使用すると、代替ルートディレクトリを指定できます。–R オプションを指定しないと、ルートディレクトリは mdb 実行可能ファイル自体へのパスから動的に決定されます。たとえば、/bin/mdb を実行した場合、ルートディレクトリは / です。/net/hostname/bin/mdb 実行した場合、ルートディレクトリは /net/hostname となります。

%t

現在のターゲット名まで展開されます。これはリテラル文字列「proc」(ユーザープロセスまたはユーザープロセスのコアファイル)、「kvm」(カーネルクラッシュダンプまたは稼働中のオペレーティングシステム)、または「raw」(raw ファイル) のいずれかです。

32 ビットの mdb に対するデフォルトのインクルードパスは、次のとおりです。

%r/usr/platform/%p/lib/adb:%r/usr/lib/adb

64 ビットの mdb に対するデフォルトのインクルードパスは、次のとおりです。

%r/usr/platform/%p/lib/adb/%i:%r/usr/lib/adb/%i
–k

強制的にカーネルデバッギングモードにします。デフォルトでは、mdb は、オブジェクトとコアファイルのオペランドがユーザーの実行可能ファイルとコアダンプを参照しているのか、または 1 組のオペレーティングシステムのクラッシュダンプファイルを参照しているのかを判断しようとします。–k オプションを指定すると、mdb は、これらのファイルがオペレーティングシステムのクラッシュダンプファイルであるとみなします。オブジェクトまたはコアオペランドを指定せずに –k オプションを指定すると、mdb は、オブジェクトファイルを /dev/ksyms に、コアファイルを /dev/kmem にデフォルト設定します。/dev/kmem に読み取りアクセスできるのはグループ sys だけです。書き込みアクセスにはすべての特権が必要です。

–K

kmdb をロードし、実行中のオペレーティングシステムカーネルを停止して、kmdb デバッガプロンプトを表示します。このオプションは、システムコンソールでしか使用してはいけません。それに続く kmdb プロンプトがシステムコンソールに表示されます。

–L path

デバッガモジュールを検索するためのデフォルトのパスを設定します。モジュールは起動時に自動的に読み込まれるか、または ::load dcmd を使用して読み込まれます。このときのパスは、一連のディレクトリ名をコロン (:) 文字で区切ったものです。–L ライブラリパスには、前述の –I オプションで示したトークンも含めることができます。

–m

カーネルモジュールシンボルのデマンドローディングを無効にします。デフォルトでは、mdb は読み込まれたカーネルモジュールのリストを処理し、モジュールごとにシンボルテーブルのデマンドローディングを実行します。–m オプションを指定すると、mdb はカーネルモジュールのリストを処理したり、モジュールごとにシンボルテーブルを提供したりしなくなります。結果として、アクティブなカーネルモジュールに対応する mdb モジュールは起動時に読み込まれません。

–M

すべてのカーネルモジュールシンボルを事前に読み込みます。デフォルトでは、mdb はカーネルモジュールシンボルのデマンドローディングを実行します。 アドレスがそのモジュールのテキストであるとき、またはデータセクションが参照されているとき、モジュールのシンボルテーブルが完全に読み取られます。–M オプションを指定すると、mdb は起動時にすべてのカーネルモジュールのシンボルテーブルを完全にロードします。

–o option

指定したデバッガオプションを有効にします。–o 形式のオプションを使用した場合は、指定したオプションが無効になります。次に掲載しているものを除いて、各オプションともデフォルトでは無効になっています。mdb は次のオプション引数を認識します。

adb

adb(1) の互換性をより厳密にします。プロンプトは空の文字列に設定され、出力ページャーなどの多数の mdb 機能が無効になる。

array_mem_limit=limit

::print が表示する配列のメンバー数に対してデフォルトの制限を設定します。limit が特別なトークン none である場合、デフォルトで配列のすべてのメンバーが表示される。

array_str_limit=limit

::print が char 型の配列を出力するときに ASCII 文字列として表示する文字数に対してデフォルトの制限を設定します。limit が特別なトークン none である場合、デフォルトで char 配列全体が string として表示される。

follow_exec_mode=mode

次の exec() および spawn() システムコールのデバッガの動作を設定します。mode は次の名前付き定数の 1 つである必要があります。

ask

stdout が端末デバイスである場合、デバッガは exec() または spawn() システムコールが返ったあとに停止して、新しいプログラムまたは停止のどちらに従うか決定するようにユーザーに求めます。stdout が端末デバイスではない場合、ask モードはデフォルトで stop になる。

follow

デバッガは自動的にターゲットプロセスを継続し、新しい実行可能ファイルに基づいて、ターゲットプロセスのマッピングとシンボルテーブルをすべてリセットし、exec に従う。follow の動作の詳細については、後述の「注意事項」の「exec との対話」を参照。

stop

exec() または spawn() システムコールから戻ったあと、デバッガは停止します。stop の動作の詳細については、後述の「注意事項」の「exec との対話」を参照。

follow_fork_mode=mode

次の fork()fork1()vfork()、または spawn() システムコールのデバッガ動作を設定します。mode は次の名前付き定数の 1 つである必要があります。

ask

stdout が端末デバイスである場合、デバッガは fork() または spawn() システムコールが返ったあとに停止して、親または子のどちらに従うか決定するようにユーザーに求めます。stdout が端末デバイスではない場合、ask モードはデフォルトで parent になる。

parent

デバッガは親プロセスに従い、子プロセスから切断して子プロセスが動作するように設定します。

child

デバッガは子プロセスに従い、親プロセスから切断して親プロセスが動作するように設定します。

ignoreeof

端末に EOF シーケンス (^D) が入力されても、デバッガは終了しません。終了するには ::quit dcmd を使用する必要がある

nostop

–p オプションを指定したか、::attach または :A dcmd を適用した場合、ユーザープロセスと接続しているときには、そのユーザープロセスを停止しません。nostop の動作の詳細については、後述の「注意事項」の「プロセスの接続と解放」を参照。

nostrict

デバッガは DCMD の使用制限を強制しません。

pager

出力ページャーを有効にする (デフォルト)。

repeatlast

復帰改行文字がコマンドとして端末に入力された場合、mdb は前のコマンドを現在のドットの値で繰り返す。–o adb を指定した場合、このオプションも自動的に指定されている

showlmid

mdb は LM_ID_BASE と LM_ID_LDSO 以外のリンクマップを使用するユーザーアプリケーションでシンボルの命名と識別をサポートする (「シンボルの名前解決」を参照)。LM_ID_BASE または LM_ID_LDSO 以外のリンクマップ上のシンボルは LMlmid`library`symbol のように表示される (このとき、lmid はデフォルトの出力基数 (16 進数) のリンクマップ ID)。showlmid オプションを有効にすると、すべてのシンボルとオブジェクト (LM_ID_BASE と LM_ID_LDSO に関連するものも含む) のリンクマップ ID スコープを表示するように mdb を構成できる。オブジェクトファイル名を扱う組み込み dcmd (::nm::mappings$m::objects など) は、前述の showlmid の値に従ってリンクマップ ID を表示します。

–p pid

指定されたプロセス ID に接続し、そのプロセスを停止します。mdb は、/proc/pid/object/a.out ファイルを実行可能ファイルのパス名として使用します。

–P prompt

コマンドプロンプトを設定します。デフォルトのプロンプトは > です。

–R root

パス名の展開に合わせてルートディレクトリを設定します。デフォルトでは、ルートディレクトリは mdb 実行可能ファイル自体のパス名から導かれます。ルートディレクトリは、パス名の展開の際に %r トークンと置き換えられます。

–s distance

アドレスからシンボル名への変換用のシンボルマッチングディスタンスを、指定した distance に設定します。デフォルトでは、mdb はこの距離をゼロに設定し、スマートマッチングモードを有効にします。ELF シンボルテーブルのエントリには値 V とサイズ S が含まれ、関数またはデータオブジェクトのサイズがバイト単位で示されます。スマートモードでは、mdb は、A が [ V, V + S ) の範囲にある場合、アドレス A と与えられたシンボルとを一致させます。ゼロ以外の距離を指定した場合も同じアルゴリズムが使用されますが、前述の式に S を指定した場合、常に絶対距離が指定され、シンボルのサイズは無視されます。

–S

ユーザーの ~/.mdbrc ファイルの処理を抑制します。デフォルトでは、mdb は、$ HOME で定義されているユーザーのホームディレクトリにマクロファイル .mdbrc があれば、それを読み取って処理します。–S オプションを指定すると、このファイルは読み取られません。

–u

強制的にユーザーデバッギングモードにします。デフォルトでは、mdb は、オブジェクトとコアファイルのオペランドがユーザーの実行可能ファイルとコアダンプを参照しているのか、または 1 組のオペレーティングシステムのクラッシュダンプファイルを参照しているのかを判断しようとします。–u オプションを使用すると、mdb は、これらのファイルがオペレーティングシステムのクラッシュダンプファイルではないとみなします。

–U

kmdb が読み込まれた場合は、それを読み込み解除します。kmdb が使用中でない場合は、それを読み込み解除し、カーネルデバッガで使用されたメモリーを解放してオペレーティングシステムが利用できるようにします。

–V version

逆アセンブラのバージョンを設定します。デフォルトでは、mdb は、デバッグターゲットに対する適切な逆アセンブラのバージョンを判断しようとします。–V オプションを使用すると、逆アセンブラを明示的に設定できます。::disasms dcmd によって、使用可能な逆アセンブラのバージョンが一覧表示されます。

–w

指定したオブジェクトとコアファイルを書き込み用に開きます。

–W

入出力デバイスに割り当てられるメモリーアドレスへのアクセスを許可します。デフォルトでは、mdb はそのようなアクセスを許可しません。これは、多くのデバイスには無効なソフトウェア操作に対するハードウェア保護機能がないためです。このオプションは、デバイスドライバのデバッグ時にのみ、注意して使用してください。

–y

tty モードに対する明示的な端末初期化シーケンスを送信します。一部の端末では、tty モードに切り替える際に明示的な初期化シーケンスが必要となります。この初期化シーケンスがないと、mdb からスタンドアウトモードなどの端末機能を使用できない場合があります。

オペランド

次のオペランドがサポートされています。

object

調査する ELF 書式のオブジェクトファイルを指定します。mdb が調査および編集できるのは、ELF 書式の実行可能ファイル (ET_EXEC)、ELF 動的ライブラリファイル (ET_DYN)、ELF 再配置可能オブジェクトファイル (ET_REL)、およびオペレーティングシステムのシンボルテーブル (unix.X ファイル) です。

core

ELF プロセスコアファイル (ET_CORE) またはオペレーティングシステムのクラッシュダンプファイルを指定します。ELF プロセスコアファイルオペランド (core) を指定する場合、対応するオブジェクトファイルを指定しないと、mdb はいくつかの異なるアルゴリズムを使用して、コアファイルを生成した実行可能ファイルの名前を推測しようとします。このような実行可能ファイルが見つからなかった場合、mdb は動作し続けますが、いくつかのシンボル情報が利用できなくなっている可能性があります。

システムクラッシュダンプファイルを対応するオブジェクトファイルなしで指定すると、mdbvmcore.N ファイルに含まれているオブジェクトファイル (UNIX バイナリ) のロードを試みます。

suffix

いくつかのオペレーティングシステムのクラッシュダンプファイルを表す数値の接尾辞を指定します。たとえば、接尾辞が「3」である場合、mdb は「unix.3」のファイルおよびすべての「vmcore-<section>.3」ファイルを調査するはずと推測します。これらのファイルは存在しないが、「vmdump.3」が存在する場合は、ダンプファイルを圧縮解除するには最初に savecore -f vmdump.3 を実行する必要があることを示すメッセージが出力されます。vmcore.3 が存在するが、vmcore.3 によって参照される一部の vmcore-<section>.3 ファイルが存在しない場合、mdb はそれらのファイルをロードし、仮想メモリーイメージが完全にならないという警告を出します。同じ名前の実際のファイルが現在のディレクトリに存在する場合、この数字文字列は接尾辞としては解釈されません。

終了ステータス

次の終了ステータスが返されます。

0

デバッガは正常に実行を終了しました。

1

致命的なエラーが発生しました。

2

無効なコマンド行オプションが指定された。

環境変数

HISTSIZE

この変数は、コマンド履歴リストの最大の長さを決定するために使用されます。この変数が存在しない場合、デフォルトの長さは 128 です。

HOME

この変数は、ユーザーのホームディレクトリ (.mdbrc ファイルが存在する場所) のパス名を決定するために使用されます。この変数が存在しない場合、.mdbrc は処理されません。

SHELL

この変数は、! メタキャラクタを使用して要求されたシェルエスケープを処理するシェルのパス名を決定するために使用されます。この変数が存在しない場合、/bin/sh が使用されます。

ファイル

$HOME/.mdbrc

ユーザーの mdb 初期設定ファイル。.mdbrc ファイルが存在する場合、そのファイルが処理されるのは、デバッグターゲットが初期化されたあとですが、モジュールの自動読み込みが実行される前、またはコマンドが標準入力から読み込まれる前です。

/dev/kmem

カーネルの仮想記憶イメージデバイス。このデバイス固有のファイルは、稼働中のオペレーティングシステムを検査するときにコアファイルとして使用されます。

/dev/ksyms

カーネルのシンボルテーブルデバイス。このデバイス固有のファイルは、稼働中のオペレーティングシステムを検査するときにオブジェクトファイルとして使用されます。

/proc/pid/*

ユーザープロセスを検査および制御するときに読み込まれるプロセス情報ファイル。

/usr/lib/adb
/usr/platform/ platform-name/lib/adb

$< および $<< dcmd で読み込まれるマクロファイルのデフォルトディレクトリ。platform-name はプラットフォームの名前で、コアファイルまたはクラッシュダンプの情報から、あるいは現在のマシンから、uname –i を使用する場合と同じように得られます (uname(1) を参照)。

/usr/lib/mdb
/usr/platform/ platform-name/lib/mdb

::load dcmd を使用してロードされるデバッガモジュールのデフォルトディレクトリ。platform-name は、コアファイルまたはクラッシュダンプ内の情報から、あるいは uname –i (uname(1) を参照) によって指定された場合と同様に現在のマシンから派生したプラットフォームの名前です。

属性

次の属性については、attributes(7) を参照してください。

属性タイプ
属性値
使用条件
developer/debug/mdb
インタフェースの安定性
確実

関連項目

adb(1), gcore(1), pgrep(1), proc(1), ps(1), stty(1), truss(1), uname(1), _lwp_self(2), exec(2), fork(2), pipe(2), spawn(2), vfork(2), dlopen(3C), signal(3C), thr_self(3C), elf(3ELF), signal.h(3HEAD), libc_db(3LIB), libkvm(3LIB), ksyms(4D), mem(4D), core(5), proc(5), attributes(7), threads(7), coreadm(8), dumpadm(8), savecore(8)

OracleSolaris 11.4 リンカーとライブラリガイド

Oracle Solaris Modular Debugger Guide

警告

エラー回復メカニズムの使用

デバッガとその dmod は同じアドレス空間内で動作するので、dmod にバグがあると、mdb がコアをダンプしたり、誤動作したりする可能性があります。mdb の resume 機能 (前述の「シグナル処理」を参照) はこのような状況に対して、制限付きで回復メカニズムを提供します。しかし、dmod 自身の状態やデバッガの大域的な状態だけでは、mdb は該当する dmod が壊れているかどうかを最終的には判断できません。したがって、resume 操作は安全であるとは保証されず、また、その後のデバッガのクラッシュを防ぐこともできません。resume によるもっとも安全な対処方法は、重要なデバッグ情報を保存し、デバッガを停止し再起動します。

動作中のオペレーティングシステムのデバッガによる修正

動作中のオペレーティングシステムのアドレス空間をデバッガを使用して修正する (書き込む) ことは非常に危険であり、ユーザーがカーネルデータの構造を破損するとシステムパニックが発生する可能性があります。

プロセスコアファイルの調査に関する制限

mdb は、Solaris 2.6 より前の Solaris のリリースによって生成されたプロセスコアファイルを検査するためのサポートを提供しません。Solaris 9 のリリースまたはそれ以前のリリースによって生成されたコアファイルをデバッグする場合は、シンボル情報が使用できない可能性があります。これらのコアファイルにはテキストセクションと読み取り専用データが存在しないため、プロセスがコアをダンプした時点でプロセスに存在したデータとシンボル情報が一致しない場合があります。Solaris 9 以降のリリースでは、テキストセクションと読み取り専用データはデフォルトでコアファイルに含まれます。ユーザーは、coreadm(8) を使用して、その情報をコアファイルから除外するように自分のプロセスを構成できます。これにより、それらのコアファイルの mdb によって出力される情報は、プロセスがコアをダンプした時点で存在したデータと一致しなくなります。x86 版の Solaris システムから生成されたコアファイルは SPARC 版の Solaris システムでは調査できず、その逆もできません。

クラッシュダンプファイルの調査に関する制限

Solaris 7 以前のリリースで生成されたクラッシュダンプを調査するには、対応するオペレーティングシステムのリリース用の libkvm が必要です。あるオペレーティングシステムのリリースで生成されたクラッシュダンプを別のオペレーティングシステムのリリースで dmod を使用して調査する場合、カーネルの実装によっては、いくつかの dcmd や walker が適切に動作しない可能性があります。mdb は、この状態を検出すると警告メッセージを発行します。x86 版の Solaris システムから生成されたクラッシュダンプは SPARC 版の Solaris システムでは調査できず、その逆もできません。

32 ビットと 64 ビットのデバッガ間の関係

mdb は 32 ビットと 64 ビットの両方のプログラムのデバッグをサポートします。ターゲットのプログラムを調査して、そのデータモデルを決定したあと、mdb は必要に応じて自動的に、ターゲットと同じデータモデルを持つ mdb バイナリを実行し直します。このアプローチによって、読み込まれたモジュールがプライマリターゲットと同じデータモデルを使用するので、デバッガモジュールを作成するタスクが簡単になります。64 ビットのターゲットプログラムをデバッグできるのは 64 ビットのデバッガだけです。64 ビットのデバッガを使用できるのは 64 ビットのオペレーティング環境が動作しているシステム上だけです。

64 ビットプロセスを exec する 32 ビットプロセスをデバッグする場合、またはその逆の場合、デバッガを実行し直す必要があることもあります。このような状況に対応する方法の詳細については、後述の「exec との対話」を参照してください。

exec との対話

制御されているプロセスが exec() または spawn() を正常に実行するとき、先述のように、デバッガの動作は ::set –o follow_exec_mode オプションで制御できます。デバッガと対象プロセスのデータモデルが同じ場合、exec のあとで、mdb が自動的にターゲットを継続するか、デバッガのプロンプトに戻るかは、stop モードか follow モードかによって決定されます。デバッガと対象プロセスのデータモデルが異なる場合、follow モードでは、mdb は自動的に mdb バイナリを適切なデータモデルで再度 exec して、プロセスに接続し直すので、exec から戻っても、プロセスは停止したままになります。このような再実行後、すべてのデバッガの状態が保存されるわけではありません。

32 ビットの対象プロセスが 64 ビットのプログラムを実行した場合、stop モードでは、コマンドプロンプトに戻りますが、この時点で 64 ビットデータモデルを使用しているので、対象プロセスを検査できません。デバッグを再開するには、::release –a dcmd を実行して、mdb を終了し、そして、mdb –p pid を実行して、64 ビットデバッガを対象プロセスに接続し直します。

64 ビットの対象プロセスが 32 ビットのプログラムを実行した場合、stop モードでは、コマンドプロンプトに戻りますが、新しいプロセスを検査する機能はかなり制限されます。組み込み dcmd はすべてマニュアルどおりに機能しますが、読み込み可能な dcmd は構造体のデータモデル変換を実行しないので、マニュアルどおりには機能しません。デバッグ機能を完全に復元するには、前述のように、デバッガを解放し、プロセスに接続し直す必要があります。

ジョブ制御との対話

ジョブ制御によって停止されている (つまり、SIGTSTPSIGTTIN、または SIGTTOU で停止されている) プロセスにデバッガが接続されている場合、継続用の dcmd で継続しようとしても、そのプロセスは再度「動作中 (running)」に設定できません。対象プロセスが同じセッションのメンバーである場合 (つまり、mdb と同じ制御端末を共用している場合)、mdb は関連するプロセスグループをフォアグラウンドに持ってきて、SIGCONT でプロセスを継続し、そのプロセスをジョブ制御の停止から再開しようとします。このようなプロセスから mdb を切断すると、mdb はそのプロセスグループをバックグラウンドに戻してから終了します。対象プロセスが同じセッションのメンバーでない場合、mdb はそのプロセスを安全にフォアグラウンドに持ってくることができないので、mdb はデバッガに関してはそのプロセスを継続しますが、そのプロセスはジョブ制御によって停止されているままになります。この場合、mdb は警告を出力するので、ユーザーは適切なシェルから fg コマンドを実行して、プロセスを再開する必要があります。

プロセスの接続と解放

mdb が動作中のプロセスに接続するとき、プロセスは停止し、継続用の dcmd の 1 つが適用されるまで、あるいは、デバッガが終了するまで停止したままになります。–p オプションでデバッガをプロセスに接続する前、あるいは、::attach または :A コマンドを発行する前に、–o nostop オプションを有効にしている場合、mdb はプロセスに接続しますが、プロセスを停止しません。プロセスが動作している間、(結果の整合性は失われるのにもかかわらず) プロセスは通常どおりに監視でき、ブレークポイントや追跡用のフラグも有効にできます。プロセスが動作している間に :c または ::cont dcmd を実行した場合、デバッガはプロセスが停止するまで待機します。どの追跡対象ソフトウェアイベントも発生しない場合、:c または ::cont のあと、割り込み文字 (通常は ^C) を入力すると、プロセスを強制的に停止し、デバッガに制御を戻すことができます。

:R::release:r::run$q、または ::quit dcmd を実行した場合、あるいは、EOF またはシグナルなどの結果としてデバッガが終了した場合、mdb は現在動作中のプロセスを (もしあれば) 解放します。プロセスが本来デバッガで :r または ::run を使用して作成されていた場合、そのプロセスは解放されると、SIGKILL が送信された場合と同じように強制的に終了されます。プロセスが mdb に接続される前にすでに動作していた場合、そのプロセスは解放されると、もう一度「動作中 (running)」に設定されます。プロセスを解放して停止および放棄したままにするには、::release –a オプションを使用します。

シンボルデバッグ情報

::list::offsetof::print、および ::sizeof dcmd では、1 つ以上のロードオブジェクトに mdb での使用に適した圧縮シンボルデバッグ情報が含まれている必要があります。現時点ではこの情報を利用できるのは、特定の Solaris カーネルモジュールだけです。

開発者向けの情報

Oracle Solaris Modular Debugger Guideには、mdb の機能に関する詳細な説明、およびデバッガモジュールの開発者向け情報が記載されています。

ヘッダーファイル <sys/mdb_modapi.h> には MDB モジュール API にある関数のプロトタイプが含まれており、/source/demo/mdb-examples パッケージにはディレクトリ /usr/demo/mdb にあるサンプルモジュールのソースコードが含まれています。