dbx では、次の 2 通りの方法でデータをチェックすることができます。
データの評価 (print) - 任意の式の値を検査します。
データの表示 (display) - プログラムが停止するたびに式の値を検査し監視することができます。
この章の内容は次のとおりです。
この節は、dbx を使用して変数および式を評価する方法について説明します。
dbx がどの変数を評価するか確かでないときは、which コマンドを使用して dbx が使用する完全修飾名を調べてください。
変数名が定義されているほかの関数やファイルを調べるには、whereis コマンドを使用します。
コマンドについては、「which コマンド」と 「whereis コマンド」を参照してください。
現在の関数のスコープ外にある変数を評価 (監視) したい場合は、次のいずれかを行います。
関数の名前を特定します。「スコープ決定演算子を使用してシンボルを特定する」を参照してください。たとえば、次のようにします。
(dbx) print ‘item |
現在の関数を変更することにより、関数を表示します。「コードへの移動」を参照してください。
式はすべて、現在の言語構文に従う必要がありますが、dbx がスコープおよび配列を処理するために導入したメタ構文は除きます。
ネイティブコードの変数または式を評価するには、次のように入力します。
print expression |
Java コードの式、局所変数、またはパラメータを評価するには、print コマンドを使用できます。
詳細については、「print コマンド」を参照してください。
dbx は、C++ の dynamic_cast および typeid 演算子をサポートしています。これらの 2 つの演算子で式を評価すると、dbx は、コンパイラで提供された特定の rtti 関数へ呼び出しを行います。ソースが明示的に演算子を使用しない場合、これらの関数はコンパイラで生成されない場合があり、dbx は式を評価することができません。
C++ では、オブジェクトポインタに 2 つの型があります。1 つは「静的な型」で、ソースコードに定義されています。もう 1 つは「動的な型」で、変換前にオブジェクトは何であったかを示します。dbx は、動的な型のオブジェクトに関する情報を提供できる場合があります。
通常、オブジェクトに仮想関数テーブルの vtable が含まれる場合、dbx はこの vtable 内の情報を使用して、オブジェクトの型を正しく知ることができます。
print、display、または watch コマンドは、-r (再帰的) オプション付きで使用できます。 その場合、dbx はクラスによって直接定義されたデータメンバーすべてと、基底クラスから継承されたものを表示することができます。
これらのコマンドには、-d または +d オプションも使用できます。これは、dbx 環境変数 output_derived_type でデフォルト動作を切り替えることができます。
プロセスが何も実行されていないときに、-d フラグを使用するか、または dbx 環境変数 output_dynamic_type を on に設定すると、プログラムが実行可能な状態ではないことを表すエラーメッセージが出されます。これは、コアファイルのデバッグを実行している場合のように、プロセスがないときに動的情報にアクセスすることは不可能なためです。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは 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 コマンド」を参照してください。
assign variable = expression |
配列の評価は、ほかの種類の変数を評価する場合と同じ方法で行います。
Fortran の配列の例 :
integer*4 arr(1:6, 4:7) |
配列を評価するには、print コマンドを使用します。たとえば、次のようにします。
(dbx) print arr(2,4) |
dbx コマンドの print を使用して、大型の配列の一部を評価することができます。配列を評価するには、次の操作を行います。
刻みは配列の断面化を行うときに必要に応じて指定することができます (刻みのデフォルト値は 1 で、その場合は各要素を出力します)。
C、C++、Fortran では、print、display、および watch コマンドによって、配列の断面化を行うことができます。
配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。
print array-expression [first-expression .. last-expression : stride-expression] |
ここで
配列またはポインタ型に評価されるべき式
印刷される最初の要素。デフォルトは 0
印刷される最後の要素。その上限にデフォルト設定
刻み幅の長さ (スキップされる要素の数は stride-expression-1)。デフォルトは 1
最初、最後、および刻み幅の各式は、整数に評価されなければならない任意の式です。
たとえば、次のようにします。
(dbx) print arr[2..4] arr[2..4] = [2] = 2 [3] = 3 [4] = 4 (dbx) print arr[..2] arr[0..2] = [0] = 0 [1] = 1 [2] = 2 (dbx) print arr[2..6:2] arr[2..6:2] = [2] = 2 [4] = 4 [6] = 6 |
配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。
print array-expression [first-expression : last-expression : stride-expression] |
ここで
配列型に評価される式
範囲内の最初の要素は、出力される最初の要素下限にデフォルト設定
範囲内の最後の要素。ただし刻み幅が 1 でない場合、出力される最後の要素とはなりません。その上限にデフォルト設定
刻み幅。デフォルトは 1
最初、最後、および刻み幅の各式は、整数に評価されなければならない任意の式です。n 次元の断面については、カンマで各断面の定義を区切ります。
たとえば、次のようにします。
(dbx) print arr(2:6) arr(2:6) = (2) 2 (3) 3 (4) 4 (5) 5 (6) 6 (dbx) print arr(2:6:2) arr(2:6:2) = (2) 2 (4) 4 (6) 6 |
行と列を指定するには、次のように入力します。
demo% f95 -g -silent ShoSli.f demo% dbx a.out Reading symbolic information for a.out (dbx) list 1,12 1 INTEGER*4 a(3,4), col, row 2 DO row = 1,3 3 DO col = 1,4 4 a(row,col) = (row*10) + col 5 END DO 6 END DO 7 DO row = 1, 3 8 WRITE(*,’(4I3)’) (a(row,col),col=1,4) 9 END DO 10 END (dbx) stop at 7 (1) stop at "ShoSli.f":7 (dbx) run Running: a.out stopped in MAIN at line 7 in file "ShoSli.f" 7 DO row = 1, 3 |
行 3 を印刷するには、次のように入力します。
(dbx) print a(3:3,1:4) ’ShoSli’MAIN’a(3:3, 1:4) = (3,1) 31 (3,2) 32 (3,3) 33 (3,4) 34 (dbx) |
列 4 を印刷するには、次のように入力します。
(dbx) print a(1:3,4:4) ’ShoSli’MAIN’a(1:3, 1:4) = (1,4) 14 (2,4) 24 (3,4) 34 (dbx) |
2 次元の C++ の矩形配列の断面の例を示します。ここでは、刻み値が省略され、デフォルト値の 1 が使用されます。
print arr(201:203, 101:105) |
このコマンドは、大型配列の要素のブロックを出力します。stride-expression が省略され、デフォルトの刻み値である 1 が使用されていることに注意してください。
最初の 2 つの式 (201:203) は、この 2 次元配列の第 1 次元 (3 行で構成される列) を指定します。配列の断面は行 201 から始まり、行 203 で終わります。次の組の式は最初の組とコンマで区切られ、第 2 次元の配列の断面を定義します。配列の断面は列 101 から始まり、列 105 で終わります。
print コマンドで刻み幅を指定すると、配列の断面に含まれる特定の要素だけが評価されます。
配列の断面のための構文の 3 番目の式 (stride-expression) は、刻み幅の長さを指定します。stride-expression の値は印刷する要素を指定します。刻み幅のデフォルト値は 1 です。このとき、指定された配列の断面のすべての要素が評価されます。
ここに、前述の例で使用したものと同じ配列があります。今度は、print コマンドの第 2 次元の配列の断面の定義に刻み幅の値として 2 を加えます。
print arr(201:203, 101:105:2) |
図で示すとおり、刻み値として 2 を指定すると、各行を構成する要素が 1 つおきに出力されます。
print コマンドの配列の断面の定義を構成する式を省略すると、配列の宣言されたサイズに等しいデフォルト値が使用されます。このような簡易構文を使用した例を以下に示します。
1 次元配列の場合
デフォルトの境界で配列全体を出力します。
デフォルトの境界とデフォルトの刻み (1) で、配列全体を出力します。
配列全体を stride-expression で指定された刻み幅で出力します。
2 次元配列の場合、次のコマンドは配列全体を出力します。
print arr |
2 次元配列の第 2 次元を構成する要素を 2 つおきに出力します。
print arr (:,::3) |
pretty-print を使用すると、プログラムで関数呼び出しにより、式の値を独自に整形出力できます。print、rprint、display、または watch コマンドに -p オプションを指定すると、dbx は const 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 に設定した場合、print、rprint、または display コマンドにデフォルトとして -p が渡されます。この動作を上書きするには、+p を使用します。
次のことも考慮してください。
version 7.6 以前の pretty-print は、prettyprint の ksh 実装に基づいていました。この ksh 関数 (およびその定義済みのエイリアス pp) はまだ存在しますが、その動作の大半は dbx 内に再実装され、次のような結果になりました。
IDE の場合、ウォッチポイント、局所変数、およびバルーン評価で pretty-print を利用できる。
print、display、および watch コマンドの -p オプションでネイティブルートを使用。
特に、ウォッチポイントおよび局所変数に pretty-print を頻繁に呼び出すことができるようになったため、スケーラビリティが向上。
式からアドレスを取得できる機会が増加。
エラー回復処理の向上。
一定/揮発性の非限定型の場合、通常は db_pretty_print(int *, ...() および db_pretty_print(const int *, ...)() などの関数は別個のものとみなされます。dbx の多重定義解決機能では、識別は行いますが、強制はしません。
識別可能。定義した変数が int と const int の両方で宣言されている場合、それぞれが適切な関数にルーティングされます。
強制不可。int または const int 変数が 1 つだけ定義されている場合、それらは両方の関数に一致します。この動作は pretty-print に固有ではなく、すべての呼び出しに適用します。
pretty-print 関数は次のような場合に起動されます。
print -p または dbx 環境変数 output_pretty_print が on に設定されている場合。
display -p または dbx 環境変数 output_pretty_print が on に設定されている場合。
watch -p または dbx 環境変数 output_pretty_print が on に設定されている場合。
dbx 環境変数 output_pretty_print が on に設定されている場合のバルーン評価。
dbx 環境変数 output_pretty_print が on に設定されている場合の局所変数。
pretty-print 関数は次の場合に呼び出されません。
$[]. $[] はスクリプトで使用することを意図しており、予測できる必要があるためです。
dump コマンド。dump は、where コマンドと同じ簡単なフォーマットを使用します。これは将来、pretty-print を使用するように変換される可能性があります。この制限は IDE の局所変数ウィンドウには適用されません。
入れ子の値は整形出力されません。dbx には入れ子のフィールドのアドレスを計算するインフラストラクチャーがありません。
db_pretty_print() は -g オプションを使用してコンパイルする必要があります。dbx はパラメータシグニチャーにアクセスする必要があるためです。
db_pretty_print() 関数では NULL を返すことができます。
db_pretty_print() 関数に渡されるメインポインタは NULL 以外であることが保証されていますが、そうでない場合は、完全に初期化されていないオブジェクトを指したままになる可能性があります。
dbx 環境変数 output_pretty_print_fallback はデフォルトで on に設定され、pretty-print が失敗した場合、dbx は標準フォーマットを使用することを意味します。この環境変数が off に設定されている場合、pretty-print が失敗すると dbx はエラーメッセージを発行します。
次のいずれかの理由により、pretty-print が失敗する可能性があります。これらは検出および回復が可能です。
pretty-print 関数が見つからない。
整形出力する式のアドレスを取得できない。
関数呼び出しが直ちに戻らない。これは、不正なオブジェクトが検出されたときに、pretty-print 関数が堅牢でない場合に発生するセグメント例外を示している可能性があります。ユーザーブレークポイントを示している可能性もあります。
pretty-print 関数が NULL を返した。
pretty-print 関数が、dbx が間接参照できないポインタを返した。
コアファイルがデバッグ中である。
前述のような失敗では、関数呼び出しが直ちに戻らない場合を除くすべての状況で、メッセージは表示されず、dbx は標準のフォーマットを使用します。ただし、output_pretty_print_fallback 環境変数が off に設定されている場合、pretty-print が失敗すると、dbx はエラーメッセージを発行します。
ただし、print -p コマンドを、dbx 環境変数 output_pretty_print を on に設定せずに使用した場合、dbx は壊れている関数で停止するため、失敗の原因を診断できます。次に、pop -c コマンドを使用すると、呼び出しを取り消すことができます。
db_pretty_print() 関数は、先頭のパラメータの型に基づいて、明確にする必要があります。C では、関数をファイルスタティックとして記述することで、関数を多重定義できます。