dbx コマンドによるデバッグ ホーム目次前ページへ次ページへ索引


第 1 章

dbx の起動

dbx は、対話型でソースレベルの、コマンド行ベースのデバッグツールです。このツールを使用することにより、制御された方法でプログラムを実行し、停止したプログラムの状態を調べることができます。dbx は、パフォーマンスデータのコレクションを含む、プログラムの動的な実行を完全に制御することができます。

この章の内容は次のとおりです。

デバッグセッションを開始する

dbx の起動方法は、デバッグの対象、現在の作業ディレクトリ、dbx で必要な実行内容、dbx の習熟度、および dbx 環境変数を設定したかどうかによって異なります。

dbx セッションを開始する最も簡単な方法は、dbx コマンドをシェルプロンプトで入力する方法です。

$ dbx

シェルから dbx を起動し、デバッグするプログラムを読み込むには、次のように入力します。

$ dbx program_name

dbx コマンドおよび起動オプションについての詳細は、Sun WorkShopTM オンラインヘルプ、および dbx(1) マニュアルページの「dbx コマンドの使い方」の「dbx コマンド」および「dbx の起動」を参照してください。

Sun WorkShop の「デバッグ」ウィンドウを使用してプログラムのデバッグを開始すると、dbx は自動的に起動します (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「現在のプログラムのデバッグ」および「新しいプログラムのデバッグ」を参照してください)。

既存のコアファイルのデバッグ

コアダンプしたプログラムが共有ライブラリと動的にリンクしている場合、それが作成された同じオペレーティング環境でコアファイルをデバッグすることが重要です。

コアファイルをデバッグするには、次のように入力します。

$ dbx program_name core

プログラムがコアをダンプしたときにどこで実行されていたかを確認するには、where コマンドを使用してください。

コアファイルをデバッグする場合、変数と式を評価して、プログラムがクラッシュした時点での値を確認することもできますが、関数呼び出しを行なった式を評価することはできません。

詳細については、Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「コアファイルのデバッグ」を参照してください。

プロセス ID の使用

動作中のプロセスを dbx に接続できます。dbx コマンドに引数としてプロセス ID (pid) を指定します。

$ dbx your_program_name process_ID

プログラムの名前を知らなくても、その ID 番号を使用してプロセスに接続できます。

$ dbx - process_ID

この場合、dbx はプログラムの名前を認識できないため、run のようなコマンドの中でそのプロセスに引数を渡すことはできません。

Sun WorkShop「デバッグ」ウィンドウの実行中のプロセスに dbx を接続するには、「デバッグ」 「プロセスを接続」を選択します。詳細については、Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「実行中のプロセスへの接続」を参照してください。

dbx 起動時シーケンス

呼び出されると、dbx は、ディレクトリ install-directory/SUNWspro/lib (デフォルトの install-directory/opt) で、インストール時の起動ファイルである.dbxrc を検索して読み込みます。

次に dbx は、現在のディレクトリ、そして $HOME で、起動ファイル .dbxrc を検索します。このファイルが見つからない場合は、現在のディレクトリ、そして $HOME で、起動ファイル .dbxinit を検索します。

一般に .dbxrc.dbxinit ファイルのコンテンツは、1 つの大きな違いを除いて同じです。.dbxinit ファイルでは、alias コマンドは dalias として定義され、通常のデフォルト (Korn シェルに対する alias コマンド、kalias) ではありません。-s コマンド行オプションを使用することにより、異なる起動ファイルを明示的に指定することができます。詳細については、「.dbxrc ファイルの使用」および Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「.dbxrc ファイルの作成」を参照してください。

起動ファイルには、任意の dbx コマンドが含まれ、一般に aliasdbxenvpathmap、および Korn シェル関数定義が含まれます。ただし、特定のコマンドは、プログラムがロードされていること、またはプロセスが接続されていることを要求します。すべての起動ファイルは、プログラムまたはプロセスがロードされる前にロードされます。さらに起動ファイルは、source または . (ピリオド) コマンドを使用することにより、その他のファイルのソースとなることもできます。起動ファイルを使用して、他の dbx オプションを設定することもできます。

dbx がプログラム情報をロードすると、Reading filename など一連のメッセージを印刷します。

