Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


C.6.2 言語式とアドレス式における構造体

C++の言語式とアドレス式でサポートされる構造体を次に示します。

シンボル 構造体
[ ] 添字付け
.(ピリオド) 構造体の構成要素の選択
-> ポインタ間接参照
:: スコープ解決

C.6.3 データ型

サポートされるC++のデータ型を次に示します。

C++ データ型 オペレーティング・システム・データ型名
__int64(Alpha) クォドワード整数(Q)
unsigned __int64(Alpha) クォドワード符号なし整数(QU)
__int32(Alpha) ロングワード整数(L)
unsigned __int32(Alpha) ロングワード符号なし整数(LU)
int ロングワード整数(L)
unsigned int ロングワード符号なし整数(LU)
__int16(Alpha) ワード整数(W)
unsigned __int16(Alpha) ワード符号なし整数(WU)
short int ワード整数(W)
unsigned short int ワード符号なし整数(WU)
char バイト整数(B)
unsigned char バイト符号なし整数(BU)
float F浮動小数点数(F)
__f_float(Alpha) F浮動小数点数(F)
double D浮動小数点数(D)
double G浮動小数点数(G)
__g_float(Alpha) G浮動小数点数(G)
float(Alpha) IEEE S浮動小数点数(FS)
__s_float(Alpha) IEEE S浮動小数点数(FS)
double(Alpha) IEEE T浮動小数点数(FT)
__t_float(Alpha) IEEE T浮動小数点数(FT)
enum (なし)
struct (なし)
class (なし)
union (なし)
Pointer Type (なし)
Array Type (なし)

float型の浮動小数点数は,コンパイラのスイッチに応じて,F_FloatingまたはIEEE S_Floatingとして表現されます。

double型の浮動小数点数は,コンパイラのスイッチに応じて,IEEE T_Floating,D_Floating,またはG_Floatingとして表現されます。

C.6.4 大文字小文字の区別

C++では,シンボル名の大文字小文字が区別されます。つまり,大文字と小文字は異なる文字として扱われます。

C.6.5 クラスに関する情報の表示

クラス宣言に関する静的な情報を表示するには,SHOW SYMBOLコマンドを使用します。クラス・オブジェクトに関する動的な情報を表示するには,EXAMINE コマンドを使用します(付録 C.6.6 項 を参照)。

SHOW SYMBOL/FULL コマンドを使用すると,次の情報を含むクラス型宣言を表示することができます。

データ・メンバ(静的なデータ・メンバを含む)
メンバ関数(静的なメンバ関数を含む)
コンストラクタとデストラクタ
基底クラスと派生クラス

例を示します。


dbg> SHOW SYMBOL /TYPE C 
type C 
    struct(C, 13 components), size: 40 bytes 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
dbg> SHOW SYMBOL /FULL C 
type C 
    struct(C, 13 components), size: 40 bytes 
      inherits: B1, size: 24 bytes, offset: 0 bytes 
                B2, size: 24 bytes, offset: 12 bytes 
      contains the following members: 
        overloaded name C::g 
               instance C::g(int)
               instance C::g(long)
               instance C::g(char)
        j : longword integer, size: 4 bytes, offset: 24 bytes 
        s : longword integer, size: 4 bytes, address: #  [static] 
        overloaded name C 
        int ==(C &)
        C & =(const C &)
        void h(void)  [virtual] 
        ~C(void)
        __vptr : typed pointer type, size: 4 bytes, offset: 4 bytes 
        __bptr : typed pointer type, size: 4 bytes, offset: 8 bytes 
        structure has been padded, size: 4 bytes, offset: 36 bytes 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
DBG> 

SHOW SYMBOL/FULL コマンドでは,基底クラスまたは派生クラスのメンバが表示されない点に注意してください。これらのクラスのメンバについては,SHOW SYMBOL/FULL base_class_name,および SHOW SYMBOL/FULL derived_class_name コマンドを使用します。例を示します。


