この節では、変数や式を評価する方法を示します。
dbx がどの変数を評価するか確かでないときは、which コマンドを使用して dbx が使用する完全修飾名を調べてください 。
変数名が定義されているほかの関数やファイルを調べるには、whereis コマンドを使用します。
現在の関数のスコープ外にある変数を評価 (監視) したい場合は、次のようにします。
関数の名前を修飾します。
関数内まで実行します。すなわち、現在の関数を変更します。
変数または式の値を印刷します。
式の構文はすべて、現在の言語に従わなければなりませんが、dbx がスコープと配列を処理するために導入したメタ構文は除きます。
print expression
C++ では、オブジェクトポインタに 2 つの型があります。1 つは静的な型で、ソースコードに定義されています。もう 1 つは動的な型です。dbx は、動的な型のオブジェクトに関する情報を提供できる場合があります。
通常、オブジェクトに仮想関数テーブルの vtable が含まれる場合、dbx はこの vtable 内の情報を使用して、オブジェクトの型を正しく知ることができます。
print または display コマンドに -r (再帰的) オプションをつけて使用すると、dbx は、クラスによって直接定義されたデータメンバーすべてと、基底クラスから継承されたものを表示することができます。
これらのコマンドには、-d または +d オプションも使用できます。これは、dbxenv output_derived_type でデフォルト動作を切り替えることができます。
プロセスが何も実行されていないときに、-d フラグを使用するか、またはdbxenv output_dynamic_type を on に設定すると、プロセスがないときに動的情報にアクセスすることは不可能なため、プログラムは実行可能な状態ではないことを表すエラーメッセージが出されます。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは C++ では無効です)。
C++ では、次のように無名の引数を持つ関数を定義できます。
void tester(int) { }; main(int, char **) { tester(1); };
無名の引数はプログラム内のほかの場所では使用できませんが、dbx は無名引数を評価できる形式にコード化します。その形式は次のとおりです。
_ARG%n
ここで、dbx は %n に整数を割り当てます。
dbx によって割り当てられた引数名を入手するには、調べたい関数名を指定した whatis コマンドを実行します。
(dbx) whatis tester void tester(int _ARG0); (dbx) whatis main int main(int _ARG1, char **_ARG2);
無名の関数引数を評価 (表示) するには、次のようにします。
(dbx) print _ARG1 _ARG1 = 4
ポインタを間接参照すると、ポインタが指している内容に格納された値を参照できます。
ポインタを間接参照すると、dbx は評価結果を表示します。次の例は、ポインタを間接参照した場合です。
(dbx) print *t *t = { a = 4 }
プログラムが停止するたびに式の値を監視することにより、特定の式または変数がいつどのように変化するかを効果的に知ることができます。display コマンドは、指定されている 1 つまたは複数の式または変数を監視するように dbx に命令します。監視は、undisplay コマンドによって取り消されるまで続けられます。
プログラムが停止するたびに変数または式の値を表示するには、次のようにします。
display expression, ...
一度に複数の変数を監視できます。オプションを指定しないで display コマンドを使用すると、監視対象のすべての式が表示されます。
display
監視している変数の値の表示は、undisplay コマンドで「表示」を取り消すまで続けられます。特定の式だけを表示しないようにすることも、現在監視しているすべての式の表示を中止することも可能です。
特定の変数または式の表示をオフにするには、次のようにします。
undisplay expression
現在監視しているすべての変数の表示をオフにするには、次のようにします。
undisplay 0