Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

変数と式の評価

この節は、dbx を使用して変数および式を評価する方法について説明します。

実際に使用される変数を確認する

dbx がどの変数を評価するか確かでないときは、which コマンドを使用して dbx が使用する完全修飾名を調べてください。

変数名が定義されているほかの関数やファイルを調べるには、whereis コマンドを使用します。

コマンドについては、which コマンド」whereis コマンド」を参照してください。

現在の関数のスコープ外にある変数

現在の関数のスコープ外にある変数を評価 (監視) したい場合は、次のいずれかを行います。

変数、式または識別子の値を出力する

式はすべて、現在の言語構文に従う必要がありますが、dbx がスコープおよび配列を処理するために導入したメタ構文は除きます。

ネイティブコードの変数または式を評価するには、次のように入力します。


print expression

Java コードの式、局所変数、またはパラメータを評価するには、print コマンドを使用できます。

詳細については、print コマンド」を参照してください。


注 –

dbx は、C++ の dynamic_cast および typeid 演算子をサポートしています。これらの 2 つの演算子で式を評価すると、dbx は、コンパイラで提供された特定の rtti 関数へ呼び出しを行います。ソースが明示的に演算子を使用しない場合、これらの関数はコンパイラで生成されない場合があり、dbx は式を評価することができません。


C++ ポインタを出力する

C++ では、オブジェクトポインタに 2 つの型があります。1 つは「静的な型」で、ソースコードに定義されています。もう 1 つは「動的な型」で、変換前にオブジェクトは何であったかを示します。dbx は、動的な型のオブジェクトに関する情報を提供できる場合があります。

通常、オブジェクトに仮想関数テーブルの vtable が含まれる場合、dbx はこの vtable 内の情報を使用して、オブジェクトの型を正しく知ることができます。

printdisplay、または watch コマンドは、-r (再帰的) オプション付きで使用できます。 その場合、dbx はクラスによって直接定義されたデータメンバーすべてと、基底クラスから継承されたものを表示することができます。

これらのコマンドには、-d または +d オプションも使用できます。これは、dbx 環境変数 output_derived_type でデフォルト動作を切り替えることができます。

プロセスが何も実行されていないときに、-d フラグを使用するか、または dbx 環境変数 output_dynamic_typeon に設定すると、プログラムが実行可能な状態ではないことを表すエラーメッセージが出されます。これは、コアファイルのデバッグを実行している場合のように、プロセスがないときに動的情報にアクセスすることは不可能なためです。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは C++ では無効です)。

C++ プログラムにおける無名引数を評価する

C++ では、無名の引数を持つ関数を定義できます。次に例を示します。


void tester(int)
{
};
main(int, char **)
{
   tester(1);
};

無名の引数はプログラム内のほかの場所では使用できませんが、dbx は無名引数を評価できる形式にコード化します。その形式は次のとおりです。ここで、dbx は %n に整数を割り当てます。


_ARG%n

コンパイラによって割り当てられた引数名を入手するには、対象の関数名を指定した whatis コマンドを実行します。


(dbx) whatis tester
void tester(int _ARG1);
(dbx) whatis main
int main(int _ARG1, char **_ARG2);

詳細については、whatis コマンド」を参照してください。

無名の関数引数を評価 (表示) するには、次のようにします。


(dbx) print _ARG1
_ARG1 = 4

ポインタを間接参照する

ポインタを間接参照すると、ポインタが指している内容に格納された値を参照できます。

ポインタを間接参照すると、dbx は、コマンド区画に評価結果を表示します。次の例では、t の指す値が表示されます。


(dbx) print *t
*t = {
a = 4
}

式を監視する

プログラムが停止するたびに式の値を監視することにより、特定の式または変数がいつどのように変化するかを効果的に知ることができます。 display コマンドは、指定されている 1 つまたは複数の式または変数を監視するように dbx に命令します。監視は、undisplay コマンドによって取り消されるまで続けられます。watch コマンドは、すべての停止ポイントの式を、その停止ポイントでの現在のスコープ内で評価して出力します。

プログラムが停止するたびに変数または式の値を表示するには、次のようにします。


display expression, ...

一度に複数の変数を監視できます。オプションを指定しないで display コマンドを使用すると、監視対象のすべての式が表示されます。

詳細については、display コマンド」を参照してください。

expression の値をすべての停止ポイントで監視するには、次のように入力します。


watch expression, ...

詳細については、watch コマンド」を参照してください。

表示を取り消す (非表示)

監視している変数の値の表示は、undisplay コマンドで「表示」を取り消すまで続けられます。特定の式だけを表示しないようにすることも、現在監視しているすべての式の表示を中止することも可能です。

特定の変数または式の表示をオフにするには、次のようにします。


undisplay expression

現在監視しているすべての変数の表示をオフにするには、次のようにします。


undisplay 0

詳細については、undisplay コマンド」を参照してください。