DBG> SHOW SYMBOL /FULL B1 
type B1 
    struct(B1, 8 components), size: 24 bytes 
      inherits: virtual A 
      is inherited by: C 
      contains the following members: 
        i : longword integer, size: 4 bytes, offset: 0 bytes 
        overloaded name B1 
        void f(void)
        B1 & =(const B1 &)
        void h(void)  [virtual] 
        __vptr : typed pointer type, size: 4 bytes, offset: 4 bytes 
        __bptr : typed pointer type, size: 4 bytes, offset: 8 bytes 
        structure has been padded, size: 12 bytes, offset: 12 bytes 
overloaded name B1 
       instance B1::B1(void)
       instance B1::B1(const B1 &)
DBG> 

クラス・メンバに関する情報を表示するには,SHOW SYMBOL/FULL class_member_name コマンドを使用します。例を示します。


DBG> SHOW SYMBOL /FULL j 
record component C::j 
    address: offset 24 bytes from beginning of record 
    atomic type, longword integer, size: 4 bytes 
record component A::j 
    address: offset 4 bytes from beginning of record 
    atomic type, longword integer, size: 4 bytes 
DBG> 

オブジェクトに関する詳細情報を表示するには,SHOW SYMBOL/FULL コマンドを使用します。

現在,SHOW SYMBOL コマンドは修飾された名前をサポートしていない点に注意してください。たとえば,次に示すコマンドは現在サポートされていません。


SHOW SYMBOL    object_name.function_name 
 
SHOW SYMBOL    class_name::member_name 

C.6.6 オブジェクトに関する情報の表示

デバッガはオブジェクトに関する情報を表示するために,C++のシンボル検索規則を使用します。現在のオブジェクトの値を表示するには,EXAMINEコマンドを使用します。例を示します。


DBG> EXAMINE a 
CXXDOCEXAMPLE\main\a: struct A 
    i:  0 
    j:  1 
    __vptr:     131168 
 

また,EXAMINEコマンドでメンバ・アクセス演算子であるピリオド(.)と右矢印(->)を使用することによって,個々のオブジェクト・メンバを表示することもできます。例を示します。


DBG> EXAMINE ptr 
CXXDOCEXAMPLE\main\ptr:         40 
DBG> EXAMINE *ptr 
*CXXDOCEXAMPLE\main\ptr: struct A 
    i:  0 
    j:  1 
    __vptr:     131168 
DBG> EXAMINE a.i 
CXXDOCEXAMPLE\main\a.i: 0 
DBG> EXAMINE ptr->i 
CXXDOCEXAMPLE\main\ptr->i:      0 
DBG> 

デバッガは,仮想的な継承を正しく解釈します。例を示します。


DBG> EXAMINE c 
CXXDOCEXAMPLE\main\c: struct C 
    inherit B1 
        inherit virtual A 
            i:  8 
            j:  9 
            __vptr:     131200 
        i:      10 
        __vptr: 131232 
        __bptr: 131104 
    inherit B2 
        inherit virtual A (already printed, see above)
        i:      11 
        __vptr: 131280 
        __bptr: 131152 
    j:  12 
    __vptr:     131232 
    __bptr:     131104 
DBG> 

グローバル変数を参照したり,基底クラスの隠蔽メンバを参照したり,継承されたメンバを明示的に参照したり,現在のコンテキストによって隠蔽されたメンバを命名したりするために,スコープ解決演算子(::)を使用します。例を示します。


DBG> EXAMINE c.j 
CXXDOCEXAMPLE\main\c.j: 12 
DBG> EXAMINE c.A::j 
CXXDOCEXAMPLE\main\c.A::j:      9 
DBG> EXAMINE x 
CXXDOCEXAMPLE\main\x:   101 
DBG> EXAMINE ::x 
CXXDOCEXAMPLE\x:        13 
DBG> 

デバッガはあいまいなメンバ参照を解決するために,参照を満たすメンバをリスト表示して,メンバに対するあいまいでない参照の指定を求めます。例を示します。


DBG> EXAMINE c.i 
%DEBUG-I-AMBIGUOUS, 'i' is ambiguous, matching the following 
    CXXDOCEXAMPLE\main\c.B1::i 
    CXXDOCEXAMPLE\main\c.B2::i 
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> EXAMINE c.B1::i 
CXXDOCEXAMPLE\main\c.B1::i:     10 
DBG> 