プログラムがローディングを終了すると、dbx はレディ状態となり、プログラム (C、C++、Fortan 95 については、main()、FORTRAN 77 については、 MAIN()) の「main」ブロックを表示します。一般に、ブレークポイントを設定し、C プログラムに対し、stop in mainrun などの run コマンドを実行します。

起動属性の設定

pathmapdbxenvalias コマンドを使用して、dbx セッションに対する起動プロパティを設定することができます。

pathmap コマンドによるマッピング

デフォルトでは、dbx はプログラムがコンパイルされたディレクトリに、デバッグ中のプログラムに関連するソースファイルがないかを探します。ソースファイルまたはオブジェクトファイルがそのディレクトリにないか、または使用中のマシンが同じパス名を使用していない場合は、dbx にその場所を知らせる必要があります。

ソースファイルまたはオブジェクトファイルを移動した場合は、その新しい位置を検索パスに追加できます。pathmap コマンドは、ファイルシステムの現在のディレクトリと実行可能イメージ内の名前とのマッピングを作成します。このマッピングは、ソースパスとオブジェクトファイルパスに適用されます。

一般的なパスマップは、各自の .dbxrc ファイルに追加する必要があります。

ディレクトリ from から ディレクトリ to への新しいマッピングを確立するには、次のように入力します。

(dbx) pathmap [ -c ] from to

-c を使用すると、マッピングは現在の作業ディレクトリにも適用されます。

pathmap コマンドは、ホストによってベースパスの異なる、自動マウントされた明示的な NFS マウントファイルシステムを扱う場合にも役立ちます。現在の作業ディレクトリが自動マウントされたファイルシステムで不正確なオートマウンタが原因で起こる問題を解決する場合は、-c を使用してください。

/tmp_mnt/ のマッピングはデフォルトで存在します。

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」 の「pathmap コマンド」を参照してください。

dbxenv コマンドによる環境変数の設定

dbxenv コマンドを使用すると、dbx カスタマイズ変数を表示または設定できます。dbxenv の値は、各自の .dbxrc ファイルに入れることによってカスタマイズします。変数を表示するには、次のように入力します。

$ dbxenv

dbx 環境変数は設定することもできます。これらの変数の設定方法について詳しくは、15ページ第 2 章「dbx のカスタマイズ」を参照してください。

詳細については、「dbxenv コマンドでの dbx 環境変数の設定」および Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「dbxenv コマンド」を参照してください。

alias コマンドを使用してユーザー自身の dbx コマンドを作成

kalias または dalias コマンドを使用して、ユーザー自身の dbx コマンドを作成することができます。詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「kalias コマンド」および「dalias コマンド」を参照してください。

大域変数を出力し、正規として割り当てることができます。ただし、最終的なメモリーへのレジスタ保存が発生していない場合、それらの変数は正確でない値をとる場合があります。

関数の最初で停止すると、パラメータのみ出力されます。パラメータレジスタは、コンパイラで再使用できるためです。スタック変数の値は、最適化プログラムでは印刷したり、操作することができません。これらの変数のスタックおよびレジスタ位置は、記録されないためです。

プログラムのパフォーマンス解析』マニュアルには、コンパイラの最適化についての情報が詳しく記載されており、最適化プログラムで Sun WorkShop ツールを使用する場合に役立つでしょう。

デバッグのため、プログラムをコンパイル

プログラムを -g または -g0 オプションでコンパイルし、dbx でデバッグする準備をする必要があります。

-g オプションは、コンパイル時にデバッグ情報を生成するよう、コンパイラに指示します。

たとえば、C++ を使用してコンパイルするには、次のように入力します。

% CC -g example_source.cc

C++ では、-g オプションは、デバッグをオンにし、関数のインライン化をオフにします。-g0 (ゼロ) オプションは、デバッグをオンにし、関数のインライン化には影響を与えません。-g0 オプションでインライン関数をデバッグすることはできません。-g0 オプションは、リンクタイムおよび dbx の起動時間を大幅に削減します (プログラムによるインライン関数の使用に依存します)。

dbx で使用するため、最適化コードをコンパイルするには、-O (大文字 O) と -g オプションの両方でソースコードをコンパイルします。

最適化コードのデバッグ

dbx ツールは、最適化コードのデバッグを部分的にサポートしています。サポートの範囲は、プログラムのコンパイル方法によって大幅に異なります。

