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

スコープ決定演算子を使用してシンボルを修飾する

func または file を使用する場合、スコープ決定演算子を使用して、ターゲットとして指定する関数の名前を修飾することができます。

dbx では、シンボルを修飾するためのスコープ決定演算子として、逆引用符演算子 (`) と C++ のスコープ決定演算子 (::) 、ブロック局所演算子 (:lineno) を使用することができます。これらの演算子は別々に、ときには同時に使用します。

停止位置以外の部分のコードを表示するためにファイルや関数の名前を修飾するだけでなく、スコープ外の変数や式の出力や表示を行なったり、型やクラスの宣言を表示したり (whatis コマンド) する場合にも、シンボルを修飾することが必要です。シンボルの修飾規則はすべての場合で同じです。この節で示す規則は、あらゆる種類のシンボル名の修飾に適用されます。

逆引用符演算子

逆引用符演算子 (`) は、大域スコープの変数を検索するために使用できます。


(dbx) print `item

プログラムでは、同じ関数名を 2 つの異なるファイル (またはコンパイルモジュール) で使用できます。この場合、dbx に対しても関数名を修飾して、表示する関数を認識させる必要があります。ファイル名に関連して関数名を修飾するには、汎用逆引用符 (`) スコープ決定演算子を使用してください。


(dbx) func `file_name`function_name

コロンを重ねたスコープ決定演算子 (C++)

次のような名前を持つ C++ のメンバー関数またはトップレベル関数を修飾するときには、コロンを 2 つ重ねた演算子 (::) を使用します。

多重定義された関数名を修飾できます。多重定義された関数名を修飾しないと、dbx は多重定義表示リストを自動的に表示して、表示する関数を選択するよう要求します。関数のクラス名がわかっている場合は、それを二重コロンのスコープ決定演算子とともに使用して、名前を修飾できます。


(dbx) func class::function_name  (args) 

たとえば、hand がクラス名で draw が関数名の場合は、次のようになります。


(dbx) func hand::draw 

ブロックローカル演算子

ブロックローカル演算子 (:lineno) は、逆引用符演算子と組み合わせて使用します。これは、必要なインスタンスを参照する式の行番号を識別します。

次の例では、:230 がブロックローカル演算子です。


(dbx) stop in `animate.o`change_glyph:230`item

リンカー名

dbx は、(C++ のようにさまざまな名前が混在するため)リンカー名ごとにシンボルを探すよう特別な構文を使用します。シンボル名の接頭辞として # 記号を付け、Korn シェルで $ 記号の前にエスケープ文字 ¥ を使用します。


(dbx) stop in #.mul
(dbx) whatis #¥$FEcopyPc
(dbx) print `foo.c`#staticvar

スコープ決定パス

dbx 固有コマンドにターゲットとして指定されたシンボルが検索を必要とするものである場合、dbx はそのシンボルを次の順序で検索します。

  1. 最初に現在の関数のスコープ内で検索を行います。プログラムが、入れ子になったブロックで停止した場合はそのブロック内で検索した後、その関数によって宣言されている外側のすべてのブロックのスコープ内で検索します。

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

  3. すぐ外側にある「コンパイル単位」: 一般に、現在の関数が含まれているファイル。

  4. ロードオブジェクトのスコープ。

  5. 大域的スコープ。

  6. 上記のすべてで該当するシンボルが見つからなかった場合は非公開変数、すなわちファイル内で「静的」な変数または関数と見なします。dbxenv による scope_look_aside の設定値によっては、コンパイル単位ごとにファイル静的シンボルを検索することもできます。

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