dbx コマンドによるデバッグ |
第 15 章
C++ のデバッグ
この章では、
dbx
による C++ の例外の処理方法と C++ テンプレートのデバッグについて説明します。これらの作業を実行するために使用するコマンドの要約とコード例も示します。C++ プログラムのコンパイルの詳細については、「最適化コードのデバッグ」を参照してください。
C++ での
dbx
の使用この章では C++ デバッグの 2 つの特殊な点を中心に説明しますが、
dbx
を使用すると、C++ プログラムのデバッグに次の機能を利用することができます。
- クラスと型定義の検索 (「型およびクラスの定義を調べる」参照)
- 継承されたデータメンバーの出力または表示 (「C++ での表示」参照)
- オブジェクトポインタに関する動的情報の検索 (「C++ での表示」参照)
- 仮想関数のデバッグ (「関数を呼び出す」参照)
- 実行時型情報の使用 (「変数または式の値を出力する」参照)
- クラスのすべてのメンバー関数に対するブレークポイントの設定 (「同じクラスのメンバー関数にブレークポイントを設定する」」参照)
- 多重定義されたすべてのメンバー関数に対するブレークポイントの設定 (「異なるクラスのメンバー関数にブレークポイントを設定する」参照)
- 多重定義されたすべての非メンバー関数に対するブレークポイントの設定 (「非メンバー関数に複数のブレークポイントを設定する」参照)
- 特定オブジェクトのすべてのメンバー関数に対するブレークポイントの設定 (「関数に stop ブレークポイントを設定する」参照)
- 多重定義された関数/データメンバーの処理 (「オブジェクトにブレークポイントを設定する」参照)
これらの詳細については、索引の C++ の下の項目を参照してください。
dbx
での例外処理プログラムは例外が発生すると実行を停止します。例外は、ゼロによる除算や配列のオーバーフローといったプログラムの障害を知らせるものです。ブロックを設定して、コードのどこかほかの場所で起こった式による例外を捕獲できます。
プログラムのデバッグ中、
dbx
を使用すると次のことが可能になります。
- スタックを解放する前に処理されていない例外を捕獲する
- 予期できない例外を捕獲する
- スタックを解放する前に、特定の例外が処理されたかどうかに関係なく捕獲する
- 特定の例外がプログラム内の特定の位置で起こった場合、それが捕獲される場所を決める
例外処理の発生個所で
step
コマンドを実行すると、スタックの解放時に実行された最初のデストラクタの先頭に制御が戻ります。step
を実行して、スタックの解放時に実行されたデストラクタを終了すると、制御は次のデストラクタの先頭に移ります。こうしてすべてのデストラクタが終了した後にstep
コマンドを実行すると、例外処理の原因を扱う捕獲ブロックに制御が移ります。例外処理コマンド
exception [-d | +d]
コマンド
exception
コマンドでは、デバッグ時にいつでも例外処理の型を確認できます。オプションなしでexception
コマンドを実行するときに表示される型は、dbx
環境変数output_dynamic_type
の設定で制御できます。
-d
オプションや+d
オプションを指定すると、環境変数の設定が無効になります。詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「exception コマンド」を参照してください。
intercept [-a|-x|
typename]
コマンドスタックを解放する前に、特定の型の例外を阻止または捕獲できます。
intercept
コマンドを引数を付けずに使用すると、阻止される型がリストで示されます。-a
を使用すると、すべての例外が阻止されます。阻止リストに型を追加するにはtypename
を使用します。-x
を使用すると、特定の型を阻止から除外することができます。たとえば、
int
を除くすべての型を阻止するには、次のように入力します。
(dbx)
intercept -a
(dbx)
intercept -x int
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「exception コマンド」を参照してください。
unintercept [-a|-x |
typename]
コマンド
unintercept
コマンドは、阻止リストから例外の型を削除するために使用します。引数を付けずにこのコマンドを使用すると、阻止されている型のリストが示されます (intercept
コマンドに同じ)。-a
を使用すると、リストから阻止された型すべてが削除されます。typename を使用すると、阻止リストから 1 つの型を削除することができます。-x
は、特定の型を阻止から除外することをやめるために使用します。詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「exception コマンド」を参照してください。
whocatches
typename コマンド
whocatches
コマンドは、typename の例外が実行の現時点で送出された場合に、どこで捕獲されるかを報告するものです。このコマンドは、例外がスタックのトップフレームから送出された場合に何が起こるかを検出する場合に使用します。typename を捕獲した元の送出の行番号、関数名、およびフレーム数が表示されます。
例外処理の例
次の例は、例外を含むサンプルプログラムを使用して、
dbx
で例外処理がどのように実行されるかを示しています。型int
の例外が、関数bar
で送出されて、次の捕獲ブロックで捕獲されています。
サンプルプログラムからの次のトランスクリプトは、
dbx
の例外処理機能を示しています。
C++ テンプレートでのデバッグ
dbx
は C++ テンプレートをサポートしています。クラスおよび関数テンプレートを含むプログラムをdbx
に読み込み、クラスや関数に対して使用する任意のdbx
コマンドをテンプレートに対して次のように呼び出すことができます。
- クラスまたは関数テンプレートのインスタンス化にブレークポイントを設定する(「stop inclass classname コマンド」、「stop infunction name コマンド」、「stop in function コマンド」、参照)
- すべてのクラスおよび関数テンプレートのインスタンス化のリストを出力する(「whereis name コマンド」参照)
- テンプレートおよびインスタンスの定義を表示する(「whatis name コマンド」参照)
- メンバーテンプレート関数と関数テンプレートのインスタンス化を呼び出す(「call function_name (parameters) コマンド」参照)
- 関数テンプレートのインスタンス化の値を出力する(「print コマンド」参照)
- 関数テンプレートのインスタンス化のソースコードを表示する(「list コマンド」参照)
テンプレートの例
次のコード例は、クラステンプレート
Array
とそのインスタンス化、および関数テンプレートsquare
とそのインスタンス化を示しています。
Array
はクラステンプレートsquare
は関数テンプレートArray<int>
はクラステンプレートインスタンス化 (テンプレートクラス)Array<int>::getlength
はテンプレートクラスのメンバー関数square(int,
int*)
とsquare(double
,double*)
は関数テンプレートのインスタンス化 (テンプレート関数)C++ テンプレートのコマンド
以下に示すコマンドは、テンプレートおよびインスタンス化されたテンプレートに使用します。クラスまたは型定義がわかったら、値の出力、ソースリストの表示、またはブレークポイントの設定を行うことができます。
whereis
name コマンド
whereis
コマンドは、関数テンプレートまたはクラステンプレートの、インスタンス化された関数やクラスの出現すべてのリストを出力するために使用します。
(dbx)whereis Array
メンバー関数: `Array<int>::Array(int)メンバー関数: `Array<double>::Array(int)クラステンプレートインスタンス: `Array<int>クラステンプレートインスタンス: `Array<double>クラステンプレート: `a.out`template_doc_2.cc`Array
(dbx)whereis square
関数テンプレートインスタンス: `square<int>(__type_0,__type_0*)関数テンプレートインスタンス: `square<double>(__type_0,__type_0*)関数テンプレート: `a.out`square
_type_0
パラメータは、0 番めのパラメータを表します。_type_1
パラメータは、次のパラメータを表します。詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「whereis コマンド」を参照してください。
whatis
name コマンド関数テンプレートおよびクラステンプレートと、インスタンス化された関数やクラスの定義を出力するために使用します。
(dbx)whatis Array
template<class T> class Array ;完全なテンプレート宣言を得るために次を実行してください:
'whatis -t Array<int>';
(dbx)whatis Array
複数の識別子 'Array'.次のどれかを選択してください:0) Cancel1) Array<int>::Array(int)2) Array<double>::Array(int>>1
Array<int>::Array(int 1);
(dbx)whatis square
複数の識別子 'square'.次のどれかを選択してください:0) Cancel1) square<int(__type_0,__type_0*)2) square<double>(__type_0,__type_0*)>2
void square<double>(double num, double *result);
クラステンプレートのインスタンス化の場合は、次のように入力します。
- 関数テンプレートのインスタンス化の場合は、次のように入力します。
(dbx)
whatis square(int, int*)
void square(int num, int *result);
- 詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「whatis コマンド」と「C++ で使用する whatis コマンド」を参照してください。
stop inclass
classname コマンドテンプレートクラスのすべてのメンバー関数を停止するには、次のように入力します。
(dbx)stop inclass Array
(2) stop inclass Array
stop inclass
コマンドを使用して、特定のテンプレートクラスのメンバー関数すべてにブレークポイントを設定します。
(dbx)stop inclass Array<int>
(2) stop inclass Array<int>
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「stop コマンド」を参照してください。
stop infunction
name コマンド
s
t
op infunction
コマンドを利用して、 指定した関数テンプレートのインスタンスにブレークポイントを設定します。
(dbx)
stop infunction square
(9) stop infunction square
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「stop コマンド」を参照してください。
stop in
function コマンド
stop
in
コマンドを使用して、あるテンプレートクラスのメンバー関数、またはテンプレート関数にブレークポイントを設定します。
(dbx)stop in Array<int>::Array<int>(int l)
(2) stop in Array<int>::Array<int>(int)
(dbx)stop in square(double, double*)
(6) stop in square(double, double*)詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「stop コマンド」を参照してください。
call
function_name(
parameters)
コマンドスコープ内で停止した場合に、関数インスタンス化やクラステンプレートのメンバー関数を明示的に呼び出すには、
call
コマンドを使用します。dbx
で正しいインスタンスを選択できない場合、表示されるメニューを利用します。
(dbx)call square(j,i)
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「call コマンド」を参照してください。
(dbx
) print iarray.getlength()
iarray.getlength() = 5
(dbx)whatis this
class Array<int> *this;
(dbx)print *this
*this = {
length = 5
array = 0x21608
}詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「print コマンド」を参照してください。
list
コマンド
list
コマンドを使用して、指定のインスタンス化された関数のソースリストを出力します。
(dbx)list square(int, int*)
詳細については、Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「list コマンド」を参照してください。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |