dbx コマンドによるデバッグ

シンボルを検索する

同じ名前が多くの場所で使用されたり、プログラム内の異なる種類の構成要素を参照したりすることがあります。dbx コマンド whereis は、特定の名前を持つすべてのシンボルの完全修飾名 (すなわち位置) のリストを表示します。一方、dbx コマンド which は、特定の名前を dbx コマンドのターゲットとしたときに、実際に使用されるシンボルを示します。

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

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


(dbx) whereis table
前方:   `Blocks`block_draw.cc `table
関数:   `Blocks`block.cc`table::table(char*, int, int, const
         point&)
クラス: `Blocks`block.cc`class table
クラス: `Blocks`main.cc`class table
変数:   `libc.so.1`hsearch.c`table

この出力には、プログラムがシンボルを定義する読み込み可能オブジェクトの名前が、各オブジェクトの構成要素の種類 (クラス、関数、または変数) とともに示されます。

dbx シンボルテーブルの情報は必要に応じて読み取られるため、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
`example`file1.c`fid
`example`file2.c`fid

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

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