dbx コマンドによるデバッグ ホーム目次前ページへ次ページへ索引


第 8 章

データの評価と表示

dbx では、次の 2 通りの方法でデータをチェックすることができます。

この章は次の各節から構成されています。

変数と式の評価

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

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

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

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

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「which コマンド」および「where コマンド」を参照してください。

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

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

変数または式の値を出力する

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

変数または式を評価するには、次のように入力します。

print expression

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「print コマンド」を参照してください。


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

C++ での表示

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

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

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

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

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

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);

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「whatis コマンド」および「C++ で使用される whatis コマンド」を参照してください。

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

(dbx) print _ARG1
_ARG1 = 4

ポインタを間接参照する

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

ポインタを間接参照すると、dbx は評価結果を表示します。次の例は、ポインタを間接参照した場合です。

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

「デバッグ」ウィンドウで、ポインタを間接参照することもできます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ポインタの間接参照」を参照してください。

式を監視する

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

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

display expression, ...     

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

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「display コマンド」を参照してください。

「デバッグ」ウィンドウで、式の値を監視することもできます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「式の追加」を参照してください。

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

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

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

undisplay expression

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

undisplay 0

詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「undisplay コマンド」を参照してください。

「デバッグ」ウィンドウで、指定の式、またはすべての式の表示をオフにすることができます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「式の削除」を参照してください。

式に値を代入する

変数に値を代入するには、次のようにします。

assign variable = expression

「デバッグ」ウィンドウで、変数へ値を代入することもできます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「データ値の変更」を参照してください。

配列を評価する

配列の評価は、ほかの種類の変数を評価する場合と同じ方法で行います。

配列の例 :

integer*4 arr(1:6, 4:7)

配列を評価するには、次のようにします。

print arr(2,4)

dbx コマンドの print を使用して、大型の配列の一部を評価することができます。配列を評価するには、次の操作を行います。

刻みは配列の断面化を行うときに必要に応じて指定することができます (刻みのデフォルト値は 1 で、その場合は各要素を出力します)。

配列の断面化

C、C++、Fortran では、print および display コマンドによって、配列の断面化を行うことができます。

C と C++ での配列の断面化の構文

配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。

print array-expression [first-expression .. last-expression : stride-expression]

arr-exp 配列またはポインタ型に評価されるべき式
first-exp 印刷される最初の要素。デフォルトは 0
last-exp 印刷される最後の要素。その上限にデフォルト設定される
stride-exp 刻み幅の長さ (スキップされる要素の数は 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..8:2] =
[2] = 2
[4] = 4
[6] = 6

Fortran のための配列断面化構文

配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。

print array-expression (first-expression .. last-expression : stride-expression)

array-expression 配列ポインタ型に評価される式
first-expression 範囲内の最初の要素は、出力される最初の要素。下限にデフォルト設定
last-expression 範囲内の最後の要素。ただし刻み幅が 1 より大きい場合、出力される最後の要素とはならない。上限にデフォルト設定
stride-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% f77 -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(3:3, 1:4) =
        (1,4)   14
        (2,4)   24
        (3,4)   34
(dbx)





















配列の断面

2 次元の矩形配列の断面の例を示します。ここでは、刻み値が省略され、デフォルト値の 1 が使用されます。

print arr(201:203, 101:105)

このコマンドは、大型配列の要素のブロックを出力します。stride-expression が省略され、デフォルトの刻み値である 1 が使用されていることに注意してください。

最初の 2 つの式 (201:203) は、この 2 次元配列の第 1 次元 (3 行で構成される列) を指定します。配列の断面は行 201 から始まり、行 203 で終わります。次の 2 つの式 (101:105) は最初の組とコンマで区切られ、第 2 次元の配列の断面を定義します。配列の断面は列 101 から始まり、列 105 で終わります。

刻み幅

print コマンドで刻み幅を指定すると、配列の断面に含まれる特定の要素だけが評価されます。

配列の断面のための構文の 3 番目の式 (stride-expression) は、刻み幅の長さを指定します。stride-expression 個の要素のうちの先頭の 1 つが評価され、残りの stride-expression -1 個の要素は評価されません。刻み幅のデフォルト値は 1 です。このとき、指定された配列の断面のすべての要素が評価されます。

ここに、上の例で使用したものと同じ配列があります。今度は、print コマンドの第 2 次元の配列の断面の定義に刻み幅の値として 2 を加えます。

print arr(201:203, 101:105:2)

刻み値として 2 を指定すると、各行を構成する要素が 1 つおきに出力されます。

print コマンドの配列の断面の定義を構成する式を省略すると、配列の宣言されたサイズに等しいデフォルト値が使用されます。このような簡易構文を使用した例を以下に示します。

1 次元配列の場合

print arr

デフォルトの境界で配列全体を出力します。

print arr(:)

デフォルトの境界とデフォルトの刻み (1) で、配列全体を出力します。

print arr(::stride-expression)

配列全体を stride-expression で指定された刻み幅で出力します。


2 次元配列の場合、次のコマンドは配列全体を出力します。

print arr

2 次元配列の第 2 次元を構成する要素を 2 つおきに出力します。

print arr (:,::3)


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引