dbx コマンドによるデバッグ

第 13 章 子プロセスのデバッグ

この章では、子プロセスのデバッグ方法を説明します。dbx は、fork(2) および exec(2) を介して子を作成するプロセスのデバッグに役立つ機能をいくつか備えています。

この章は次の各節から構成されています。

単純な接続の方法

子プロセスがすでに作成されている場合は、次のいずれかの方法でそのプロセスに接続できます。

dbx 起動時、シェルから次のように入力します。


$ dbx progname pid

コマンド行からは次のように入力します。


(dbx) debug progname pid

どちらの場合も progname を "-" に置き換えることができます。そうすると、dbx は指定されたプロセス ID (pid) に対応する実行可能ファイルを自動的に見つけ出します。 "-" を使用すると、それ以後 run および rerun は機能しません。これは、dbx が実行可能ファイルの絶対パス名を知らないためです。

exec 後のプロセス追跡

子プロセスが新しいプログラムを実行 (exec(2)) すると、そのプロセス ID は変わりませんが、プロセスイメージは変化します。dbxexec() を自動的に検知し、新しく実行されたプログラムを自動的に再読み込みします。

実行可能ファイルの元の名前は、$oprog に保存されます。この名前に復帰するには、debug $oprog を使用します。

fork 後のプロセス追跡

子プロセスが fork(2) を実行すると、プロセス ID は変わりますが、プロセスイメージは変化しません。dbx の動作は、dbxenv 変数 follow_fork_mode の設定値に従って次のように異なります。

parent (親プロセス)

従来の動作です。dbx は fork を無視し、親プロセスを追跡します。

child (子プロセス)

このモードでは、dbx は新しい pid を使用して、フォークされた子に接続します。元の親は切り離され、それ以上意識されません。

both (両方)

このモードは、Sun WorkShop から dbx を使用する場合しか利用できません。

ask (質問)

dbx が fork を検出するたびにプロンプトが表示され、parent、child、both のどのモードを使用するか問い合わせてきます。stop を選択すると、プログラムの状態を調べてから、cont を使用して実行を続けることができます。この場合は、再度方法を選択するよう要求されます。

イベントとの対話

ブレークポイントなどのイベントはすべて、exec() または fork() プロセスでは削除されます。dbxenv 変数 follow_fork_inheriton に設定して後のフォークの削除を無効にすることも、-perm eventspec 修飾子を使用してそれらを永続にすることもできます。イベント仕様修飾子の使用方法の詳細については、第 6 章「イベント管理」を参照してください。