静的なデータ・メンバを参照するには,スコープ解決演算子(::)を使用します。例を示します。


DBG> EXAMINE c.s 
CXXDOCEXAMPLE\main\c.s: 42 
DBG> EXAMINE C::s 
C::s:   42 
DBG> 

オブジェクトのクラス型を表示するには,SHOW SYMBOL/FULLコマンドを使用します(付録 C.6.5 項 を参照)。

C.6.7 ウォッチポイントの設定

オブジェクトのウォッチポイントを設定することができます。静的でないすべてのデータ・メンバはウォッチされます(基底クラス中のデータ・メンバを含みます)。オブジェクト上にウォッチポイントを設定すると,静的なデータ・メンバはウォッチされません。ただし,静的なデータ・メンバについて,明示的にウォッチポイントを設定することは可能です。例を示します。


DBG> SET WATCH c 
%DEBUG-I-WPTTRACE, non-static watchpoint, tracing every instruction 
DBG> GO 
watch of CXXDOCEXAMPLE\main\c.i at CXXDOCEXAMPLE\main\%LINE 50+8 
    50:     c.B2::i++; 
   old value: 11 
   new value: 12 
break at CXXDOCEXAMPLE\main\%LINE 51 
    51:     c.s++; 
DBG> SET WATCH c.s 
DBG> GO 
watch of CXXDOCEXAMPLE\main\c.s at CXXDOCEXAMPLE\main\%LINE 51+16 
    51:     c.s++; 
   old value: 43 
   new value: 44 
break at CXXDOCEXAMPLE\main\%LINE 53 
    53:     b1.f(); 
DBG> 

C.6.8 デバッグ関数

デバッガはメンバ関数の情報を表示するために,C++シンボル検索ルールを使用します。例を示します。


DBG> EXAMINE /SOURCE b1.f 
module CXXDOCEXAMPLE 
    14:     void f(){} 
DBG> SET BREAK B1::f 
DBG> GO 
break at routine B1::f 
    14:     void f(){} 
DBG> 

デバッガは,thisポインタに対する参照を正しく解釈します。例を示します。


DBG> EXAMINE this 
B1::f::this:            16 
DBG> EXAMINE *this 
*B1::f::this: struct B1 
    inherit virtual A 
        i:      2 
        j:      3 
        __vptr: 131184 
    i:  4 
    __vptr:     131248 
    __bptr:     131120 
DBG> EXAMINE this->i 
B1::f::this->i: 4 
DBG> EXAMINE this->j 
B1::f::this->A::j:      3 
DBG>EXAMINE i 
B1::f::this->i: 4 
DBG> EXAMINE j 
B1::f::this->A::j:      3 
DBG> 

デバッガは,仮想メンバ関数を正しく参照します。例を示します。


DBG> EXAMINE /SOURCE %LINE 53 
module CXXDOCEXAMPLE 
    53:     b1.f(); 
DBG> SET BREAK this->h 
DBG> SHOW BREAK 
breakpoint at routine B1::f 
breakpoint at routine B1::h 
!! 
!! We are at the call to B1::f made at 'c.B1::f()'. 
!! Here this->h matches C::h. 
!! 
DBG> GO 
break at routine B1::f 
    14:     void f(){} 
DBG> EXAMINE /SOURCE %LINE 54 
module CXXDOCEXAMPLE 
    54:     c.B1::f(); 
DBG> SET BREAK this->h 
DBG> SHOW BREAK 
breakpoint at routine B1::f 
breakpoint at routine B1::h 
breakpoint at routine C::h 
!! 
!! Handling overloaded functions 
!! 
DBG> SET BREAK g 
%DEBUG-I-NOTUNQOVR, symbol 'g' is overloaded 
overloaded name C::g 
       instance C::g(int)
       instance C::g(long)
       instance C::g(char)
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> SET BREAK g(int)
 
DBG> CANCEL BREAK/ALL 
DBG> 

