func または file を使用する場合、「スコープ決定演算子」を使用して、ターゲットとして指定する関数の名前を特定することができます。
dbx では、シンボルを特定するためのスコープ決定演算子として、逆引用符演算子 (`)、C++ 逆引用符演算子 (::)、およびブロックローカル演算子 (: lineno) を使用することができます。これらの演算子は別々に、あるいは同時に使用します。
停止位置以外の部分のコードを表示するためにファイルや関数の名前を特定するだけでなく、スコープ外の変数や式の出力や表示を行なったり、型やクラスの宣言を表示したり (whatis コマンドを使用) する場合にも、シンボルを特定することが必要です。
このセクションでは、すべての種類のシンボル名修飾の規則について説明します。シンボル修飾規則は、すべての場合で同じです。
逆引用符演算子 (`) は、大域スコープの変数あるいは関数を検索するために使用できます。
(dbx) print `item
プログラムでは、同じ関数名を 2 つの異なるファイルまたはコンパイルモジュールで使用できます。この場合、dbx に対して関数名を特定して、表示する関数を認識させる必要があります。ファイル名に関連して関数名を特定するには、汎用逆引用符 (`) スコープ決定演算子を使用してください。
(dbx) func`filename`function-name
次のような名前の C++ メンバー関数、トップレベル関数、または大域スコープを持つ変数を修飾するには、二重コロン演算子 (::) を使用します。
多重定義されている名前 (複数の異なる引数型で同じ名前が使用されている)
あいまいな名前 (複数の異なるクラスで同じ名前が使用されている)
多重定義された関数名を修飾しない場合は、dbx によって多重定義リストが表示されるため、どの関数を表示するかを選択できます。関数のクラス名がわかっている場合は、それを二重コロンスコープ決定演算子とともに使用することによって名前を修飾できます。
(dbx) func class::function-name (args)
たとえば、hand がクラス名で、draw が関数名である場合は、次のようになります。
(dbx) func hand::draw
ブロックローカル演算子 (:line-number) を使用すると、特にネストされたブロック内の変数を参照できます。これを行う必要があるのはパラメータまたはメンバー名を隠蔽している局所変数がある場合、またはそれぞれが個別の局所変数を持っている複数のブロックがある場合です。この行番号は、対象となる変数に対するブロック内のコードの最初の行の番数です。dbx が局所変数をブロックローカル演算子で特定した場合、dbx は最初のコードブロックの行番号を使用しますが、dbx の式ではスコープ内の任意の行番号を使用することができます。
次の例では、ブロックローカル演算子 (:230) が逆引用符演算子と組み合わされています。
(dbx) stop in `animate.o`change-glyph:230`item
次の例は、関数内で複数存在する変数名が、ブロックローカル演算子によって特定され、dbx がその変数の内容を評価している様子を示しています。
(dbx) list 1,$ 1 #include <stddef.h> 2 3 int main(int argc, char** argv) { 4 5 int i=1; 6 7 { 8 int i=2; 9 { 10 int j=4; 11 int i=3; 12 printf("hello"); 13 } 14 printf("world\n"); 15 } 16 printf("hi\n"); 17 } 18 (dbx) whereis i variable: `a.out`t.c`main`i variable: `a.out`t.c`main:8`i variable: `a.out`t.`main:10`i (dbx) stop at 12 ; run ... (dbx) print i i = 3 (dbx) which i `a.out`t.c`main:10`i (dbx) print `main:7`i `a.out`t.c`main`i = 1 (dbx) print `main:8`i `a.out`t.c`main:8`i = 2 (dbx) print `main:10`i `a.out`t.c`main:10`i = 3 (dbx) print `main:14`i `a.out`t.c`main:8`i = 2 (dbx) print `main:15`i `a.out`t.c`main`i = 1
dbx は、(C++ のようにさまざまな名前が混在するため) リンカー名ごとにシンボルを探すよう特別な構文を使用します。シンボル名の前に # (ポンド記号) 文字を追加します。すべての $ (ドル記号) 文字の前に ksh のエスケープ文字 \ (バックスラッシュ) を使用します。
(dbx) stop in #.mul (dbx) whatis #\$FEcopyPc (dbx) print `foo.c`#staticvar