最適化コードを分析する場合、次のことができます。

ただし、最適化コードでは、dbx は次のことを行うことができません。

最適化によりプログラムがコンパイルされ、同時に (-O -g オプションを使用して) デバッグが有効になると、dbx は制限されたモードで操作します。

ソース行についての情報が提供されます。ただし最適化プログラムについては、1 つのソース行に対するコードが複数の異なる場所で表示される場合があります。そのため、ソース行ごとにプログラムをステップすると、オプティマイザによってどのようにコードがスケジュールされたかに依存して、ソースファイルの周りで現在の行のジャンプが発生します。

末尾呼び出しを最適化すると、関数の最後の有効な操作が別の関数への呼び出しである場合、スタックフレームがなくなります。

一般に、パラメータ、局所、大域についてのシンボリック情報は、最適化プログラムに対して提供されます。構造体、共用体、C++ クラスに関する型情報、および局所、大域、パラメータの型と名前が提供されます。プログラムでのこれらの項目の位置に関する完全な情報は、最適化プログラムについては提供されません。

-g オプションを使用しないでコンパイルされたコード

ほとんどのデバッグサポートでは、プログラムを -g でコンパイルすることを要求していますが、dbx では、-g を使用しないでコンパイルされたコードに対し、次のレベルのサポートを提供しています。

ただし、dbx では、-g オプションでコンパイルされたコードを除いては、ソースコードを表示できません。これは、strip -x が適用されたコードについてもあてはまります。

dbx を完全にサポートするために -g オプションを必要とする共有ライブラリ

完全なサポートを提供するためには、共有ライブラリも -g オプションを使用してコンパイルする必要があります。-g によってコンパイルされていない共有ライブラリモジュールをいくつか使用してプログラムを作成した場合でも、そのプログラムをデバッグすることはできます。ただし、これらのライブラリモジュールに関する情報が生成されていないため、dbx の機能を完全に使用することはできません。

完全にストリップされたプログラム

dbx は、完全にストリップされた (制御データなどが取り除かれた) プログラムをデバッグすることができます。これらのプログラムには、プログラムをデバッグするために使用できる情報がいくつか含まれますが、外部から識別できる関数しか使用できません。実行時検査は、ストリップされたプログラムまたはロードオブジェクトに対しては、動作しません。

デバッグセッションを終了する

dbx の起動から終了までが 1 つの dbx セッションになります。1 つの dbx セッション中に、任意の数のプログラムを連続してデバッグできます。

dbx セッションを終了するには、dbx プロンプトで quit と入力します。

(dbx) quit

起動時にプロセス ID オプションを使用してデバッガを動作中のプロセスに接続した場合、デバッグセッションを終了しても、そのプロセスは終了しないで動作を続けます。すなわち、dbx はセッションを終了する前に自動的に detach コマンドを実行します。

プロセス実行の停止

Ctrl + C を使用すると、dbx を終了しないでいつでもプロセスの実行を停止できます。

dbx からのプロセスの切り離し

dbx をあるプロセスに接続した場合、detach コマンドを使用すると、そのプロセスおよび dbx セッションを終了せずに、そのプロセスを dbx から切り離すことができます。

プロセスを終了せずに dbx から切り離すには、次のように入力します。

(dbx) detach

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「detach コマンド」を参照してください。

セッションを終了せずにプログラムを終了する

dbx kill コマンドは、プロセスを終了するとともに、現在のプロセスのデバッグも終了します。ただし、kill コマンドは、dbx セッション自体を維持したまま、dbx で別のプログラムをデバッグできる状態にします。

プログラムを終了すると、dbx を終了しないで、デバッグ中のプログラムの残りを除去することができます。

dbx で実行中のプログラムを終了するには、次のように入力します。

(dbx) kill

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「kill コマンド」を参照してください。

デバッグ実行の保存と復元

dbx には、デバッグ実行の全部または一部を保存して、それを後で再現するためのコマンドが 3 つあります。

save コマンドの使用

save コマンドは、直前に実行された runrerun、または debug コマンドから save コマンドまでに発行されたデバッグコマンドをすべてファイルに保存します。このデバッグセッションのセグメントは、デバッグ実行と呼ばれます。