オーバロードされた関数上にブレークを設定すると,デバッガは関数のインスタンスをリスト表示し,コンパイラが生成した固有のラベルを使って,正しいインスタンスを指定するよう求めます。デバッガ・バージョン 7.2を使った例を示します。


DBG> SET BREAK g 
%DEBUG-I-NOTUNQOVR, symbol 'g' is overloaded 
overloaded name C::g 
       instance void g(int)
       instance void g(long)
       instance void g(char *)
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> SET BREAK g(int)
DBG> 

注意

オーバロードされた関数についての表示方法と指定方法は,OpenVMSデバッガ・バージョン 7.1Cとは異なります。デバッガ・バージョン 7.1Cを使った例を示します。

デバッガは,コンストラクタ,デストラクタ,および演算子のデバッグをサポートします。例を示します。


DBG> SET BREAK C 
%DEBUG-I-NOTUNQOVR, symbol 'C' is overloaded 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> SHOW SYMBOL /FULL ~C 
routine C::~C 
   type signature: ~C(void)
    code address: #, size: 152 bytes 
    procedure descriptor address: #    
DBG> SET BREAK %NAME'~C' 
DBG> SET BREAK %NAME'==' 
%DEBUG-W-UNALLOCATED, '==' is not allocated in memory(optimized away)
%DEBUG-E-CMDFAILED, the SET BREAK command has failed 
DBG> SHOW SYMBOL /FULL == 
routine C::== 
    type signature: int ==(C &)
    address: unallocated 
DBG> SHOW BREAK 
breakpoint at routine C::~C 
DBG> 

C.6.9 C++デバッガ・サポートに関する制限事項

C++プログラムをデバッグする場合は,次の制限事項が適用されます。

例 C-1 C++ プログラム例,CXXDOCEXAMPLE.C

int x = 0; 
 
struct A 
    { 
    int i,j; 
    void f(){} 
    virtual void h(){}; 
    A(){ i=x++; j=x++; } 
    }; 
struct B1 : virtual A 
    { 
    int i; 
    void f(){} 
    virtual void h(){} 
    B1(){ i=x++; } 
    }; 
struct B2 : virtual A 
    { 
    int i; 
    void f(){} 
    virtual void h(){} 
    B2(){ i=x++; } 
    }; 
struct C : B1, B2 
    { 
    int j; 
    static int s; 
    void g(int){} 
    void g(long){} 
    void g(char *){} 
    void h(){} 
    operator ==(C&){ return 0; } 
    C(){ j=x++; } 
    ~C(){} 
    }; 
 
int C::s = 42; 
main()
    { 
    A a; B1 b1; B2 b2; C c; 
    A *ptr = &a; 
    int x = 101; 
    x++; 
    
    c.s++; 
    c.B2::i++; 
    c.s++; 
    
    b1.f(); 
    c.B1::f(); 
    } 

例 C-2例 C-1 に含まれているプログラムのデバッグ・セッションの例です。

例 C-2 C++ デバッグ例

DBG> GO 
break at routine CXXDOCEXAMPLE\main 
    44:     A a; B1 b1; B2 b2; C c; 
DBG> STEP 
stepped to CXXDOCEXAMPLE\main\%LINE 45 
    45:     A *ptr = &a; 
DBG> STEP 
stepped to CXXDOCEXAMPLE\main\%LINE 46 
    46:     int x = 101; 
DBG> STEP 
stepped to CXXDOCEXAMPLE\main\%LINE 47 
    47:     x++; 
!! 
!! Displaying class information 
!! 
DBG> SHOW SYMBOL /TYPE C 
type C 
    struct(C, 13 components), size: 40 bytes 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
DBG> SHOW SYMBOL /FULL C 
type C 
    struct(C, 13 components), size: 40 bytes 
      inherits: B1, size: 24 bytes, offset: 0 bytes 
                B2, size: 24 bytes, offset: 12 bytes 
      contains the following members: 
        overloaded name C::g 
               instance C::g(int)
               instance C::g(long)
               instance C::g(char)
        j : longword integer, size: 4 bytes, offset: 24 bytes 
        s : longword integer, size: 4 bytes, address: #  [static] 
        overloaded name C 
        int ==(C &)
        C & =(const C &)
        void h(void)  [virtual] 
        ~C(void)
        __vptr : typed pointer type, size: 4 bytes, offset: 4 bytes 
        __bptr : typed pointer type, size: 4 bytes, offset: 8 bytes 
        structure has been padded, size: 4 bytes, offset: 36 bytes 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
