Sun Studio 12: dbx コマンドによるデバッグ

変数と式の評価

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

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

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

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

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

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

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

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

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

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


print expression

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

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


注 –

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


pretty-print の使用

pretty-print を使用すると、プログラムで関数呼び出しにより、式の値を独自に整形出力できます。printrprintdisplay、または watch コマンドに -p オプションを指定すると、dbxconst chars *db_pretty_print (const T *, int flags, const char *fmt) 形式の関数を検索して呼び出し、出力または表示用の戻り値を変換します。

この関数の flags 引数で渡される値は、次のいずれかのビット単位の論理和です。

FVERBOSE

0x1

現在実装されておらず、常に設定される 

FDYNAMIC

0x2

-d

FRECURSE

0x4

-r

FFORMAT

0x8

-f (設定されている場合、fmt はフォーマット部分)

FLITERAL

0x10

-l

db_pretty_print() 関数は、静的メンバー関数かスタンドアロン関数に指定できます。

dbx の環境変数 output_pretty_print を on に設定した場合、printrprint、または display コマンドにデフォルトとして -p が渡されます。この動作を上書きするには、+p を使用します。

次のことも考慮してください。

C++ での表示

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

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

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

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

プロセスが何も実行されていないときに、-d フラグを使用するか、または dbx 環境変数 output_dynamic_type on に設定すると、プロセスがないときに動的情報にアクセスすることは不可能なため、プログラムが実行可能な状態ではないことを表すエラーメッセージが出されます。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは 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 コマンドによって取り消されるまで続けられます。

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


display expression, ...

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

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

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

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

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


undisplay expression

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


undisplay 0

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