save コマンドは、発行されたデバッグコマンドのリスト以外のものも保存します。実行開始時のプログラムの状態に関するデバッグ情報、つまり、ブレークポイント、表示リストなども保存されます。保存された実行を復元するとき、dbx は、保存ファイル内にあるこれらの情報を使用します。

デバッグ実行の一部、つまり、入力されたコマンドのうち指定する数だけ最後から除いたものを保存することもできます。次の例 A は、すべて保存された実行を示しています。例 B は、保存された同じ実行から、最後の 2 ステップを除いたものを示しています。

例 A:すべての実行の保存 例 B:実行の保存から最後の 2 ステップを除く
debug debug
stop at line stop at line
run run
next next
next next
stop at line stop at line
continue continue
next next
next next
step step
next next
save save-2


保存する実行の終了位置がわからない場合は、history コマンドを使用して、セッション開始以降に発行されたデバッグコマンドのリストを確認してください。


注 - デフォルトにより、save コマンドは特別な保存ファイルへ情報を書き込みます。デバッグ実行を後に復元可能なファイルへ保存する場合は、save コマンドでファイル名を指定することができます。「一連のデバッグ実行をチェックポイントとして保存する」を参照してください。

save コマンドまでのデバッグ実行すべてを保存するには、次のように入力します。

(dbx) save

デバッグ実行の一部を保存するには、save number コマンドを使用します。number は、save コマンドの直前の、保存しないコマンドの数を示します。

(dbx) save -number

一連のデバッグ実行をチェックポイントとして保存する

ファイル名を指定しないでデバッグ実行を保存すると、情報は特殊な保存ファイルに書き込まれます。保存のたびに、dbx はこの保存ファイルを上書きします。しかし、ファイル名引数を save コマンドに指定すると、あるデバッグ実行をこのファイル名に保存後別のデバッグ実行を保存しても、前の内容を復元することができます。

一連の実行を保存すると、1 組のチェックポイントが与えられます。各チェックポイントは、セッションのさらに後から始まります。保存されたこれらの実行は任意に復元して続行し、さらに、以前の実行で保存されたプログラム位置と状態に dbx をリセットすることができます。

デバッグ実行を、デフォルトの保存ファイル以外のファイルに保存するには、次のように入力します。

(dbx) save filename

保存された実行の復元

実行を保存したら、restore コマンドを使用して実行を復元できます。dbx は、保存ファイル内の情報を使用します。実行を復元すると、dbx は、まず内部状態をその実行の開始時の状態にリセットしてから、保存された実行内の各デバッグコマンドを再発行します。


注 - source コマンドは、ファイル内に保存された一連のコマンドを再発行しますが、dbx の状態をリセットはしません。これは、現在のプログラム位置からコマンドの一覧を再発行するだけです。

保存された実行の正確な復元に必要な条件

保存されたデバッグ実行を正確に復元するには、run タイプコマンドへの引数、手動入力、およびファイル入力などの、実行での入力すべてが正確に同じでなければなりません。


注 - セグメントを保存してから、restore を実行する前に runrerun、または debug コマンドを発行すると、restore は 2 番目の引数を使用して、runrerun、または debug コマンドを後で保存します。これらの引数が異なる場合、正確な復元が得られない可能性があります。

保存されたデバッグ実行を復元するには、次のように入力します。

 (dbx) restore

デフォルトの保存ファイル以外のファイルに保存されたデバッグ実行を復元するには、次のように入力します。

(dbx) restore filename

replay を使用した保存と復元

replay コマンドは組合せのコマンドで、save -1 に続けて restore を発行するのと同じです。replay コマンドは負の number_of_commands 引数をとります。これは、コマンドの save 部分に渡されるものです。デフォルトにより、-number の値は -1 になるため、replay は取り消しコマンドとして働き、直前に発行されたコマンドにいたるまで (ただしこのコマンドは除く) の前回の実行を復元します。

現在のデバッグ実行から、最後に発行されたデバッグコマンドを除くものを再現するには、次のように入力します。

(dbx) replay

現在のデバッグ実行を再現して、最後から 2 番目のコマンド以前で実行を停止するには、dbxreplay コマンドを使用します。ここで、number は、最後のデバッグコマンドから数えていくつ目のコマンドで停止するかその数を示します。

(dbx) replay -number


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引