Solaris モジューラデバッガ

第 6 章 実行制御

MDB は、動作中のプログラムの実行を制御および追跡する機能を提供します。動作中のプログラムには、ユーザーアプリケーションや、稼働中のオペレーティングシステムカーネルおよびデバイスドライバがあります。mdb コマンドを使用すると、すでに実行中のユーザープロセスを制御したり、デバッガの制御のもとで新しいプロセスを作成したりできます。また、kmdb をブートするか読み込んで、オペレーティングシステムカーネルそのものの実行を制御したり、デバイスドライバをデバッグしたりすることも可能です。この章では、ターゲットの実行を制御するために使用できる組み込み dcmd について説明します。これらのコマンドは、説明の中で言及している場合を除き、mdb または kmdb のどちらでも使用できます。kmdb の実行制御のみに関する詳細については、第 7 章「カーネル実行制御」を参照してください。

実行制御

MDB はシンプルな実行制御モデルを提供します。ターゲットプロセスを起動するには、::run を使用してデバッガ内から起動するか、:A::attach、または -p コマンド行オプション (第 5 章「組み込みコマンド」を参照) を使用して MDB を既存のプロセスに接続します。別の方法として、kmdb を使用してカーネルをブートしたり、kmdb を後で読み込んだりすることもできます。どちらの場合も、ユーザーは追跡対象「ソフトウェアイベント」のリストを指定できます。追跡対象イベントがターゲットプログラム内で発生するごとに、 ターゲット内のすべてのスレッドが停止して、そのイベントをトリガーしたスレッドが代表スレッドとして選択され、デバッガに制御が戻ります。ターゲットプログラムが「running (動作中)」と設定されると、ユーザー定義割り込み文字 (通常は Ctrl + C) を入力して、非同期的にデバッガに制御を戻すことができます。

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

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

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

実行制御組み込み dcmd (「組み込み dcmd」を参照) はいつでも利用できますが、実行制御がサポートされないターゲットに適用しようとすると、「このターゲットはサポートされません」というエラーメッセージが表示されます。

イベントコールバック

::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 カーネルターゲットは、対応する内部スレッド構造体の仮想アドレスを指定されたスレッドの識別子としてエクスポートします。このアドレスは、オペレーティングシステムのソースコード内の kthread_t データ構造体に対応しています。kmdb を使用しているときは、kmdb を実行している CPU の CPU 識別子が cpuid 変数に格納されます。

MDB プロセスターゲットは、ネイティブな lwp_* インタフェース、/usr/lib/libthread.so、または /usr/lib/libpthread.so を使用するマルチスレッド化されたユーザープロセスの検査に対する適切なサポートを提供します。動作中のユーザープロセスをデバッグするとき、MDB はシングルスレッド化されたプロセスが libthreaddlopen または close するかどうかを検出して、動作中のユーザープロセスのスレッド化モデルのビューを自動的に調整します。プロセスターゲットスレッド識別子は、アプリケーションが使用するスレッド化モデルに基づいて、代表スレッドの lwpid_tthread_t、または pthread_t に対応付けられます。

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

組み込み dcmd

[ addr ] ::bp [+/-dDestT] [-c cmd] [-n count] sym ...
addr :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 の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

function ::call [ arg ... ]

kmdb のみを使用している場合、オペレーティングシステムカーネルに定義されている、指定の function を呼び出します。function 式は、既知のいずれかのカーネルモジュールのシンボルテーブルに定義されている関数のアドレスと一致する必要があります。式の引数を指定すると、それらの引数は値によって渡されます。文字列引数を指定すると、それらの引数は参照によって渡されます。


注 –

::call コマンドは、十分に注意して使用する必要があり、本稼働システムには絶対に適用してはなりません。オペレーティングシステムカーネルは、指定された関数を実行するために実行を再開しません。したがって、呼び出されている関数は任意のカーネルサービスを決して利用してはならず、いかなる理由でもブロックしてはなりません。このコマンドを使用するときは、呼び出す関数の副作用を十分に認識している必要があります。


::cont [SIG]
:c [SIG]

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

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

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

::events [-av]
$b [-av]

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

> :
:
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 つまたは複数が表示されます。

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

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

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

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

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

HT

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

LM

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

Description

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

Action

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

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

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

-c

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

-n

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

::help evset を使用しても、この情報の要約を表示できます。

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

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

signal :i

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

$i

デバッガが無視して、ターゲットが直接処理するシグナルのリストを表示します。追跡対象シグナルについてのより詳細な情報を取得するには、::events dcmd を使用します。$i コマンドは、ユーザープロセスのデバッグにのみ適用されます。

::kill
:k

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

$l

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

$L

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

::next [SIG]
:e [SIG]

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

::run [args ... ]
:r [args ... ]

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

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

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

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

ターゲットプログラムを 1 命令だけ実行します。オプションのシグナルの名前または番号 (signal (3HEAD) のマニュアルページを参照) を引数として指定し、ターゲットがユーザープロセスである場合、このシグナルはターゲットの実行を再開するための一部として、すぐにターゲットに送られます。オプションの branch 引数を指定した場合、プロセッサの制御フローを分岐する次の命令が出されるまで、ターゲットプログラムは実行を継続します。::step branch 機能は、該当するプロセッサ固有の機能が有効になっている x86 システム上で kmdb を使用している場合にのみ利用できます。over 引数を指定した場合、::step はサブルーチンの呼び出しまで進めます。::step over 引数は ::next dcmd と同じです。オプションの out 引数を指定した場合、代表スレッドが現在の関数から戻ってくるまで、ターゲットプログラムは実行を継続します。どのターゲットプログラムも動作していない場合、::step over は、::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 で使用するのと同じです。::sysbp コマンドは、ユーザープロセスのデバッグにのみ適用されます。

addr [,len]::wp [+/-dDestT] [-rwx] [-ip] [-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 で使用するのと同じです。x86 システムで kmdb を使用している場合のみ、-i オプションを使って、ウォッチポイントが入出力ポートのアドレス上に設定されなくてはならないことを指定できます。kmdb のみを使用している場合は、-p オプションを使って、指定されたアドレスが物理アドレスとみなされるべきであることを指定できます。:a dcmd は、指定されたアドレスに読み取り権のウォッチポイントを設定します。:p dcmd は、指定されたアドレスに実行権のウォッチポイントを設定します。:w dcmd は、指定されたアドレスに書き込み権のウォッチポイントを設定します。:a:p、および :w dcmd の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

:z

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

exec との対話

制御されているユーザープロセスが exec(2) を正常に実行するとき、デバッガの動作は ::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 オプションを使用します。