同じ名前が多くの場所で使用されたり、プログラム内の異なる種類の構成要素を参照したりすることがあります。dbx コマンド whereis は、特定の名前を持つすべてのシンボルの完全修飾名 (すなわち位置) のリストを表示します。一方、dbx コマンド which は、特定の名前を式に指定したときに、実際に使用されるシンボルを示します (「which コマンド」を参照)。
指定シンボルの出現すべてのリストを出力するには、 whereis symbol を使用します。 ここで、symbol は任意のユーザー定義識別子にすることができます。たとえば、次のようにします。
(dbx) whereis table 前方: `Blocks`block_draw.cc`table 関数: `Blocks`block.cc`table::table(char*, int, int, const point&) クラス: `Blocks`block.cc`table クラス: `Blocks`main.cc`table 変数: `libc.so.1`hsearch.c`table |
この出力には、プログラムが symbol を定義する読み込み可能オブジェクトの名前が、各オブジェクトの構成要素の種類 (クラス、関数、または変数) とともに示されます。
dbx シンボルテーブルの情報は必要に応じて読み取られるため、whereis コマンドは、すでに読み込まれているシンボルの出現についてしか出力しません。デバッグセッションが長くなると、出現のリストは大きくなります (「オブジェクトファイルおよび実行可能ファイル内のデバッグ情報」参照)。
詳細については、「whereis コマンド」を参照してください。
which コマンドにより、特定の名前を (完全に修飾しないで) 式に指定したときにどのシンボルが使用されるかを前もって調べることができます。たとえば、次のようにします。
(dbx) func wedge::wedge(char*, int, int, const point&, load_bearing_block*) (dbx) which draw `block_draw.cc`wedge::draw(unsigned long) |
which コマンドに指定したシンボル名が局所的スコープにない場合、スコープ決定パスで検索が行われます。決定パスで最初に見つかった名前の完全修飾名が示されます。
決定パスに含まれる任意の場所で、同じスコープの該当するシンボルが複数見つかった場合、あいまいであることを示すメッセージが表示されます。
(dbx) which fid 識別子 'fid' が複数あります 次の名前から 1 つ選択してください: 0) Cancel 1) `example`file1.c`fid 2) `example`file2.c`fid |
dbx は、あいまいなシンボル名をリストで示し、多重定義であることを表示します。which コマンドのコンテキストでシンボル名のリストから特定のシンボルを選んでも、dbx またはプログラムの状態には影響しません。ほとんどの場合、どのシンボルを選んでも名前が表示されるだけです。
which コマンドは、あるシンボル (この例の場合は block) をコマンド (たとえば、print コマンド) のターゲットにした場合に何が起こるかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。 dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。which コマンドの詳細については、「which コマンド」を参照してください。
式を含むデバッグコマンドを発行すると、式内のシンボルが次の順序で調べられます。dbx はシンボルをコンパイラが現在の表示スコープにあるとして決定します。
現在の表示スコープを使用する現在の関数のスコープ内 (「表示スコープ」参照)。プログラムが、入れ子になったブロックで停止した場合はそのブロック内で検索したあと、その関数によって宣言されている外側のすべてのブロックのスコープ内で検索します。
C++ の場合のみ: 現在の関数クラスのクラスメンバーとその基底クラス。
C++ の場合のみ: 現在のネームスペース。
現在の関数のパラメータ。
すぐ外側にあるモジュールで、一般に、現在の関数が含まれているファイル。
この共有ライブラリまたは実行可能ファイル専用に作成されたシンボル。これらのシンボルはリンカースコープを使用して作成できます。
メインプログラム用で、その次に共有ライブラリ用のグローバルシンボル。
前述のすべてで該当するシンボルが見つからなかった場合は非公開変数、すなわち別のファイル内で「静的」な変数または関数と見なします。dbxenv による scope_look_aside の設定値によっては、コンパイル単位ごとにファイル静的シンボルを検索することもできます。
dbx はこの検索パスで最初に見つけたシンボルを使用します。変数が見つからなかった場合はエラーを報告します。
静的シンボルおよび C++ メンバー関数のスコープ検索規則を緩和するには、dbx 環境変数 scope_look_aside を on に設定します。
dbxenv scope_look_aside on
または、「二重逆引用符」接頭辞を使用します。
stop in ``func4 func4 (静的スコープにない場合)
dbx 環境変数 scope_look_aside が on に設定されている場合、dbx は次を検索します。
その他のファイルで定義されている静的変数 (現在のスコープで見つからなかった場合)。/usr/lib に位置するライブラリのファイルは検索されません。
クラス修飾子のない C++ メンバー関数
その他のファイルの C++ インラインメンバー関数のインスタンス (メンバー関数が現在のファイルでインスタンス化されていない場合)
which コマンドは、dbx がどのシンボルを検索するかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。 dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。
詳細については、「func コマンド」を参照してください。