!! 
!! Displaying information about base classes 
!! 
DBG> SHOW SYMBOL /FULL B1 
type B1 
    struct(B1, 8 components), size: 24 bytes 
      inherits: virtual A 
      is inherited by: C 
      contains the following members: 
        i : longword integer, size: 4 bytes, offset: 0 bytes 
        overloaded name B1 
        void f(void)
        B1 & =(const B1 &)
        void h(void)  [virtual] 
        __vptr : typed pointer type, size: 4 bytes, offset: 4 bytes 
        __bptr : typed pointer type, size: 4 bytes, offset: 8 bytes 
        structure has been padded, size: 12 bytes, offset: 12 bytes 
overloaded name B1 
       instance B1::B1(void)
       instance B1::B1(const B1 &)
!! 
!! Displaying class member information 
!! 
DBG> SHOW SYMBOL /FULL j 
record component C::j 
    address: offset 24 bytes from beginning of record 
    atomic type, longword integer, size: 4 bytes 
record component A::j 
    address: offset 4 bytes from beginning of record 
    atomic type, longword integer, size: 4 bytes 
!! 
!! Simple object display 
!! 
DBG> EXAMINE a 
CXXDOCEXAMPLE\main\a: struct A 
    i:  0 
    j:  1 
    __vptr:     131168 
!! 
!! Using *, -> and . to access objects and members 
!! 
DBG> EXAMINE ptr 
CXXDOCEXAMPLE\main\ptr:         40 
DBG> EXAMINE *ptr 
*CXXDOCEXAMPLE\main\ptr: struct A 
    i:  0 
    j:  1 
    __vptr:     131168 
DBG> EXAMINE a.i 
CXXDOCEXAMPLE\main\a.i: 0 
DBG> EXAMINE ptr->i 
CXXDOCEXAMPLE\main\ptr->i:      0 
!! 
!! Complicated object example 
!! 
DBG> EXAMINE c 
CXXDOCEXAMPLE\main\c: struct C 
    inherit B1 
        inherit virtual A 
            i:  8 
            j:  9 
            __vptr:     131200 
        i:      10 
        __vptr: 131232 
        __bptr: 131104 
    inherit B2 
        inherit virtual A (already printed, see above)
        i:      11 
        __vptr: 131280 
        __bptr: 131152 
    j:  12 
    __vptr:     131232 
    __bptr:     131104 
!! 
!! The debugger using C++ symbol lookup rules(to match c.j)
!! and then the use of :: to specify a particular member named j. 
!! 
DBG> EXAMINE c.j 
CXXDOCEXAMPLE\main\c.j: 12 
DBG> EXAMINE c.A::j 
CXXDOCEXAMPLE\main\c.A::j:      9 
!! 
!! Using the global scope resolution operator. 
!! 
DBG> EXAMINE x 
CXXDOCEXAMPLE\main\x:   101 
DBG> EXAMINE ::x 
CXXDOCEXAMPLE\x:        13 
!! 
!! Handling ambiguous member references. 
!! 
DBG> EXAMINE c.i 
%DEBUG-I-AMBIGUOUS, 'i' is ambiguous, matching the following 
    CXXDOCEXAMPLE\main\c.B1::i 
    CXXDOCEXAMPLE\main\c.B2::i 
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> EXAMINE c.B1::i 
CXXDOCEXAMPLE\main\c.B1::i:     10 
!! 
!! Refering to static data members: with . and with :: 
!! 
DBG> EXAMINE c.s 
CXXDOCEXAMPLE\main\c.s: 42 
DBG> EXAMINE C::s 
C::s:   42 
!! 
!! Setting watchpoints on objects.  All non-static data members 
!! are watched(including those in base classes).  Static data 
!! members are not watched.  Of course watchpoints on static data 
!! members can be set explicitly. 
!! 
DBG> SET WATCH c 
%DEBUG-I-WPTTRACE, non-static watchpoint, tracing every instruction 
DBG> GO 
watch of CXXDOCEXAMPLE\main\c.i at CXXDOCEXAMPLE\main\%LINE 50+8 
    50:     c.B2::i++; 
   old value: 11 
   new value: 12 
