この章では、子プロセスのデバッグ方法について説明します。dbx は、fork (2) および exec (2) を介して子を作成するプロセスのデバッグに役立つ機能をいくつか備えています。
この章の内容は次のとおりです。
子プロセスがすでに作成されている場合は、次のいずれかの方法でそのプロセスに接続できます。
dbx 起動時、シェルから次のように入力します。
$ dbx program_name process_id |
dbx コマンド行からは次のように入力します。
(dbx) debug program_name process_id |
どちらの場合も program_name を "-" (マイナス記号) に置き換えることができます。そうすると dbx は指定されたプロセス ID (process_id) に対応する実行可能ファイルを自動的に見つけ出します。- を使用すると、それ以後 run コマンドおよび rerun コマンドは機能しません。これは、dbx が実行可能ファイルの絶対パス名を知らないためです。
さらに、Oracle Solaris Studio IDE (IDE オンラインヘルプの「デバッガを実行中のプロセスに接続する」を参照) または dbxtool (dbxtool オンラインヘルプの「dbxtool を実行中のプロセスに接続する」を参照) において、実行中の子プロセスに接続することもできます。
子プロセスが新しいプログラムを exec(2) 関数を用いて実行すると、そのプロセス ID は変わりませんが、プロセスイメージは変化します。dbx は exec() の呼び出しを自動的に検知し、新しく実行されたプログラムを自動的に再読み込みします。
実行可能ファイルの元の名前は、$oprog に保存されます。この名前に復帰するには、debug $oprog を使用します。
子プロセスが、関数 vfork(2)、fork1(2)、または fork(2) を呼び出すと、プロセス ID が変化しますが、プロセスイメージは変化しません。dbx 環境変数 follow_fork_mode の設定値に従って、dbx は次のいずれかの動作をします。
従来の動作です。dbx は fork を無視し、親プロセスを追跡します。
dbx は、新しいプロセス ID で、分岐先の子に自動的に切り替わります。元の親のすべての接続と認識が失われています。
このモードは、Oracle Solaris Studio IDE または dbxtool から dbx を使用する場合しか利用できません。
dbx が fork を検出するたびにプロンプトが表示され、parent、child、both、または stop to investigate のどれかを選択するように促されます。stop を選択すると、プログラムの状態を調べてから、cont と入力して実行を続けることができます。再びプロンプトに従って次の処理を選択します。both がサポートされるのは、Oracle Solaris Studio IDE および dbxtool においてのみです。
exec() 関数や fork() 関数では、ブレークポイントやほかのイベントが、すべて削除されます。しかし、dbx 環境変数で follow_fork_inherit を on に設定するか、-perm eventspec 修飾子でイベントを持続イベントにすれば、ブレークポイントやほかのイベントは削除されません。イベント仕様修飾子の使用方法の詳細については、「cont at コマンド」を参照してください。