この章では、dbx デバッグセッションを起動、実行、保存、復元、および終了する方法について説明します。
この章の内容は次のとおりです。
dbx の起動方法は、デバッグの対象、現在の作業ディレクトリ、dbx で必要な実行内容、dbx の習熟度、および dbx 環境変数を設定したかどうかによって異なります。
dbx セッションを開始する最も簡単な方法は、dbx コマンドをシェルプロンプトで入力する方法です。
$ dbx
シェルから dbx を起動し、デバッグするプログラムを読み込むには、次のように入力します。
$ dbx program_name
呼び出し時に、dbx は、ディレクトリ install-directory/lib にある インストール初期化ファイル dbxrc を探して読み取ります。
次に、dbx は、カレントディレクトリ内、さらに $HOME 内の初期化ファイル .dbxrc を検索します。このファイルが見つからないと、カレントディレクトリ、さらに $HOME 内の初期化ファイル .dbxinit を検索します。通常、.dbxrc と .dbxinit ファイルの内容は、1 つの例外を除けば同じです。.dbxinit ファイルにおいて、alias コマンドは、通常のデフォルト値である kalias ではなく dalias と定義されています。-s コマンド行オプションを使用すると、異なる初期化ファイルを明示的に指定することができます。
初期化ファイルは、どのような dbx コマンドでも含むことができます。一般には、alias、dbxenv、pathmap、および Korn シェル機能定義が含まれます。ただし、プログラムが読み込まれているか、またはプロセスが接続されていなければならないコマンドがいくつかあります。初期化ファイルはすべて、プログラムまたはプロセスが読み込まれる以前に読み込まれています。初期化ファイルは、source コマンドまたは . (ピリオド) コマンドを使用してほかのファイルをソースにすることもできます。初期化ファイルは、ほかの dbx オプションを設定するためにも使用されます。
dbx がプログラム情報を読み込む際、「...のシンボル情報を読んでいます」などの一連のメッセージが表示されます。
プログラムの読み込みが終了すると、dbx は準備完了状態になり、プログラムの「メイン」ブロックを表示します (C、C++、または Fortran 90 の場合は main()、FORTRAN 77 の場合は MAIN())。通常は、ブレークポイント (C プログラムであれば stop in main ) を設定してから実行コマンド (run) を発行する必要があります。
デフォルトにより、-xs でコンパイルされたモジュールのデバッグ情報は、.o ファイルに保存されたデバッグ情報と同様に遅延して読み込まれます。dbx の環境変数 delay_xs を使用すると、この読み込み遅延機能をオフにして、デバッグ情報を dbx の起動時に読み込むことができます。「.o ファイルが存在しない場合のデバッグ」を参照してください。
core という名前のファイルが dbx を起動するディレクトリに存在する場合、このファイルはデフォルトでは読み取られません。コアファイルは明示的に指定する必要があります。プログラムがコアをダンプしたときにどこで実行されていたかを確認するには、where コマンドを使用してください。
$ dbx program_name core
コアファイルをデバッグする場合は、変数と式を評価して、プログラムがクラッシュした時点でのその値を確認することもできますが、関数呼び出しを行った式を評価することはできません。
動作中のプロセスを dbx に接続できます。dbx コマンドに引数としてプロセス ID (pid) を指定します。
$ dbx your_program_name pid
プログラムの名前を知らなくても、その ID 番号を使用してプロセスに接続できます。
$ dbx - pid
この場合、dbx はプログラムの名前を認識できないため、run のようなコマンドの中でそのプロセスに引数を渡すことはできません。
デフォルトでは、dbx はプログラムがコンパイルされたディレクトリに、デバッグ中のプログラムに関連するソースファイルがないかを探します。ソースファイルまたはオブジェクトファイルがそのディレクトリにないか、または使用中のマシンが同じパス名を使用していない場合は、dbx にその場所を知らせる必要があります。
ソースファイルまたはオブジェクトファイルを移動した場合は、その新しい位置を検索パスに追加できます。pathmap コマンドは、ファイルシステムの現在のディレクトリと実行可能イメージ内の名前とのマッピングを作成します。このマッピングは、ソースパスとオブジェクトファイルパスに適用されます。
一般的なパスマップは、各自の .dbxrc ファイルに追加する必要があります。
ディレクトリ from から ディレクトリ to への新しいマッピングを確立するには、次のように入力します。
(dbx) pathmap [ -c ] from to
-c を使用すると、マッピングは現在の作業ディレクトリにも適用されます。
pathmap コマンドは、ホストによってベースパスの異なる、自動マウントされた明示的な NFS マウントファイルシステムを扱う場合にも役立ちます。現在の作業ディレクトリが自動マウントされたファイルシステムで不正確なオートマウンタが原因で起こる問題を解決する場合は、-c を使用してください。
/tmp_mnt と / のマッピングはデフォルトで存在します。
dbxenv コマンドを使用すると、dbx カスタマイズ変数を表示または設定できます。dbxenv の値は、各自の .dbxrc ファイルに入れることによってカスタマイズします。変数を表示するには、次のように入力します。
dbxenv
dbx 環境変数は設定することもできます。これらの変数の設定方法について詳しくは、第 2 章「dbx のカスタマイズ」を参照してください。
kalias または dalias コマンドを使用して、独自の dbx コマンドを作成することができます。
dbx は、最適化コードのデバッグを部分的にサポートしています。サポートの範囲は、プログラムのコンパイル方法によって大幅に異なります。
最適化コードを分析する場合、次のことが可能です。
関数起動時に実行を停止する (stop in function コマンド)
引数を評価、表示、または変更する
大域変数または静的変数を評価、表示、または変更する
ただし、最適化コードでは、dbx は次のことを行うことができません。
ある行から別の行へステップ実行する (next または step コマンド)
局所変数を評価、表示、または変更する
dbx を効率的に使用するには、プログラムを -g または -g0 オプションによってコンパイルする必要があります。-g オプションは、コンパイラに対して、コンパイル中にデバッグ情報を生成するよう指示します。
たとえば、C++ を使用してコンパイルするには、次のように入力します。
% CC -g example_source.cc
最適化コードを使用して dbx で使用するには、ソースコードを -O (大文字の O) と -g オプションの両方によってコンパイルしてください。
C++ では、-g はデバッグをオンにし、関数のインライン化をオフにします。-g0 (ゼロ) オプションはデバッグをオンにしますが、関数のインライン化には影響を与えません。-g0 オプションによってインライン関数をデバッグすることはできません。 -g0 オプションは、リンク時間と dbx 起動時間を大幅に削減します。これらの時間はプログラムによるインライン関数の使用により異なります。
ほとんどのデバッガの機能を使用するにはプログラムを -g によってコンパイルする必要があるのに対し、dbx では -g を使用しないでコンパイルされたコードに対して、次のレベルのサポートを提供しています。
バックトレース (dbx where コマンド)
関数の呼び出し (ただしパラメータチェックなし)
大域変数のチェック
ただし、dbx では、-g オプションを使用してコンパイルされたソースコード以外を表示できないことに注意してください。これは、strip -x が適用されたコードについてもあてはまります。
完全なサポートを提供するためには、共有ライブラリも -g オプションを使用してコンパイルする必要があります。-g によってコンパイルされていない共有ライブラリモジュールをいくつか使用してプログラムを作成した場合でも、そのプログラムをデバッグすることはできます。ただし、これらのライブラリモジュールに関する情報が生成されていないため、dbx の機能を完全に使用することはできません。
dbx は、完全にストリップされた (制御データなどが取り除かれた) プログラムをデバッグすることができます。これらのプログラムには、プログラムをデバッグするために使用できる情報がいくつか含まれますが、外部から識別できる関数しか使用できません。実行時検査は、ストリップされたプログラムまたはロードオブジェクトに対しては、動作しません。
dbx の起動から終了までが 1 つの dbx セッションになります。1 つの dbx セッション中に、任意の数のプログラムを連続してデバッグできます。
dbx セッションを終了するには、dbx プロンプトで quit と入力します。
(dbx) quit
起動時にプロセス ID オプションを使用してデバッガを動作中のプロセスに接続した場合、デバッグセッションを終了しても、そのプロセスは終了しないで動作を続けます。すなわち、dbx はセッションを終了する前に自動的に detach コマンドを実行します。
Ctrl + C を使用すると、dbx を終了しないでいつでもプロセスの実行を停止できます。
dbx をあるプロセスに接続した場合、detach コマンドを使用すると、そのプロセスおよび dbx セッションを終了せずに、そのプロセスを dbx から切り離すことができます。
プロセスを終了せずに dbx から切り離すには、次のように入力します。
(dbx) detach
dbx の kill コマンドは、プロセスを終了するとともに、現在のプロセスのデバッグも終了します。ただし、kill コマンドは、dbx セッション自体を維持したまま、dbx で別のプログラムをデバッグできる状態にします。
プログラムを終了すると、dbx を終了しないで、デバッグ中のプログラムの残りを除去することができます。
dbx で実行中のプログラムを終了するには、次のように入力します。
(dbx) kill
dbx には、デバッグ実行の全部または一部を保存して、それを後で再現するためのコマンドが 3 つあります。
save [-number] [filename]
restore [filename]
replay [-number]
save コマンドは、直前に実行された run、rerun、または debug コマンドから save コマンドまでに発行されたデバッグコマンドをすべてファイルに保存します。このデバッグセッションのセグメントは、デバッグ実行と呼ばれます。
save コマンドは、発行されたデバッグコマンドのリスト以外のものも保存します。実行開始時のプログラムの状態に関するデバッグ情報、つまり、ブレークポイント、表示リストなども保存されます。保存された実行を復元するとき、dbx は、保存ファイル内にあるこれらの情報を使用します。
デバッグ実行の一部、つまり、入力されたコマンドのうち指定する数だけ最後から除いたものを保存することもできます。次の例 A は、すべて保存された実行を示しています。例 B は、保存された同じ実行から、最後の 2 ステップを除いたものを示しています。
保存する実行の終了位置がわからない場合は、history コマンドを使用して、セッション開始以降に発行されたデバッグコマンドのリストを確認してください。
save コマンドまでのデバッグ実行すべてを保存するには、次のように入力します。
(dbx) save
(dbx) save -number
number は、save コマンドの直前の、保存したくないコマンドの数を示します。
ファイル名を指定しないでデバッグ実行を保存すると、情報は特殊な保存ファイルに書き込まれます。保存のたびに、dbx はこの保存ファイルを上書きします。しかし、ファイル名引数を save コマンドに指定すると、あるデバッグ実行をこのファイル名に保存後別のデバッグ実行を保存しても、前の内容を復元することができます。
一連の実行を保存すると、1 組のチェックポイントが与えられます。各チェックポイントは、セッションのさらに後から始まります。保存されたこれらの実行は任意に復元して続行し、さらに、以前の実行で保存されたプログラム位置と状態に dbx をリセットすることができます。
デバッグ実行を、デフォルトの保存ファイル以外のファイルに保存するには、次のように入力します。
(dbx) save filename
実行を保存したら、restore コマンドを使用して実行を復元できます。dbx は、保存ファイル内の情報を使用します。実行を復元すると、dbx は、まず内部状態をその実行の開始時の状態にリセットしてから、保存された実行内の各デバッグコマンドを再発行します。
source コマンドは、ファイル内に保存された一連のコマンドを再発行しますが、dbx の状態をリセットはしません。これは、現在のプログラム位置からコマンドの一覧を再発行するだけです。
保存されたデバッグ実行を正確に復元するには、run タイプコマンドへの引数、手動入力、およびファイル入力などの、実行での入力すべてが正確に同じでなければなりません。
セグメントを保存してから、restore を実行する前に run、rerun、または debug コマンドを発行すると、restore は 2 番目の引数を使用して、run、rerun、または debug コマンドを後で保存します。これらの引数が異なる場合、正確な復元が得られない可能性があります。
保存されたデバッグ実行を復元するには、次のように入力します。
(dbx) restore
デフォルトの保存ファイル以外のファイルに保存されたデバッグ実行を復元するには、次のように入力します。
(dbx) restore filename
replay コマンドは組合せのコマンドで、save -1 に続けて restore を発行するのと同じです。replay コマンドは負の number_of_commands 引数をとります。これは、コマンドの save 部分に渡されるものです。デフォルトにより、-number の値は -1 になるため、replay は取り消しコマンドとして働き、直前に発行されたコマンドにいたるまで (ただしこのコマンドは除く) の前回の実行を復元します。
現在のデバッグ実行から、最後に発行されたデバッグコマンドを除くものを再現するには、次のように入力します。
(dbx) replay
現在のデバッグ実行を再現して、最後から 2 番目のコマンド以前で実行を停止するには、dbx の replay コマンドを使用します。ここで、number は、最後のデバッグコマンドから数えていくつ目のコマンドで停止するかその数を示します。
(dbx) replay -number
$ dbx [- options] [program name [corefile | process id]]
-c cmds |
プログラムを読み込んでから、プロンプトを表示するまでに、cmds を実行します。 |
-C |
実行時検査ライブラリを事前に読み込みます。 |
-d |
-s とともに使用されて、読み取り後にファイルを除去します。 |
-f |
コアファイルが一致していないように見える場合でも、それを強制的に読み込みます。 |
-F |
Cfront 復号化を可能にします。 |
-h |
dbx の使用法を表示します。 |
-I dir |
dir を設定された pathmap に追加します。 |
-k |
キーボードトランスレーションの状態を保存して復元します。 |
-q |
スタブ読み取りに関するメッセージを抑止します。 |
-r |
プログラムを実行します。プログラムが正常に終了したら、dbx を終了します。 |
-R |
dbx の README ファイルを出力します。 |
-s file |
.dbxrc や dbxinit の代わりに file を初期化ファイルとして使用します。 |
-S |
標準の初期化ファイルの読み取りを抑止します。 |
-V |
dbx のバージョンを出力します。 |
-w n |
where コマンド上の n フレームをスキップします。 |
-- |
オプションリストの最後をマークします。プログラム名がダッシュで始まる場合に使用します。 |