break at CXXDOCEXAMPLE\main\%LINE 51 
    51:     c.s++; 
DBG> SET WATCH c.s 
DBG> GO 
watch of CXXDOCEXAMPLE\main\c.s at CXXDOCEXAMPLE\main\%LINE 51+16 
    51:     c.s++; 
   old value: 43 
   new value: 44 
break at CXXDOCEXAMPLE\main\%LINE 53 
    53:     b1.f(); 
!! 
!! Basic member lookup applies to functions. 
!! 
DBG> EXAMINE /SOURCE b1.f 
module CXXDOCEXAMPLE 
    14:     void f(){} 
DBG> SET BREAK B1::f 
DBG> GO 
break at routine B1::f 
    14:     void f(){} 
!! 
!! Support for 'this'. 
!! 
DBG> EXAMINE this 
B1::f::this:            16 
DBG> EXAMINE *this 
*B1::f::this: struct B1 
    inherit virtual A 
        i:      2 
        j:      3 
        __vptr: 131184 
    i:  4 
    __vptr:     131248 
    __bptr:     131120 
DBG> EXAMINE this->i 
B1::f::this->i: 4 
DBG> EXAMINE this->j 
B1::f::this->A::j:      3 
DBG>EXAMINE i 
B1::f::this->i: 4 
DBG> EXAMINE j 
B1::f::this->A::j:      3 
!! 
!! Support for virtual functions. 
!! 
!! We are at the call to B1::f made at 'b1.f()'. 
!! Here this->h matches B1::h. 
!! 
DBG> EXAMINE /SOURCE %LINE 53 
module CXXDOCEXAMPLE 
    53:     b1.f(); 
DBG> SET BREAK this->h 
DBG> SHOW BREAK 
breakpoint at routine B1::f 
breakpoint at routine B1::h 
!! 
!! We are at the call to B1::f made at 'c.B1::f()'. 
!! Here this->h matches C::h. 
!! 
DBG> GO 
break at routine B1::f 
    14:     void f(){} 
DBG> EXAMINE /SOURCE %LINE 54 
module CXXDOCEXAMPLE 
    54:     c.B1::f(); 
DBG> SET BREAK this->h 
DBG> SHOW BREAK 
breakpoint at routine B1::f 
breakpoint at routine B1::h 
breakpoint at routine C::h 
!! 
!! Handling overloaded functions 
!! 
DBG> SET BREAK g 
%DEBUG-I-NOTUNQOVR, symbol 'g' is overloaded 
overloaded name C::g 
       instance C::g(int)
       instance C::g(long)
       instance C::g(char)
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> SET BREAK g(int)
 
DBG> CANCEL BREAK/ALL 
!! 
!! Working with constructors, destructors, and operators. 
!! 
DBG> SET BREAK C 
%DEBUG-I-NOTUNQOVR, symbol 'C' is overloaded 
overloaded name C 
       instance C::C(void)
       instance C::C(const C &)
%DEBUG-E-REENTER, reenter the command using a more precise pathname 
DBG> SHOW SYMBOL /FULL ~C 
routine C::~C 
   type signature: ~C(void)
    code address: #, size: 152 bytes 
    procedure descriptor address: #    
DBG> SET BREAK %NAME'~C' 
DBG> SET BREAK %NAME'==' 
%DEBUG-W-UNALLOCATED, '==' is not allocated in memory(optimized away)
%DEBUG-E-CMDFAILED, the SET BREAK command has failed 
DBG> SHOW SYMBOL /FULL == 
routine C::== 
    type signature: int ==(C &)
    address: unallocated 
DBG> SHOW BREAK 
breakpoint at routine C::~C 
DBG> EXIT 


前へ 次へ 目次 索引