dbx では、次の 2 通りの方法でデータをチェックすることができます。
データの評価 (print) - 任意の式の値を検査します。
データの表示 (display) - プログラムが停止するたびに式の値を検査し監視することができます。
この章では、データの評価方法、式、変数、その他のデータ構造の値の表示方法、式への値の代入方法について説明します。
この章は次の各節から構成されています。
この節では、変数や式を評価する方法を示します。
dbx がどの変数を評価するか確かでないときは、which コマンドを使用して dbx が使用する完全修飾名を調べてください 。
変数名が定義されているほかの関数やファイルを調べるには、whereis コマンドを使用します。
現在の関数のスコープ外にある変数を評価 (監視) したい場合は、次のようにします。
関数の名前を修飾します。
関数内まで実行します。すなわち、現在の関数を変更します。
変数または式の値を印刷します。
式の構文はすべて、現在の言語に従わなければなりませんが、dbx がスコープと配列を処理するために導入したメタ構文は除きます。
print expression
C++ では、オブジェクトポインタに 2 つの型があります。1 つは静的な型で、ソースコードに定義されています。もう 1 つは動的な型です。dbx は、動的な型のオブジェクトに関する情報を提供できる場合があります。
通常、オブジェクトに仮想関数テーブルの vtable が含まれる場合、dbx はこの vtable 内の情報を使用して、オブジェクトの型を正しく知ることができます。
print または display コマンドに -r (再帰的) オプションをつけて使用すると、dbx は、クラスによって直接定義されたデータメンバーすべてと、基底クラスから継承されたものを表示することができます。
これらのコマンドには、-d または +d オプションも使用できます。これは、dbxenv output_derived_type でデフォルト動作を切り替えることができます。
プロセスが何も実行されていないときに、-d フラグを使用するか、またはdbxenv output_dynamic_type を on に設定すると、プロセスがないときに動的情報にアクセスすることは不可能なため、プログラムは実行可能な状態ではないことを表すエラーメッセージが出されます。仮想継承から動的な型の検索を試みると、クラスポインタの不正なキャストを表すエラーメッセージが生成されます (仮想基底クラスから派生クラスへのキャストは 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);
無名の関数引数を評価 (表示) するには、次のようにします。
(dbx) print _ARG1 _ARG1 = 4
ポインタを間接参照すると、ポインタが指している内容に格納された値を参照できます。
ポインタを間接参照すると、dbx は評価結果を表示します。次の例は、ポインタを間接参照した場合です。
(dbx) print *t *t = { a = 4 }
プログラムが停止するたびに式の値を監視することにより、特定の式または変数がいつどのように変化するかを効果的に知ることができます。display コマンドは、指定されている 1 つまたは複数の式または変数を監視するように dbx に命令します。監視は、undisplay コマンドによって取り消されるまで続けられます。
プログラムが停止するたびに変数または式の値を表示するには、次のようにします。
display expression, ...
一度に複数の変数を監視できます。オプションを指定しないで display コマンドを使用すると、監視対象のすべての式が表示されます。
display
監視している変数の値の表示は、undisplay コマンドで「表示」を取り消すまで続けられます。特定の式だけを表示しないようにすることも、現在監視しているすべての式の表示を中止することも可能です。
特定の変数または式の表示をオフにするには、次のようにします。
undisplay expression
現在監視しているすべての変数の表示をオフにするには、次のようにします。
undisplay 0
assign variable = expression
配列の評価は、ほかの種類の変数を評価する場合と同じ方法で行います。Fortran での配列の処理方法について詳しくは、第 17 章「dbx を使用した Fortran のデバッグ」を参照してください。
integer*4 arr(1:6, 4:7)
print arr(2,4)
dbx コマンド の print を使用して、大型の配列の一部を評価することができます。配列を評価するには、次の操作を行います。
配列の断面化
多次元配列から任意の矩形ブロックまたは n 次元の領域を取り出して出力します。
配列の刻み
指定された配列の断面 (配列全体のこともあります) から決まったパターンで特定の要素だけを取り出して出力します。
刻みは配列の断面化を行うときに必要に応じて指定することができます (刻みのデフォルト値は 1 で、その場合は各要素を出力します)。
C、C++、Fortran では、print および display コマンドによって、配列の断面化を行うことができます。
print arr-exp [first-exp .. last-exp : stride-exp]
arr-exp |
配列またはポインタ型に評価されるべき式 |
first-exp |
印刷される最初の要素。デフォルトは 0 |
last-exp |
印刷される最後の要素。その上限にデフォルト設定される |
stride-exp |
刻み幅。デフォルトは 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
配列の各次元を断面化するための print コマンドの完全な構文は次のとおりです。
(dbx) print arr(exp1:exp2:exp3)
exp1 |
配列の断面の先頭 |
exp2 |
配列の断面の終端 |
exp3 |
刻み幅の長さ (スキップされる要素の数は exp3 - 1) |
n 次元で配列の断面化を行うときは、各次元の配列断面化の定義をコンマで区切ります。
(dbx) print arr(exp1:exp2:exp3, exp1:exp2:exp3,...)
2 次元の矩形配列の断面の例を示します。ここでは、刻み値が省略され、デフォルト値の 1 が使用されます。
print arr(201:203, 101:105)
最初の 2 つの式 (201:203) は、この 2 次元配列の第 1 次元 (3 行で構成される列) を指定します。配列の断面は行 201 から始まり、行 203 で終わります。次の 2 つの式 (101:105) は最初の組とコンマで区切られ、第 2 次元の配列の断面を定義します。配列の断面は列 101 から始まり、列 105 で終わります。
print コマンドで刻み幅を指定すると、配列の断面に含まれる特定の要素だけが評価されます。
配列の断面のための構文の 3 番目の式 (exp3) は、刻み幅の長さを指定します。exp3 個の要素のうちの先頭の 1 つが評価され、残りの exp3 -1 個の要素は評価されません。刻み幅のデフォルト値は 1 です。このとき、指定された配列の断面のすべての要素が評価されます。
ここに、上の例で使用したものと同じ配列があります。今度は、print コマンドの第 2 次元の配列の断面の定義に刻み幅の値として 2 を加えます。
print arr(201:203, 101:105:2)
print コマンドの配列の断面の定義を構成する式を省略すると、配列の宣言されたサイズに等しいデフォルト値が使用されます。このような簡易構文を使用した例を以下に示します。
print arr | デフォルトの境界で配列全体を出力します。 |
print arr(:) | デフォルトの境界とデフォルトの刻み (1) で、配列全体を出力します。 |
print arr(::exp3) | 配列全体を exp3 で指定された刻み幅で出力します。 |
print arr
2 次元配列の第 2 次元を構成する要素を 2 つおきに出力します。
print arr (:,::3)
式 expression の値を印刷するには、次のように入力します。
print expression, ...
C++ で、式 expression の値を継承されたメンバーとともに印刷するには、次のように入力します。
print -r expression
C++ で、dbxenv output_inherited_members が on のときに式 expression の値の継承されたメンバーを印刷しないようにするには、次のように入力します。
print +r expression
C++ で、静的な型ではなく、派生型の式 expression の値を印刷するには、次のように入力します。
print -d [-r] expression
C++ で、dbxenv output_dynamic_type が on のときに式 expression の静的な型を印刷するには、次のように入力します。
print -+ [-r] expression
prettyprint 関数を呼び出すには、次のように入力します。
print -p expression
dbxenv output_pretty_print が on のときに、prettyprint 関数を呼び出さないようにするには、次のように入力します。
print +p expression
左側 (変数名または式) を印刷しないようにするには、次のように入力します。式が文字列 (char *) の場合は、アドレスを印刷しないで、文字列の raw 文字だけを引用符なしで印刷してください。
print -l expression
整数、文字列、または浮動小数点式の形式 format を使用するには、次のように入力します。
print -f format expression
左側 (変数名または式) を印刷しないで、指定の format を使用するには、次のように入力します。
print -F format expression
フラグ引数の終わりを知らせるには、次のように入力します。式が + または - で始まるときに便利です。
print -- expression