| dbx コマンドによるデバッグ |      | 
第 1 章
dbxの起動
dbxは、対話型でソースレベルの、コマンド行ベースのデバッグツールです。このツールを使用することにより、制御された方法でプログラムを実行し、停止したプログラムの状態を調べることができます。dbxは、パフォーマンスデータのコレクションを含む、プログラムの動的な実行を完全に制御することができます。デバッグセッションを開始する
dbxの起動方法は、デバッグの対象、現在の作業ディレクトリ、dbxで必要な実行内容、dbxの習熟度、およびdbx環境変数を設定したかどうかによって異なります。
dbxセッションを開始する最も簡単な方法は、dbxコマンドをシェルプロンプトで入力する方法です。
$dbxシェルから
dbxを起動し、デバッグするプログラムを読み込むには、次のように入力します。
dbxprogram_name
dbxコマンドおよび起動オプションについての詳細は、Sun WorkShopTM オンラインヘルプ、およびdbx(1) マニュアルページの「dbx コマンドの使い方」の「dbx コマンド」および「dbx の起動」を参照してください。Sun WorkShop の「デバッグ」ウィンドウを使用してプログラムのデバッグを開始すると、
dbxは自動的に起動します (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「現在のプログラムのデバッグ」および「新しいプログラムのデバッグ」を参照してください)。既存のコアファイルのデバッグ
コアダンプしたプログラムが共有ライブラリと動的にリンクしている場合、それが作成された同じオペレーティング環境でコアファイルをデバッグすることが重要です。
$dbxprogram_namecoreプログラムがコアをダンプしたときにどこで実行されていたかを確認するには、
whereコマンドを使用してください。コアファイルをデバッグする場合、変数と式を評価して、プログラムがクラッシュした時点での値を確認することもできますが、関数呼び出しを行なった式を評価することはできません。
詳細については、Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「コアファイルのデバッグ」を参照してください。
プロセス ID の使用
動作中のプロセスを
dbxに接続できます。dbxコマンドに引数としてプロセス ID (pid) を指定します。
$dbxyour_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コマンドが含まれ、一般にalias、dbxenv、pathmap、および Korn シェル関数定義が含まれます。ただし、特定のコマンドは、プログラムがロードされていること、またはプロセスが接続されていることを要求します。すべての起動ファイルは、プログラムまたはプロセスがロードされる前にロードされます。さらに起動ファイルは、sourceまたは.(ピリオド) コマンドを使用することにより、その他のファイルのソースとなることもできます。起動ファイルを使用して、他のdbxオプションを設定することもできます。
dbxがプログラム情報をロードすると、Readingfilename など一連のメッセージを印刷します。プログラムがローディングを終了すると、
dbxはレディ状態となり、プログラム (C、C++、Fortan 95 については、main()、FORTRAN 77 については、MAIN()) の「main」ブロックを表示します。一般に、ブレークポイントを設定し、C プログラムに対し、stop in mainやrunなどのrunコマンドを実行します。起動属性の設定
pathmap、dbxenv、aliasコマンドを使用して、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.ccC++ では、
-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と入力します。
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コマンドは、直前に実行されたrun、rerun、またはdebugコマンドからsaveコマンドまでに発行されたデバッグコマンドをすべてファイルに保存します。このデバッグセッションのセグメントは、デバッグ実行と呼ばれます。
saveコマンドは、発行されたデバッグコマンドのリスト以外のものも保存します。実行開始時のプログラムの状態に関するデバッグ情報、つまり、ブレークポイント、表示リストなども保存されます。保存された実行を復元するとき、dbxは、保存ファイル内にあるこれらの情報を使用します。デバッグ実行の一部、つまり、入力されたコマンドのうち指定する数だけ最後から除いたものを保存することもできます。次の例 A は、すべて保存された実行を示しています。例 B は、保存された同じ実行から、最後の 2 ステップを除いたものを示しています。
保存する実行の終了位置がわからない場合は、
historyコマンドを使用して、セッション開始以降に発行されたデバッグコマンドのリストを確認してください。
注 - デフォルトにより、saveコマンドは特別な保存ファイルへ情報を書き込みます。デバッグ実行を後に復元可能なファイルへ保存する場合は、saveコマンドでファイル名を指定することができます。「一連のデバッグ実行をチェックポイントとして保存する」を参照してください。
saveコマンドまでのデバッグ実行すべてを保存するには、次のように入力します。
(dbx)saveデバッグ実行の一部を保存するには、
savenumber コマンドを使用します。number は、saveコマンドの直前の、保存しないコマンドの数を示します。
(dbx)save -number一連のデバッグ実行をチェックポイントとして保存する
ファイル名を指定しないでデバッグ実行を保存すると、情報は特殊な保存ファイルに書き込まれます。保存のたびに、
dbxはこの保存ファイルを上書きします。しかし、ファイル名引数をsaveコマンドに指定すると、あるデバッグ実行をこのファイル名に保存後別のデバッグ実行を保存しても、前の内容を復元することができます。一連の実行を保存すると、1 組のチェックポイントが与えられます。各チェックポイントは、セッションのさらに後から始まります。保存されたこれらの実行は任意に復元して続行し、さらに、以前の実行で保存されたプログラム位置と状態に
dbxをリセットすることができます。デバッグ実行を、デフォルトの保存ファイル以外のファイルに保存するには、次のように入力します。
(dbx)savefilename保存された実行の復元
実行を保存したら、
restoreコマンドを使用して実行を復元できます。dbxは、保存ファイル内の情報を使用します。実行を復元すると、dbxは、まず内部状態をその実行の開始時の状態にリセットしてから、保存された実行内の各デバッグコマンドを再発行します。
注 -sourceコマンドは、ファイル内に保存された一連のコマンドを再発行しますが、dbxの状態をリセットはしません。これは、現在のプログラム位置からコマンドの一覧を再発行するだけです。
保存された実行の正確な復元に必要な条件
保存されたデバッグ実行を正確に復元するには、
runタイプコマンドへの引数、手動入力、およびファイル入力などの、実行での入力すべてが正確に同じでなければなりません。
注 - セグメントを保存してから、restoreを実行する前にrun、rerun、またはdebugコマンドを発行すると、restoreは 2 番目の引数を使用して、run、rerun、またはdebugコマンドを後で保存します。これらの引数が異なる場合、正確な復元が得られない可能性があります。
保存されたデバッグ実行を復元するには、次のように入力します。
(dbx)restoreデフォルトの保存ファイル以外のファイルに保存されたデバッグ実行を復元するには、次のように入力します。
(dbx)restorefilename
replayを使用した保存と復元
replayコマンドは組合せのコマンドで、save -1に続けてrestoreを発行するのと同じです。replayコマンドは負の number_of_commands 引数をとります。これは、コマンドのsave部分に渡されるものです。デフォルトにより、-number の値は-1になるため、replayは取り消しコマンドとして働き、直前に発行されたコマンドにいたるまで (ただしこのコマンドは除く) の前回の実行を復元します。現在のデバッグ実行から、最後に発行されたデバッグコマンドを除くものを再現するには、次のように入力します。
(dbx)replay現在のデバッグ実行を再現して、最後から 2 番目のコマンド以前で実行を停止するには、
dbxのreplayコマンドを使用します。ここで、number は、最後のデバッグコマンドから数えていくつ目のコマンドで停止するかその数を示します。
(dbx)replay -number
| サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. | ホーム | 目次 | 前ページへ | 次ページへ | 索引 |