Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

C++ テンプレートでのデバッグ

dbx は C++ テンプレートをサポートしています。 クラスおよび関数テンプレートを含むプログラムを dbx に読み込み、クラスや関数に使用するテンプレートに対して任意の dbx コマンドを次のように呼び出すことができます。

テンプレートの例

次のコード例は、クラステンプレート Array とそのインスタンス化、および関数テンプレート square とそのインスタンス化を示しています。


 1        template<class C> void square(C num, C *result)
 2        {
 3             *result = num * num;
 4        }
 5    
 6        template<class T> class Array
 7        {
 8        public:
 9              int getlength(void)
10             {
11                    return length;
12              }
13    
14              T & operator[](int i)
15              {
16                    return array[i];
17             }
18    
19              Array(int l)
20              {
21                    length = l;
22                    array = new T[length];
23              }
24    
25              ~Array(void)
26              {
27                    delete [] array;
28              }
29    
30        private:
31              int length;
32              T *array;
33        };
34    
35        int main(void)
36        {
37              int i, j = 3;
38             square(j, &i);
39    
40             double d, e = 4.1;
41              square(e, &d);
42    
43              Array<int> iarray(5);
44              for (i = 0; i < iarray.getlength(); ++i)
45              {
46                   iarray[i] = i;
47             }
48    
49              Array<double> darray(5);
50              for (i = 0; i < darray.getlength(); ++i)
51             {
52                    darray[i] = i * 2.1;
53              }
54    
55              return 0;
56        }

この例の内容は次のとおりです。

C++ テンプレートのコマンド

次に示すコマンドは、テンプレートおよびインスタンス化されたテンプレートに使用します。クラスまたは型定義がわかったら、値の出力、ソースリストの表示、またはブレークポイントの設定を行うことができます。

whereis name コマンド

whereis コマンドは、関数テンプレートまたはクラステンプレートの、インスタンス化された関数やクラスの出現すべてのリストを出力するために使用します。

クラステンプレートの場合は、次のように入力します。


(dbx) whereis Array
member function: `Array<int>::Array(int)
member function: `Array<double>::Array(int)
class template instance: `Array<int>
class template instance: `Array<double>
class template: `a.out`template_doc_2.cc`Array

関数テンプレートの場合は、次のように入力します。


(dbx) whereis square
function template instance: `square<int>(__type_0,__type_0*)
function template instance: `square<double>(__type_0,__type_0*)

__type_0 パラメータは、0 番目のパラメータを表します。__type_1 パラメータは、次のパラメータを表します。

詳細については、whereis コマンド」を参照してください。

whatis name コマンド

関数テンプレートおよびクラステンプレートと、インスタンス化された関数やクラスの定義を出力するために使用します。

クラステンプレートの場合は、次のように入力します。


(dbx) whatis -t Array
template<class T> class Array
To get the full template declaration, try `whatis -t Array<int>’;

クラステンプレートの構造については次のように実行します。


(dbx) whatis Array
More than one identifier ’Array’.
Select one of the following:
 0) Cancel
 1) Array<int>::Array(int)
 2) Array<double>::Array(int>
> 1
Array<int>::Array(int 1);

関数テンプレートの場合は、次のように入力します。


(dbx) whatis square
More than one identifier ’square’.
Select one of the following:
 0) Cancel
 1) square<int(__type_0,__type_0*)
 2) square<double>(__type_0,__type_0*)
> 2
void square<double>(double num, double *result);

クラステンプレートのインスタンス化の場合は、次のように入力します。


(dbx) whatis -t Array<double>
class Array<double>; {
public:
    int Array<double>::getlength()
    double &Array<double>::operator [](int i);
    Array<double>::Array<double>(int l);
    Array<double>::~Array<double>();
private:
    int length;
    double *array;
};

関数テンプレートのインスタンス化の場合は、次のように入力します。


(dbx) whatis square(int, int*)
void square(int num, int *result);

詳細については、whatis コマンド」を参照してください。

stop inclass classname コマンド

テンプレートクラスのすべてのメンバー関数を停止するには、次のように入力します。


(dbx)stop inclass Array
(2) stop inclass Array

stop inclass コマンドを使用して、特定のテンプレートクラスのメンバー関数すべてにブレークポイントを設定します。


(dbx) stop inclass Array<int>
(2) stop inclass Array<int>

詳細については、stop コマンド」inclass classname [-recurse | -norecurse]を参照してください。

stop infunction name コマンド

stop infunction コマンドを利用して、指定した関数テンプレートのインスタンスにブレークポイントを設定します。


(dbx) stop infunction square
(9) stop infunction square

詳細については、stop コマンド」infunction functionを参照してください。

stop in function コマンド

stop in コマンドを使用して、テンプレートクラスのメンバー関数、またはテンプレート関数にブレークポイントを設定します。

クラスインスタンス化のメンバーの場合は、次のとおりです。


(dbx) stop in Array<int>::Array(int l)
(2) stop in Array<int>::Array(int)

関数インスタンス化の場合は、次のように入力します。


(dbx) stop in square(double, double*)
(6) stop in square(double, double*)

詳細については、stop コマンド」in functionを参照してください。

call function_name( parameters) コマンド

スコープ内で停止した場合に、インスタンス化された関数やクラステンプレートのメンバー関数を明示的に呼び出すには、call コマンドを使用します。dbx で正しいインスタンスを決定できない場合、選択肢となる番号が付いたインスタンスのリストが表示されます。


(dbx) call square(j,&i)

詳細については、call コマンド」を参照してください。

print コマンド

print コマンドを使用して、インスタンス化された関数またはクラステンプレートメンバー関数を評価します。


(dbx) print iarray.getlength()
iarray.getlength() = 5

print を使用して this ポインタを評価します。


(dbx) whatis this
class Array<int> *this;
(dbx) print *this
*this = {
    length = 5
    array   = 0x21608
}

詳細については、print コマンド」を参照してください。

list コマンド

list コマンドを使用して、指定のインスタンス化された関数のソースリストを出力します。


(dbx) list square(int, int*)

詳細については、list コマンド」を参照してください。