dbx コマンドによるデバッグ | ![]() ![]() ![]() ![]() ![]() |
第 8 章
データの評価と表示
dbx
では、次の 2 通りの方法でデータをチェックすることができます。変数と式の評価
この節は、
dbx
を使用して変数および式を評価する方法について説明します。実際に使用される変数を確認する
dbx
がどの変数を評価するか確かでないときは、which
コマンドを使用してdbx
が使用する完全修飾名を調べてください 。
変数名が定義されているほかの関数やファイルを調べるには、
whereis
コマンドを使用します。詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「which コマンド」および「where コマンド」を参照してください。
現在の関数のスコープ外にある変数
現在の関数のスコープ外にある変数を評価 (監視) したい場合は、次のようにします。
- 関数の名前を修飾します。「スコープ決定演算子を使用してシンボルを修飾する」を参照してください。
- 現在の関数を変更することにより、関数を表示します。「停止位置とは別の部分のコードを表示する」を参照してください。
変数または式の値を出力する
式はすべて、現在の言語構文に従う必要がありますが、
dbx
がスコープおよび配列を処理するために導入したメタ構文は除きます。
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「print コマンド」を参照してください。
注 -dbx
は、C++ のdynamic_cast
およびtypeid
演算子をサポートしています。これらの 2 つの演算子で式を評価すると、dbx
は、コンパイラで提供された特定の rtti 関数へ呼び出しを行います。ソースが明示的に演算子を使用しない場合、これらの関数はコンパイラで生成されない場合があり、dbx
は式を評価することができません。
C++ での表示
C++ では、オブジェクトポインタに 2 つの型があります。1 つは静的な型で、ソースコードに定義されています。もう 1 つは動的な型です。
dbx
は、動的な型のオブジェクトに関する情報を提供できる場合があります。通常、オブジェクトに仮想関数テーブルの vtable が含まれる場合、
dbx
はこの vtable 内の情報を使用して、オブジェクトの型を正しく知ることができます。
display
コマンドに-r
(再帰的) オプションをつけて使用すると、dbx
は、クラスによって直接定義されたデータメンバーすべてと、基底クラスから継承されたものを表示することができます。
これらのコマンドには、
-d
または+d
オプションも使用できます。これは、dbxenv output_derived_type
でデフォルト動作を切り替えることができます。プロセスが何も実行されていないときに、
-d
フラグを使用するか、またはdbxenv output_dynamic_type
をon
に設定すると、プロセスがないときに動的情報にアクセスすることは不可能なため、プログラムは実行可能な状態ではないことを表すエラーメッセージが出されます。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは C++ では無効です)。C++ プログラムにおける無名引数を評価する
C++ では、次のように無名の引数を持つ関数を定義できます。
void tester(int)
{
};main(int, char **)
{
tester(1);
};無名の引数はプログラム内のほかの場所では使用できませんが、
dbx
は無名引数を評価できる形式にコード化します。その形式は次のとおりです。
_ARG%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
コマンドで「表示」を取り消すまで続けられます。特定の式だけを表示しないようにすることも、現在監視しているすべての式の表示を中止することも可能です。特定の変数または式の表示をオフにするには、次のようにします。
undisplayexpression
現在監視しているすべての変数の表示をオフにするには、次のようにします。
undisplay 0詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「undisplay コマンド」を参照してください。
「デバッグ」ウィンドウで、指定の式、またはすべての式の表示をオフにすることができます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「式の削除」を参照してください。
式に値を代入する
assignvariable
=
expression「デバッグ」ウィンドウで、変数へ値を代入することもできます。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「データ値の変更」を参照してください。
配列を評価する
配列の評価は、ほかの種類の変数を評価する場合と同じ方法で行います。
integer*4 arr(1:6, 4:7)
print arr(2,4)
dbx
コマンドの
- 配列の断面化 - 多次元配列から任意の矩形ブロックまたは n 次元の領域を取り出して出力します。
- 配列の刻み - 指定された配列の断面 (配列全体のこともあります) から決まったパターンで特定の要素だけを取り出して出力します。
刻みは配列の断面化を行うときに必要に応じて指定することができます (刻みのデフォルト値は 1 で、その場合は各要素を出力します)。
配列の断面化
C、C++、Fortran では、
display
コマンドによって、配列の断面化を行うことができます。C と C++ での配列の断面化の構文
配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。
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] = 6Fortran のための配列断面化構文
配列の各次元を断面化するための
最初、最後、および刻み幅の各式は、整数に評価されなければならない任意の式です。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
(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)
(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
で終わります。刻み幅
配列の断面のための構文の 3 番目の式 (stride-expression) は、刻み幅の長さを指定します。stride-expression 個の要素のうちの先頭の 1 つが評価され、残りの stride-expression -1 個の要素は評価されません。刻み幅のデフォルト値は 1 です。このとき、指定された配列の断面のすべての要素が評価されます。
ここに、上の例で使用したものと同じ配列があります。今度は、
print arr(201:203, 101:105:2)刻み値として 2 を指定すると、各行を構成する要素が 1 つおきに出力されます。
![]()
print arr
2 次元配列の第 2 次元を構成する要素を 2 つおきに出力します。
print arr (:,::3)
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |