Oracle® Developer Studio 12.5: dbx コマンドによるデバッグ

印刷ビューの終了

更新: 2016 年 6 月
 
 

シンボルの検索

同じ名前が多くの場所で使用されたり、プログラム内の異なる種類の構成要素を参照したりすることがあります。dbx コマンド whereis は、特定の名前を持つすべてのシンボルの完全修飾名 (すなわち位置) のリストを表示します。dbxwhich コマンドは、ユーザーが式の中でその名前を指定した場合に dbx がシンボルのどの出現を使用するかを表示します。

シンボルの出現を出力する

指定されたシンボルのすべての出現のリストを出力するには、whereis symbol を使用します。ここで、symbol にはユーザー定義の任意の識別子を指定できます。例:

(dbx) whereis table
forward: `Blocks`block-draw.cc`table
function: `Blocks`block.cc`table::table(char*, int, int, const point&)
class: `Blocks`block.cc`table
class: `Blocks`main.cc`table
variable:       `libc.so.1`hsearch.c`table

この出力には、プログラムが symbol を定義しているロード可能なオブジェクトの名前のほか、そのエンティティータイプであるクラス、関数、または変数が含まれています。

dbx シンボルテーブルからの情報は必要な場合に読み込まれるため、whereis コマンドは、すでにロードされているシンボルの出現のみを登録します。 デバッグセッションが長くなると、出現リストが増大する場合があります。詳細については、オブジェクトファイルおよび実行可能ファイル内のデバッグ情報を参照してください。

実際に使用されるシンボルを決定する

which コマンドは、ユーザーが式の中でその名前を完全に修飾しないで指定した場合に dbx が指定された名前を持つどのシンボルを使用するかを表示します。例:

(dbx) func
wedge::wedge(char*, int, int, const point&, load-bearing-block*)
(dbx) which draw
`block-draw.cc`wedge::draw(unsigned long)

指定されたシンボル名が局所的なスコープ内に存在しない場合、which コマンドは、そのシンボルの最初の出現をスコープ決定検索パスに沿って検索します。決定パスで最初に見つかった名前の完全修飾名が示されます。

検索パスに沿ったいずれかの場所で同じスコープレベルにある symbol の複数の出現が検索された場合、dbx は、あいまいさを報告するメッセージをコマンドペインに出力します。

(dbx) which fid
More than one identifier `fid’.
Select one of the following:
 0) Cancel
 1) `example`file1.c`fid
 2) `example`file2.c`fid

dbx は、あいまいなシンボル名をリストで示し、多重定義であることを表示します。which コマンドのコンテキストでシンボル名のリストから特定のシンボルを選んでも、dbx またはプログラムの状態には影響しません。どのシンボルを選んでも名前が表示されるだけです。

which コマンドは、ある symbol (この例の場合は block) をコマンド (たとえば、print コマンド) のターゲットにした場合に何が起こるかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。 dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。

スコープ決定検索パス

    式を含むデバッグコマンドを発行すると、その式の中のシンボルが次の順序で検索されます。dbx は、コンパイラが現在の表示スコープで処理するのと同様にシンボルを解決します。

  1. 現在の表示スコープを使用している現在の関数のスコープ内。プログラムがネストされたブロックで停止された場合、dbx はそのブロック内で検索したあと、囲んでいるすべてのブロックのスコープ内で検索します。

  2. C++ の場合のみ: 現在の関数クラスのクラスメンバーとその基底クラス。

  3. C++ の場合のみ: 現在のネームスペース。

  4. 現在の関数のパラメータ。

  5. すぐ外側の囲んでいるモジュール。これは一般に、現在の関数を含むファイルです。

  6. この共有ライブラリまたは実行可能ファイル専用に作成されたシンボル。これらのシンボルはリンカースコープを使用して作成できます。

  7. メインプログラム用で、その次に共有ライブラリ用のグローバルシンボル。

  8. 上記の検索がいずれも成功しなかった場合、dbx は、ユーザーが別のファイル内の非公開 (つまり、ファイルの静的) 変数または関数を参照していると見なします。dbx はオプションで、dbxenv の設定 scope-look-aside の値に応じて、すべてのコンパイル単位内のファイルの静的シンボルを検索します。

dbx はこの検索パスで最初に見つけたシンボルを使用します。変数が見つからなかった場合はエラーを報告します。

スコープ検索規則の緩和

静的シンボルおよび C++ メンバー関数に対するスコープ検索規則を緩和するには、 dbxenv 変数 scope-look-asideon に設定します。

dbxenv scope-look-aside on

また、「二重逆引用符」接頭辞を使用することもできます。

stop in ``func4            func4 may be static and not in scope

    dbxenv 変数 scope-look-asideon に設定されている場合、dbx は次のものを探します。

  • その他のファイルで定義されている静的変数 (現在のスコープで見つからなかった場合)。/usr/lib に位置するライブラリのファイルは検索されません。

  • クラス修飾子のない C++ メンバー関数

  • その他のファイルの C++ インラインメンバー関数のインスタンス (メンバー関数が現在のファイルでインスタンス化されていない場合)

which コマンドは、dbx がどのシンボルを検索するかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。 dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。