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
コマンドが含まれ、一般にalias
、dbxenv
、pathmap
、および Korn シェル関数定義が含まれます。ただし、特定のコマンドは、プログラムがロードされていること、またはプロセスが接続されていることを要求します。すべての起動ファイルは、プログラムまたはプロセスがロードされる前にロードされます。さらに起動ファイルは、source
または.
(ピリオド) コマンドを使用することにより、その他のファイルのソースとなることもできます。起動ファイルを使用して、他のdbx
オプションを設定することもできます。
dbx
がプログラム情報をロードすると、Reading
filename など一連のメッセージを印刷します。プログラムがローディングを終了すると、
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.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
コマンドは、直前に実行されたrun
、rerun
、またはdebug
コマンドからsave
コマンドまでに発行されたデバッグコマンドをすべてファイルに保存します。このデバッグセッションのセグメントは、デバッグ実行と呼ばれます。
save
コマンドは、発行されたデバッグコマンドのリスト以外のものも保存します。実行開始時のプログラムの状態に関するデバッグ情報、つまり、ブレークポイント、表示リストなども保存されます。保存された実行を復元するとき、dbx
は、保存ファイル内にあるこれらの情報を使用します。デバッグ実行の一部、つまり、入力されたコマンドのうち指定する数だけ最後から除いたものを保存することもできます。次の例 A は、すべて保存された実行を示しています。例 B は、保存された同じ実行から、最後の 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
を実行する前にrun
、rerun
、またはdebug
コマンドを発行すると、restore
は 2 番目の引数を使用して、run
、rerun
、またはdebug
コマンドを後で保存します。これらの引数が異なる場合、正確な復元が得られない可能性があります。
保存されたデバッグ実行を復元するには、次のように入力します。
(dbx)
restore
デフォルトの保存ファイル以外のファイルに保存されたデバッグ実行を復元するには、次のように入力します。
(dbx)
restore
filename
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. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |