func または file を使用する場合、「スコープ決定演算子」を使用して、ターゲットとして指定する関数の名前を特定することができます。
dbx では、シンボルを特定するためのスコープ決定演算子として、逆引用符演算子 (`)、C++ 逆引用符演算子 (::)、およびブロックローカル演算子 (: lineno) を使用することができます。これらの演算子は別々に、あるいは同時に使用します。
停止位置以外の部分のコードを表示するためにファイルや関数の名前を特定するだけでなく、スコープ外の変数や式の出力や表示を行なったり、型やクラスの宣言を表示したり (whatis コマンドを使用) する場合にも、シンボルを特定することが必要です。シンボルの特定規則はすべての場合で同じです。この節で示す規則は、あらゆる種類のシンボル名の特定に適用されます。
逆引用符演算子 (`) は、大域スコープの変数あるいは関数を検索するために使用できます。
(dbx) print `item |
プログラムでは、同じ関数名を 2 つの異なるファイル (またはコンパイルモジュール) で使用できます。この場合、dbx に対して関数名を特定して、表示する関数を認識させる必要があります。ファイル名に関連して関数名を特定するには、汎用逆引用符 (`) スコープ決定演算子を使用してください。
(dbx) func`file_name`function_name |
次のような名前を持つ C++ のメンバー関数、トップレベル関数、またはグローバルスコープを伴う変数を特定するときは、コロンを 2 つ重ねた演算子 (::) を使用します。
多重定義されている名前 (複数の異なる引数型で同じ名前が使用されている)
あいまいな名前 (複数の異なるクラスで同じ名前が使用されている)
多重定義された関数名を特定することができます。多重定義された関数名を特定しないと、dbx は多重定義表示リストを自動的に表示して、表示する関数を選択するよう要求します。関数のクラス名がわかっている場合は、それを二重コロンのスコープ決定演算子とともに使用して、名前を特定できます。
(dbx) func class::function_name (args) |
たとえば、hand がクラス名で draw が関数名の場合は、次のようになります。
(dbx) func hand::draw |
ブロックローカル演算子 (:line_number) を使用すると、ネストされたブロック内にある変数を参照することができます。これを行う必要があるのはパラメータまたはメンバー名を隠蔽している局所変数がある場合、またはそれぞれが個別の局所変数を持っている複数のブロックがある場合です。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++ のようにさまざまな名前が混在するため) リンカー名ごとにシンボルを探すよう特別な構文を使用します。シンボル名の接頭辞として # 記号を付け、Korn シェルで $ 記号の前にエスケープ文字 \ を使用します。たとえば、次のようにします。
(dbx) stop in #.mul (dbx) whatis #\$FEcopyPc (dbx) print `foo.c`#staticvar |