[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

# C 各言語に対するデバッガ・サポートの要約

VAXプロセッサでは，次の各DEC言語で記述されたプログラムに対してデバッガを使用することができます。

Ada | BASIC | BLISS | C
C++ | COBOL | DIBOL | Fortran
MACRO-32 | Pascal | PL/I | RPG II
SCAN |  |  |

Alphaプロセッサでは，次の各DEC言語で記述されたプログラムに対してデバッガを使用することができます。

Ada | BASIC | BLISS | C
C++ | COBOL | Fortran | MACRO- 32[1]
MACRO-64 | Pascal | PL/I |
[1] MACRO-32はAMACROコンパイラでコンパイルしなければなりません。

サポートされている言語のほとんどに共通するデバッグ方法については， マニュアルで説明しています。ヘルプ・トピックには各言語に固有の次の内容が含まれています。

# C.1 概要

デバッガは，各言語の構文，データ型，有効範囲規則を認識します。また， 各言語の演算子および式の構文も認識します。したがって，デバッガ・ コマンドを使用するときは，変数やその他のプログラム要素をプログラムのソース・ コードに記述する場合と同じように指定することができます。 また，その言語の構文を使用してソース言語の式の値を計算することもできます。

サポートされている言語のほとんどに共通するデバッグ方法については， マニュアルで説明しています。ヘルプ・トピックには各言語に固有の次の内容が含まれています。

- サポートされている言語式の演算子

- サポートされている言語式とアドレス式の構造

- サポートされているデータ型

- デバッガのサポートに制約がある場合はそれも含めた，各言語固有のその他の情報

言語固有のデバッガのサポートについての詳しい説明は，各言語とともに提供されるドキュメントを参照してください。

プログラムが複数の言語で記述されている場合，デバッグ・セッションの途中でデバッグ・ コンテキストを1つの言語から別の言語へ変更することができます。 選択する言語に対応したキーワードを指定して，SET LANGUAGEコマンドを使用してください。

VAXプロセッサでは，次のキーワードの1つを指定することができます。

ADA | BASIC | BLISS | C
C++ | COBOL | DIBOL | FORTRAN
MACRO | PASCAL | PLI | RPG
SCAN | UNKNOWN |  |

Alphaプロセッサでは，次のキーワードの1つを指定することができます。

ADA | AMACRO | BASIC | BLISS
C | C++ | COBOL | FORTRAN
MACRO | MACRO64 | PASCAL | UNKNOWN

サポートされていない言語で記述されたプログラムをデバッグするときは，SET LANGUAGE UNKNOWN コマンドを入力します。サポートされていない言語でのデバッガの使用性を最大限に高めるため， この設定によってデバッガはデータ形式と演算子のセットを幅広く受け入れるようになります。 この中には，サポートされている言語のうち，2，3の言語だけに固有のデータ形式と演算子も含まれます。 言語がUNKNOWNに設定されているときにデバッガが認識する演算子と構造についての詳しい説明は， オンライン・ ヘルプのLanguage_UNKNOWNを参照してください。

# C.2 Ada

次の各サブトピックではデバッガによるAdaのサポートについて説明します。Ada のタスキング・プログラムに固有の情報については，第17章も参照してください。

## C.2.1 Adaの名前とシンボル

次の各サブトピックでは，デバッガがサポートしているAdaの名前，シンボル， および定義済みの属性について説明します。

名前の一部分は言語式(たとえば，'FIRSTや'POSといった属性)である場合があるので注意してください。 このことは，EXAMINE，EVALUATE， DEPOSITの各コマンドでこれらの名前を使用する方法に影響します。列挙型の例については， オンライン・ヘルプのSpecifying_Attributes_with_ Enumeration_Typesを参照してください。

### C.2.1.1 Adaの名前

サポートされているAdaの名前を次に示します。

名前の種類 | デバッガのサポート
--- | ---
レキシカル要素 | Adaの識別子の構文規則を完全にサポートしている。 識別子ではなく演算子のシンボル(たとえば，+や*)である関数の名前には， 接頭辞%NAMEを付ける必要がある。また，演算子のシンボルは二重引用符で囲まなければならない。 数値リテラル，文字リテラル，文字列リテラル，予約語についてのAdaの規則を完全にサポートしている。 -2147483648から2147483647までの範囲で，符号付き整数リテラルを受け入れる。 コンテキストとアーキテクチュアに応じて浮動小数点数型を，F浮動小数点数型，D 浮動小数点数型，G浮動小数点数型，H浮動小数点数型， S浮動小数点型，またはT浮動小数点数型と解釈する。
添字付き要素 | 完全にサポートしている。
断面 | 断面全体，または断面の添字付き要素を確認および評価することができる。 断面の添字付き要素の格納だけができる。断面全体の格納はできない。
選択要素 | .allのallキーワードの使用も含めて，完全にサポートしている。
リテラル | nullキーワードも含めて，完全にサポートしている。
ブール・シンボル | 完全にサポートしている(TRUE ，FALSE)。
集合体 | EXAMINEコマンドでレコード全体および配列のオブジェクトを確認することができる。 配列またはレコードの構成要素に値を格納することができる。 文字列の値を格納する場合を除き，DEPOSITコマンドで集合体を使用することはできない。

### C.2.1.2 定義済みの属性

サポートされているAdaの定義済みの属性を次に示します。デバッガのSHOW SYMBOL/TYPE コマンドで得られる情報は，属性P'FIRST，P'LAST， P'LENGTH，P'SIZE，およびP'CONSTRAINEDによって得られる情報と同じですので注意してください。

属性 | デバッガのサポート
--- | ---
P'CONSTRAINED | 接頭辞Pが，判別子の付いたレコード・ オブジェクトを表す場合。P'CONSTRAINEDの値は，P の現在の状態(制約付き，または制約なし)を表す。
P'FIRST | 接頭辞Pが列挙型または列挙型の部分型を表す場合。P の下限を示す。
P'FIRST | 接頭辞Pが配列型に対応しているか，制約付き配列の部分型を表す場合。 最初の添字範囲の下限を示す。
P'FIRST(N) | 接頭辞Pが配列型に対応しているか， 制約付き配列の部分型を表す場合。N番目の添字範囲の下限を示す。
P'LAST | 接頭辞Pが列挙型または列挙型の部分型を表す場合。P の上限を示す。
P'LAST | 接頭辞Pが配列型に対応しているか， 制約付き配列の部分型を表す場合。最初の添字範囲の上限を示す。
P'LAST(N) | 接頭辞Pが配列型に対応しているか， 制約付き配列の部分型を表す場合。N番目の添字範囲の上限を示す。
P'LENGTH | 接頭辞Pが配列型に対応しているか，制約付き配列の部分型を表す場合。 最初の添字範囲の値の個数を示す(範囲が空の場合はゼロ) 。
P'LENGTH(N) | 接頭辞P が配列型に対応しているか，制約付き配列の部分型を表す場合。N番目の添字範囲の値の個数を示す( 範囲が空の場合はゼロ)。
P'POS(X) | 接頭辞Pが列挙型または列挙型の部分型を表す場合。 値Xの位置番号を示す。最初の位置番号は0。
P'PRED(X) | 接頭辞Pが列挙型または列挙型の部分型を表す場合。 位置番号がXより1小さいP型の値を示す。
P'SIZE | 接頭辞Pがオブジェクトを示す場合。 オブジェクトを保持するために割り当てられたビット数を示す。
P'SUCC(X) | 接頭辞P が列挙型または列挙型の部分型を表す場合。位置番号がXより1大きいP 型の値を示す。
P'VAL(N) | 接頭辞Pが列挙型または列挙型の部分型を表す場合。位置番号がNのP 型の値を示す。最初の位置番号は0。

#### C.2.1.2.1 列挙型の属性の指定

次の宣言について考えます。

         type DAY is
            (MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY);
         MY_DAY : DAY;

列挙型の属性の使用例を次に示します。属性の値を確認するのにEXAMINE コマンドを使用することはできませんので注意してください。これは属性が変数名ではないためです。 属性の値を確認するときは，代わりにEVALUATE コマンドを使用してください。これと同じ理由から，DEPOSITコマンドでは属性を:= 演算子の右辺にしか置けません。

         DBG> EVALUATE DAY'FIRST
         MON
         DBG> EVALUATE DAY'POS(WEDNESDAY)
         2
         DBG> EVALUATE DAY'VAL(4)
         FRI
         DBG> DEPOSIT MY_DAY := TUESDAY
         DBG> EVALUATE DAY'SUCC(MY_DAY)
         WED
         DBG> DEPOSIT . := DAY'PRED(MY_DAY)
         DBG> EXAMINE .
         EXAMPLE.MY_DAY: MONDAY
         DBG> EVALUATE DAY'PRED(MY_DAY)
         %DEBUG-W-ILLENUMVAL, enumeration value out of legal range

#### C.2.1.2.2 オーバロードされた列挙リテラルの解決

次の宣言について考えます。

         type MASK is (DEC,FIX,EXP);
         type CODE is (FIX,CLA,DEC);
         MY_MASK : MASK;
         MY_CODE : CODE;

次の例では，オーバロードされた列挙リテラルFIXを型明示式CODE'(FIX) で解決します。この列挙リテラルFIXはCODE型とMASK型の両方に属しています。

         DBG> DEPOSIT MY_CODE := FIX
         %DEBUG-W-NOUNIQUE, symbol 'FIX' is not unique
         DBG> SHOW SYMBOL/TYPE FIX
         data EXAMPLE.FIX
             enumeration type (CODE, 3 elements), size: 1 byte
         data EXAMPLE.FIX
             enumeration type (MASK, 3 elements), size: 1 byte
         DBG> DEPOSIT MY_CODE := CODE'(FIX)
         DBG> EXAMINE MY_CODE
         EXAMPLE.MY_CODE:        FIX

## C.2.2 演算子と式

次の節では，Adaの演算子と言語式に関するデバッガのサポートについて説明します。

### C.2.2.1 言語式の演算子

サポートされているAdaの言語式の演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号(一致)
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | MOD | モジュロ
挿入辞 | REM | 剰余
挿入辞 | ** | べき乗(VAX固有)
接頭辞 | ABS | 絶対値
挿入辞 | & | 連結(文字列型のみ)
挿入辞 | = | 等値(スカラ型および文字列型のみ)
挿入辞 | /= | 不等(スカラ型および文字列型のみ)
挿入辞 | > | 大なり(スカラ型および文字列型のみ)
挿入辞 | >= | 以上(スカラ型および文字列型のみ)
挿入辞 | < | 小なり(スカラ型および文字列型のみ)
挿入辞 | <= | 以下(スカラ型および文字列型のみ)
接頭辞 | NOT | 論理否定
挿入辞 | AND | 論理積(ビット配列以外の場合)
挿入辞 | OR | 論理和(ビット配列以外の場合)
挿入辞 | XOR | 排他的論理和(ビット配列以外の場合)

次に示す項目はサポートされていません。

- 配列全体の演算，レコード全体の演算

- and thenおよびor elseの短絡制御形式

- inおよびnot inのメンバシップ・テスト

- ユーザ定義の演算子

### C.2.2.2 言語式

サポートされているAdaの式を次に示します。

式の種類 | デバッガのサポート
--- | ---
型変換 | Adaで指定された明示的な 型変換はどれもサポートしていない。しかし，デバッガが式を評価するときは数値型の間で特定の型変換が 暗黙に行われる。 精度の異なる型が式に含まれている場合，デバッガは式を評価する前に， 精度の低い型を精度の高い型に変換する。 整数型と浮動小数点数型が混在しているときは，整数型が浮動小数点数型に変換される。 整数型と固定小数点数型が混在しているときは，整数型が固定小数点数型に変換される。 サイズの異なる整数型(たとえば，バイト整数とワード整数)が混在しているときは， サイズの小さい整数型が大きい整数型に変換される。
部分型 | 完全にサポートしている。 ただし，デバッガは，部分型および範囲の制約がある型を"部分範囲"型として示す。
型明示式 | オーバロードされた列挙リテラル( 識別子は同じだが，異なる列挙型に含まれるリテラル) を解決しなければならないので，サポートしている。それ以外の目的では型明示式をサポートしていない。
アロケータ | アロケータを使用する演算は何もサポートしていない。
ユニバーサル式 | サポートしていない。

## C.2.3 データ型

サポートされているAdaのデータ型を次に示します。

Adaのデータ型 | VMSのデータ型名
--- | ---
INTEGER | ロングワード整数(L)
SHORT_INTEGER | ワード整数(W)
SHORT_SHORT_ INTEGER | バイト整数(B)
SYSTEM.UNSIGNED_QUADWORD | クォドワード符号なし(QU)
SYSTEM.UNSIGNED_ LONGWORD | ロングワード符号なし(LU)
SYSTEM.UNSIGNED_WORD | ワード符号なし(WU)
SYSTEM.UNSIGNED_BYTE | バイト符号なし(BU)
FLOAT | F浮動小数点数(F)
SYSTEM.F_ FLOAT | F浮動小数点数(F)
SYSTEM.D_FLOAT | D浮動小数点数(D)
LONG_FLOAT | LONG_FLOAT (D_FLOAT)プラグマが有効のときは，D 浮動小数点数(D)。 LONG_FLOAT (G_FLOAT)プラグマが有効のときは，G浮動小数点数(G) 。
SYSTEM.G_FLOAT | G浮動小数点数(G)
SYSTEM.H_FLOAT (VAX固有) | H浮動小数点数(H)
LONG_LONG_FLOAT (VAX固有) | H浮動小数点数(H)
IEEE_SINGLE_FLOAT (Alpha 固有) | S浮動小数点数(FS)
IEEE_DOUBLE_FLOAT (Alpha固有) | T浮動小数点数(FT)
固定 | (なし)
STRING | ASCIIテキスト(T)
BOOLEAN | 境界合わせされたビット列(V)
BOOLEAN | 境界合わせされていないビット列(VU)
列挙 | 値が符号なしバイトと一致する列挙型は， バイト符号なし(BU)。値が符号なしワードと一致する列挙型は，ワード符号なし(WU) 。それ以外の列挙型に対応するオペレーティング・システムのデータ型はない。
配列 | (なし)
レコード | (なし)
アクセス(ポインタ) | (なし)
タスク | (なし)

## C.2.4 コンパイルとリンク

ユーザのシステムのプログラム・ライブラリADA$PREDEFINEDにある，Ada の定義済みユニットは/NODEBUG修飾子を使用してコンパイルされています。 定義済みユニットの中で宣言されている名前をデバッガで参照するにはその前に， 定義済みユニットのソース・ファイルをACS EXTRACT SOURCE コマンドでコピーしなければなりません。そして，コピーしたファイルを/DEBUG 修飾子を使用してコンパイルし，適切なライブラリにしてから，/DEBUG 修飾子を付けてプログラムを再リンクする必要があります。

Adaの各コンパイル・コマンドで/NODEBUG修飾子を使用した場合，デバッグのためにモジュールに含まれるのはグローバル・ シンボル・レコードだけです。 このときのグローバル・シンボルは，プログラムが他言語のモジュールへエクスポートする名前です。 プログラムは次のAdaのエクスポート・ プラグマを使用して名前をエクスポートします。
EXPORT_PROCEDURE
EXPORT_VALUED_PROCEDURE
EXPORT_FUNCTION
EXPORT_OBJECT
EXPORT_EXCEPTION
PSECT_OBJECT

ACS LINKコマンドで/DEBUG修飾子を使用すると，リンカは，実行可能なイメージ内の特定のユニットのクロージャにデバッグの情報をすべて含めます。

## C.2.5 ソースの表示

Adaプログラム固有の次の理由から，ソース・コードを表示できないことがあります。

- Adaの初期化コードまたは確立コードで実行が一時停止される。 この初期化コードや確立コードのために，ソース・コードを使用することができない。

- コピーされたソース・ファイルが，元のコンパイル単位をコンパイルするのに使用したプログラム・ ライブラリの中に含まれていない。

- 外部ソース・ファイルが，そのコンパイル単位が当初コンパイルされたときにあった場所にない。

- 実行可能なイメージを生成してからソース・ファイルの修正が行われており， コピーされたソース・ファイルや外部ソース・ファイルはすでに存在しない。

Adaプログラムでソース・コードの表示を制御する方法を次に説明します。

コンパイラ・コマンドの/COPY_SOURCE修飾子(省略時設定)が有効な状態でプログラムをコンパイルした場合， 表示されるAdaのソース・コードは， プログラムを新しくコンパイルしたときのプログラム・ライブラリにあるソース・ ファイルをコピーして取得されます。/NOCOPY_SOURCE修飾子を使用してプログラムをコンパイルした場合， 表示されるソース・コードは， プログラムのコンパイル単位に対応する外部ソース・ファイルから取得されます。

コピーされるソース・ファイルのファイル指定，または外部ソース・ファイルのファイル指定は， 対応するオブジェクト・ファイルに埋め込まれています。 たとえば，コンパイル単位をコピーするのにACSのCOPY UNITコマンドを使用しても， あるいは，ライブラリ全体をコピーするのにDCLのCOPY コマンドかBACKUPコマンドを使用しても，デバッガはコピーされたソース・ ファイルから元のプログラム・ライブラリを検索します。コピー後に元のコンパイル単位を修正した場合， またはコピー後に元のライブラリを削除した場合， デバッガはコピーされた元のソース・ファイルを見つけることができません。 同様に，外部ソース・ファイルを別のディスクやディレクトリに移動したときも， デバッガは元のソース・ファイルを見つけられません。

このような場合は，ソースの表示のための正しいファイルを検索するために，SET SOURCE コマンドを使用します。プログラム・ライブラリやソース・ コードの複数のディレクトリを示す検索リストを指定することができます。 次に例を示します。ADA$LIBは，プログラム・ライブラリ・マネージャが現在のプログラム・ ライブラリと等しく定義する論理名です。

         DBG> SET SOURCE ADA$LIB,DISK:[SMITH.SHARE.ADALIB]

ユーザがデバッガのEDITコマンドを使用するときにデバッガが取り出す外部ソース・ ファイルを検索するための検索リストは，SET SOURCEコマンドでは変更されません。 ソース・ファイルを検索する場所をEDITコマンドで指定するときは，SET SOURCE/EDIT コマンドを使用します。

## C.2.6 EDITコマンド

Adaプログラムで省略時にデバッガのEDITコマンドが取り出す外部ソース・ ファイルは，実行を現在一時停止しているコンパイル単位を作成するためにコンパイルされた外部ソース・ ファイルです。プログラム・ライブラリ内のコピーされたソース・ ファイルは編集しないでください。デバッガはこのソース・ ファイルをソースの表示のために使用します。

編集するソース・ファイルのファイル指定は，コンパイル中に，対応するオブジェクト・ ファイルに埋め込まれます(/NODEBUGを指定しなかった場合) 。コンパイル後にソース・ファイルの配置場所を変更すると，デバッガがそれらのソース・ ファイルを見つけられなくなります。

配置場所を変更したときは，デバッガのSET SOURCE/EDITコマンドを使用すると， デバッガがソース・ファイルを検索する，1つまたは複数のディレクトリからなる検索リストを指定することができます。 次に例を示します。

         DBG> SET SOURCE/EDIT [],USER:[JONES.PROJ.SOURCES]

SET SOURCE/EDITコマンドを使用しても，デバッガがソースの表示に使用するコピー元のソース・ ファイルを検索するための検索リストは変更されません。

SHOW SOURCE/EDITコマンドを使用すると，現在EDITコマンドで使用中のソース・ ファイル検索リストが表示されます。CANCEL SOURCE/EDITコマンドを使用すると， 現在EDITコマンドで使用中のソース・ファイル検索リストが取り消され， 省略時の検索モードに戻ります。

## C.2.7 GOコマンドとSTEPコマンド

AdaプログラムでGOコマンドやSTEPコマンドを使用する場合は，次の点に注意してください。

- コンパイラ生成初期化コード内の命令をステップ実行しないようにするには， デバッグ・セッションを開始するときに，STEPコマンドではなくGO コマンドを使用してください。

  - メイン・プログラムの開始時に初期化コードとパッケージ確立コードをとばして， 定義済みブレークポイントに直行するには，GO コマンドを使用します。

  - メイン・プログラムが開始される前の，ライブラリ・パッケージの確立開始時点で実行を一時停止するには，GO コマンドとブレークポイントを使用します。

  パッケージ確立フェーズをモニタする方法については，オンライン・ ヘルプのDebugging_Ada_Library_Packagesを参照してください。

- 1行に複数の文がある場合，STEPコマンドは，その行の文すべてを1 つのステップの一部分として実行します。

- タスク・エントリ呼び出しとサブプログラム呼び出しは異なります。 タスク・エントリ呼び出しはキューに登録されるのであって， ただちに実行されるとは限らないからです。タスク・エントリ呼び出しに実行を移すのにSTEP コマンドを使用すると，期待どおりの結果が得られないことがあります。

## C.2.8 Adaのライブラリ・パッケージのデバッグ

Adaのメイン・プログラム，またはAdaのコードを呼び出すAda以外のメイン・ プログラムが実行されるときに，Adaの実行時ライブラリに対して初期化コードが実行され， プログラムが依存するすべてのライブラリ単位に対して確立コードが実行されます。 確立コードは，メイン・プログラムの実行前にライブラリ単位を適切な順序で確立します。 ライブラリの仕様と本体， およびそれらのサブユニットもこのプロセスによって確立されます。

ライブラリ・パッケージを確立すると，次の処理が行われます。

- パッケージの宣言を有効にする。

- 宣言に初期化コードを含む変数を初期化する。

- パッケージ本体のbegin文とend文の間にある一連の文をすべて実行する。

Adaプログラムをデバッガの制御下に置くと，初めに，初期化コードの実行前およびライブラリ単位の確立前に実行が一時停止されます。 次に例を示します。

         DBG> RUN FORMS
         Language: ADA, Module: FORMS
         Type GO to reach main program
         DBG>

この時点で，GOと入力してメイン・プログラムを開始する前に，注目したいパッケージの仕様や本体にブレークポイントを設定することによって， ライブラリ・パッケージ内の命令を何箇所かステップ実行してチェックすることができます。 その後，各パッケージを開始するためにGOコマンドを使用します。 パッケージの本体にブレークポイントを設定するには，SET BREAKコマンドでパッケージ単位名を指定します。パッケージの仕様にブレークポイントを設定するときは， パッケージ単位名をその後ろにアンダスコア(_) を付けて指定します。

パッケージの本体にブレークポイントを設定しても，その本体に対するデバッガのモジュールが設定されていないときはブレークされません。 モジュールが設定されていない場合は， パッケージの仕様のところでブレークされます。 このようになるのは，with句の中で名前を指定されているパッケージの仕様に対するモジュールを， デバッガが自動的に設定するためです。 デバッガは，対応するパッケージ本体に対するモジュールを自動的には設定しません( 第C.2.14項を参照)。

また，パッケージの仕様の中で宣言されているサブプログラムにブレークポイントを設定するには， パッケージの本体に対するモジュールをユーザが設定する必要があります。

コンパイラは，ライブラリ・パッケージの中で宣言されているサブプログラムに固有の名前を作成しますので注意してください。 これらの名前は， オーバロードされた名前です。または，オーバロードされた名前になることもあります。 デバッガの出力には，これらの固有の名前が使用されます。 また，使用しないと名前があいまいになる場合は，この固有の名前を各コマンドで使用する必要があります。 オーバロードされた名前とシンボルの解決についての詳しい説明は， 第C.2.15 項を参照してください。

## C.2.9 定義済みブレークポイント

AdaプログラムまたはAdaのコードを呼び出すAda以外のプログラムでデバッガを起動すると，Ada のタスキング例外イベントに対応する2つのブレークポイントが自動的に設定されます。 これらのブレークポイントは，Ada の実行時ライブラリが存在しているときに，デバッガの初期化中に自動的に設定されます。

この状況でSHOW BREAKコマンドを入力すると，次のようにブレークポイントが表示されます。

         DBG> SHOW BREAK
         Predefined breakpoint on ADA event "EXCEPTION_TERMINATED"
             for any value
         Predefined breakpoint on ADA event "DEPENDENTS_EXCEPTION"
             for any value
         DBG>

## C.2.10 例外のモニタ

Adaプログラムの場合，デバッガは次の3種類の例外を認識します。

- ユーザ定義の例外- Adaのコンパイル単位内で，Adaの予約語 exceptionで宣言された例外

- Adaの定義済みの例外。PROGRAM_ERRORまたはCONSTRAINT_ERROR など。

- その他の(Ada以外の)すべての例外またはVMS条件

次の各サブトピックでは，これらの例外をモニタする方法について説明します。

### C.2.10.1 すべての例外のモニタ

SET BREAK/EXCEPTIONコマンドを使用すると，どの例外またはVMS条件にもブレークポイントを設定することができます。 これには，Adaの実行時ライブラリの内部でシグナル通知される特定のVMS 条件も含まれます。これらの条件は言語処理系の機構によるものであり， プログラムの障害を意味するものではありません。 また，これらの条件をAdaの例外ハンドラで処理することはできません。 プログラムをデバッグ中にこれらの条件が現れる場合は， ブレークポイントを設定するときに，例外の種類を指定することもできます。

SET TRACE/EXCEPTIONコマンドの結果，AdaのCONSTRAINT_ERROR例外のためにトレースポイントが現れるときの例を， 次に示します。

         DBG> SET TRACE/EXCEPTION
         DBG> GO
               . . .
         %ADA-F-CONSTRAINT_ERRO, CONSTRAINT_ERROR
         -ADA-I-EXCRAIPRI, Exception raised prior to PC = 00000A7C
         trace on exception preceding
             ADA$RAISE\ADA$RAISE_CONDITION.%LINE 333+12
               . . .

内部で例外が発生したサブプログラムを呼び出したとき，または例外発生の対象となったサブプログラムを呼び出したときのトレースバックをSHOW CALLSコマンドで表示する例を次に示します。

         DBG> SET BREAK/EXCEPTION DO (SHOW CALLS)
         DBG> GO
                . . .

         %SYSTEM-F-INTDIV, arithmetic trap, integer divide
              by zero at PC=000008AF,
         PSL=03C000A2 break on exception preceding
              SYSTEM_OPS.DIVIDE.%LINE 17+6
              17:      return X/Y;

          module name     routine name       line    rel PC    abs PC
         *SYSTEM_OPS      DIVIDE               17   00000015  000008AF
         *PROCESSOR       PROCESSOR            19   000000AE  00000BAD
         *ADA$ELAB_PROCESSOR
                          ADA$ELAB_PROCESSOR        00000009  00000809
                          LIB$INITIALIZE            00000054  00000C36
          SHARE$ADARTL                              00000000  000398BE
         *ADA$ELAB_PROCESSOR
                          ADA$ELAB_PROCESSOR        0000001B  0000081B
                          LIB$INITIALIZE            0000002F  00000C21

この例では，SYSTEM_OPSパッケージのDIVIDEサブプログラムの17行目でSS$_INTDIV 条件が発生します。SS$_INTDIVなどのいくつかの条件はAdaのある種の定義済みの例外と等価なものとして処理されるという重要な働きを， この例は示しています。

Adaの定義済みの例外と条件を照合するのは，例外部分を持つすべてのフレーム用にAda に備えられている条件ハンドラです。したがって，Adaの例外名と等価な名前を持った条件によって例外のブレークポイントまたはトレースポイントが検出された場合， メッセージには，システムの条件コード名 だけが表示され，対応するAdaの例外名は表示されません。

### C.2.10.2 特定の例外のモニタ

例外が発生すると，デバッガは次の組み込みシンボルを設定します。この組み込みシンボルを使用すると， 特定の例外が発生したときだけ検出されるように， 例外のブレークポイントやトレースポイントを指定することができます。

%EXC_FACILITY | 例外を生じたファシリティの名前を示す文字列。Ada の定義済みの例外およびユーザ定義の例外のファシリティ名は，ADA 。
%EXC_NAME | 例外名を示す大文字の文字列。発生した例外がAdaの定義済みの例外の場合，15 文字を超える分の名前は切り捨てられる。たとえば， CONSTRAINT_ERRORは切り捨てられ，CONSTRAINT_ERROになる。発生した例外がユーザ定義の例外の場合，%EXC_NAME には"EXCEPTION"という文字列が入り， ユーザ定義の例外名は%ADAEXC_NAMEに入る。
%ADAEXC_NAME | 発生した例外がユーザ定義の例外の場合，%ADAEXC_NAME にはその例外名を示す文字列が入り，%EXC_NAME には"EXCEPTION"という文字列が入る。発生した例外がユーザ定義の例外ではない場合，%ADAEXC_NAME には空文字列が入り，%EXC_NAMEに例外名が入る。
%EXC_NUM | 例外の個数。
%EXC_SEVERITY | 例外の重大度を示す文字列(F ，E，W，I，S，または?)。

### C.2.10.3 処理される例外と例外ハンドラのモニタ

SET BREAK/EVENTコマンドとSET TRACE/EVENTコマンドを使用すると，Ada の例外ハンドラが処理しようとしている例外にブレークポイントとトレースポイントを設定することができます。 制御を渡されるAdaの各例外ハンドラの実行を， これらのコマンドでモニタすることができます。

これらのコマンドでは，次の2つのイベント名を指定することができます。

HANDLED | 何らかのAdaの例外ハンドラが例外を処理しようとしているときに検出される。( `HANDLED_OTHERS` を含む)
HANDLED_OTHERS | `Other` を選択しているAdaの例外ハンドラが例外を処理しようとしているときのみ検出される。

たとえば，次のコマンドは，Adaの例外ハンドラが例外を処理しようとしているときに検出されるブレークポイントを設定します。

         DBG> SET BREAK/EVENT=HANDLED

ブレークポイントが検出されると，処理されようとしている例外と実行されようとしている例外ハンドラをデバッガが示します。 その後，この情報を利用して特定のハンドラにブレークポイントを設定することができます。 また，GOコマンドを入力して，Adaのどのハンドラが次に例外を処理しようとするかを見ることもできます。 次に例を示します。

         DBG> GO
               . . .
         break on Ada event HANDLED
           task %TASK 1 is about to handle an exception
           The Ada exception handler is at: PROCESSOR.%LINE 21
             %ADA-F-CONSTRAINT_ERRO, CONSTRAINT_ERROR
             -ADA-I-EXCRAIPRI, Exception raised prior to PC = 00000A7C
         DBG> SET BREAK PROCESSOR.%LINE 21; GO

## C.2.11 データの検査と操作

データを検査または操作するときは，次の関連事項に注意してください。

- 非静的変数(ライブラリ・パッケージの中で宣言されていないすべての変数) の確認，または非静的変数への格納を行うには，その前に， 非静的変数を定義するサブプログラムやタスクなどが呼び出しスタック上でアクティブになっていなければなりません。

- Adaのサブプログラムの仮パラメータまたはAdaの変数を確認したり， 格納したり，または評価したりするには，その前にそのパラメータや変数が確立されていなければなりません。 つまり，パラメータや変数の宣言の後ろへステップ実行するか， または実行を移さなければなりません。 宣言が確立されていない変数や仮パラメータに格納されている値は， 違う場合があります。

型明示式の使用も含め，デバッガではほとんどの場合，プログラムのソース・ コードに指定するのとまったく同じように，変数や式をデバッガ・コマンドの中で指定することができます。 次の各サブトピックでは，レコードとアクセス型についてのデバッガのサポートに関する補足事項について説明します。

### C.2.11.1 レコード

デバッガによるレコードのサポートについては次の点に注意してください。

- レコード(シンボル)宣言と型宣言の有効範囲が異なっている場合，Ada の特定のレコード変数では，デバッガがレコードの構成要素を正確に表示できず， エラー・メッセージNOACCESSRが表示されることがあります。

- 可変レコードについては，アクティブでない可変部の構成要素に値を代入したり， その構成要素の値を確認することができます。しかしこれはAda では不正な動作になるので，情報メッセージも併せて発行されます。 たとえば，REC1レコードにSTATUSという名前の可変フィールドがあり，STATUS の値がREC1.COMP3が非アクティブであることを示しているとすると， 次のようになります。

           DBG> EXAMINE REC1.COMP3
           %DEBUG-I-BADDISCVAL, incorrect value of 1 in discriminant
               field STATUS
           MAIN.REC1.COMP3:    438

### C.2.11.2 アクセス型

デバッガによるアクセス型のサポートについては，次の点に注意してください。

- デバッガはアロケータをサポートしていないので，デバッガで新しいアクセス・ オブジェクトを作成することはできない。

- EXAMINEコマンドでアクセス・オブジェクトの名前を指定すると， デバッガはその名前が指すオブジェクトのメモリ記憶位置を表示する。

- 指定オブジェクトの値を確認するには，選択要素の表記法を使用して.ALL を指定しなければならない。たとえば，Aが指すレコード・ アクセス・オブジェクトの値を確認するには，次のようにする。

           DBG> EXAMINE A.ALL
           EXAMPLE.A.ALL
               NAME(1..10):        "John Doe  "
               AGE :       6
               NEXT:       1462808

- 指定オブジェクトの構成要素の1つを確認する場合は，選択要素の構文から.ALL を省略することができる。次に例を示す。

           DBG> EXAMINE A.NAME
           EXAMPLE.A.ALL.NAME(1..10):     "John Doe  "

不完全型についてのデバッガのサポートの例を示します。次の宣言を見てください。

         package P is
            type T is private;
         private
            type T_TYPE;
            type T is access T_TYPE;
         end P;

         package body P is
            type T_TYPE is
               record
                 A: NATURAL := 5;
                 B: NATURAL := 4;
               end record;

            T_REC: T_TYPE;
            T_PTR: T := new T_TYPE'(T_REC);
         end P;

         with P; use P;
         procedure INCOMPLETE is
            VAR: T;
         begin
             . . .
         end INCOMPLETE;

T型についての完全な情報がデバッガに与えられていないので，VAR変数を操作することはできません。 ただし，パッケージ本体Pの中で宣言されているオブジェクトについては情報が与えられているので，T_PTR 変数とT_REC 変数を操作することはできます。

## C.2.12 モジュール名とパス名

Adaのデバッガ・モジュール名は，対応するコンパイル単位の名前と同じです。 これには次の条件があります。あいまいさをなくすために，仕様の名前にアンダスコア文字(_) を追加して仕様と本体の名前とを区別してください。 たとえば，TEST (本体)，TEST_ (仕様)とします。プログラム内のモジュールの正確な名前を確認するには，SHOW MODULE コマンドを使用します。

ほとんどの場合，パス名を指定する際に，仕様と本体とを区別するアンダスコアを後部に入力する必要はありません。 通常，デバッガは状況に応じてこの2 つを区別します。したがって，あいまいさを解消しなければならないときだけ， この命名規則を使用してください。

デバッガの言語がAdaに設定されている場合，デバッガは，パス名の要素を区切るのに選択要素の表記法を一般的に使用し，Ada の規則に従ってパス名を構成します。 他の言語では要素を区切るのにバックスラッシュを使用します。 次に例を示します。

         TEST_.A1        ! A1 はコンパイル単位 TEST のパッケージ
                         ! 仕様の中で宣言されている
         TEST.B1         ! B1 はコンパイル単位 TEST のパッケージ
                         ! 本体の中で宣言されている

サブユニットのパス名(展開される名前)は，最大247文字の長さまで指定することができます。

シンボルがパッケージの外部で直接に可視になるよう，パッケージ内でuse 句によって宣言されている場合は，プログラム自体またはデバッガ・ コマンドのいずれにおいても，そのシンボルを参照するために，展開された名前( package-name.symbolを指定する必要はありません。

指定されたブロック，サブプログラム，またはパッケージがuse句の中で参照しているパッケージを示すには，SHOW SYMBOL/USE_CLAUSE コマンドを使用します( 指定されているパッケージがライブラリであるかどうかは関係ありません) 。指定されている要素が，ライブラリであるかどうかにかかわらずパッケージである場合は，use 句内の特定のモジュール名を示すブロック， サブプログラム，パッケージなどもこのコマンドで示すことができます。 次に例を示します。

         DBG> SHOW SYMBOL/USE_CLAUSE B_
         package spec B_
             used by:  F
             uses:     A_

ソース・コードのループ文または宣言ブロックにラベルが付けられている場合， デバッガはそのラベルを表示します。それ以外の場合，ループ 文についてはLOOP$nを表示し，宣言ブロックについてはBLOCK$ nを表示します。それぞれのnは， その文またはブロックが始まる行番号を示します。

## C.2.13 シンボル検索規則

Adaプログラムでパス名(Adaの展開された名前を含む)を指定しなかった場合， デバッガは次のように実行時シンボル・テーブルを検索します。

1. デバッガは，現在そこで実行を一時停止している現在のPC値に近いブロックまたはルーチンの中でシンボルを検索します。

2. シンボルが見つからない場合は，use句に指定されているパッケージを次に検索します。 デバッガは，現在の有効範囲の領域と同じモジュールに宣言があるパッケージと， ライブラリ・パッケージとを区別しません。 可視である複数のパッケージの中で同じシンボルが宣言されている場合，Ada の規則によりシンボルは固有のものではなくなり， 次のようなメッセージが発行されます。

            %DEBUG-E-NOUNIQUE, symbol 'X' is not unique

3. それでもまだシンボルが見つからない場合，他の言語については， 呼び出しスタックと他の有効範囲を検索します。

## C.2.14 モジュールの設定

ユーザまたはデバッガがAdaのモジュールを設定するときに，省略時設定では， デバッガが"関連"モジュールもすべて設定します。この関連モジュールとは， 設定されるモジュールの中でシンボルが可視でなければならないモジュールを指します。 これらの関連モジュールは，with句またはサブユニット関係のどちらかで設定されるモジュールに関連づけられます。

関連モジュールの設定は次のように行われます。設定されるモジュールがM1 である場合，次の各モジュールが関連しているとみなされ，設定されます。

- M1がライブラリ本体である場合に，対応するライブラリ仕様があれば， それも設定されます。

- M1がサブユニットである場合，その親ユニットと，親ユニットのすべての親も設定されます。

- M1がwith句でライブラリ・パッケージ P1を指定している場合，P1 の仕様も設定されます。P1の本体とP1のサブユニットの中で宣言されているシンボルは外部では可視でないので，P1 の本体とP1 のサブユニットは何も設定されません。

  P1の仕様がwith句でP2パッケージを指定している場合は，P2の仕様も設定されます。 同様に，P2の仕様がwith句でP3パッケージを指定している場合はP3 の仕様も設定され，同じように設定されていきます。このようなライブラリ・ パッケージはすべて，それらの仕様が設定されるので， 他のパッケージで宣言されているデータ構成要素(たとえばレコードの構成要素) をアクセスすることができます。

- M1がwith句でライブラリのサブプログラムを指定している場合， そのサブプログラムは設定されません。M1の中で可視でなければならないのはサブプログラム名だけです。 ライブラリのサブプログラム内の宣言は， そのサブプログラムの外部で可視である必要はありません。 したがって，デバッガがライブラリのサブプログラム名をRST に挿入するのは，M1が設定されるときになります。

多くのモジュールが設定されることでデバッガの性能に問題が生じるときは，SET MODE NODYNAMIC コマンドを使用してください。このコマンドで， 動的モジュールの設定が禁止されるとともに，関連モジュールの設定が禁止されます。 そのあとでSET MODULEコマンドを使用して，個々のモジュールを明示的に設定する必要があります。

省略時のSET MODULEコマンドでは，コマンドで指定したモジュールと同時に関連モジュールが設定されます。

SET MODULE/NORELATEDコマンドでは，明示的に指定したモジュールだけが設定されます。 しかし，SET MODULE/NORELATEDを使用した場合，別のユニットで宣言されていて実行の時点で可視であるはずのシンボルが可視でない場合があります。 つまり，同じそのシンボルを再宣言することによって隠されるはずのシンボルが可視になっていることがあります。

CANCEL MODULE/NORELATEDコマンドでRSTから削除されるのは，明示的に指定したモジュールだけです。 省略時設定のCANCEL MODULE/NORELATEDコマンドは，Ada の有効範囲規則と可視性の規則の目的に合致した方法で関連モジュールを削除します。 正確な効果はモジュールの関連性に依存します。

サブユニットの関連と直接関連の違いは，ライブラリ・パッケージの関連の違いと同様です。

### C.2.14.1 パッケージ本体のためのモジュールの設定

デバッガは，パッケージ本体のためのモジュールを自動的には設定しません。

パッケージ本体をデバッグするには，または，対応するパッケージ仕様の中で宣言されているサブプログラムをデバッグするには， ユーザが自分でライブラリ・ パッケージ本体のためのモジュールを設定しなければならない場合があります。

## C.2.15 オーバロードされた名前とシンボルの解決

オーバロードされた名前やシンボルが現れると，次のようなメッセージが表示されます。

         %DEBUG-E-NOTUNQOVR, symbol 'ADD' is overloaded
              use SHOW SYMBOL to find the unique symbol names

オーバロードされたシンボルが列挙リテラルである場合は，オーバロードを解決するために， 型明示式を使用することができます。

オーバロードされたシンボルがサブプログラムまたはタスクのaccept文を表す場合は， コンパイラがデバッガ用に作成する固有の名前を使用することができます。 名前は，あとでパッケージ本体でオーバロードされることがあるので， コンパイラは必ず各サブプログラム固有の名前をライブラリ・ パッケージの仕様に作成します。タスクのaccept文やサブプログラムが他の場所で宣言されているときは， タスクのaccept文やサブプログラムが実際にオーバロードされる場合にだけ， 固有の名前が作成されます。

オーバロードされたタスクのaccept文とサブプログラムの名前は，2つのアンダスコアとそれに続く整数からなる接尾辞によって区別されます。 それぞれのシンボルは， この整数で別々のものとして示されます。名前がオーバロードされているサブプログラムを別々のものとして指定するには， 固有の名前を表記してデバッガ・コマンドを使用する必要があります。しかし， あいまいさがない場合は，固有の名前が作成されてもその名前を使用する必要はありません。

## C.2.16 CALLコマンド

Adaプログラムで確実にCALLコマンドを使用できるのは，エクスポートされているサブプログラムでこのコマンドを使用する場合だけです。 エクスポートされるサブプログラムは， ライブラリのサブプログラムであるか， またはライブラリ・パッケージの最も外側にある宣言部で宣言されている必要があります。

CALLコマンドは，サブプログラムをエクスポートできるかどうかはチェックしません。 また，ユーザが指定するパラメータの受け渡し方式もチェックしません。 パラメータの値を変更するためにCALLコマンドを使用することはできませんので注意してください。

Adaの実行時ライブラリを実行中にCALLコマンドを入力するとデッドロックを起こすことがあります。 実行時ライブラリ・ルーチンは，タスキング環境で実行時ライブラリ・ ルーチンを作動可能にする内部ロックを取得および解放します。 デッドロックを生じる可能性があるのは，CALLコマンドから呼び出されたサブプログラムが， 実行中の実行時ライブラリ・ルーチンによってロックされている資源を要求するときです。 非タスキング・プログラムにおいてこういった状況が生じないようにするには，Ada の文を実行する直前， または実行した直後にCALLコマンドを入力してください。 しかし，この方法では，タスキング・プログラムでのデッドロックの発生を完全に防ぐことはできません。 呼び出しの時点で他の何らかのタスクが実行時ライブラリ・ ルーチンを実行している可能性があるからです。タスキング・ プログラムでCALLコマンドを使用しなければならない場合は，呼び出されるサブプログラムがタスキング操作や入出力操作を何も実行しないようにすると， デッドロックを避けることができます。

# C.3 BASIC

次の各サブトピックでは，デバッガによるBASICのサポートについて説明します。

## C.3.1 言語式の演算子

言語式でサポートされているBASICの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算，文字列の連結
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | ** | べき乗
挿入辞 | ^ | べき乗
挿入辞 | = | 等値
挿入辞 | <> | 不等
挿入辞 | >< | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | => | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
挿入辞 | =< | 以下
接頭辞 | NOT | ビット単位のNOT
挿入辞 | AND | ビット単位のAND
挿入辞 | OR | ビット単位のOR
挿入辞 | XOR | ビット単位の排他的論理和
挿入辞 | IMP | ビット単位の含意
挿入辞 | EQV | ビット単位の同値

## C.3.2 言語式とアドレス式の構造

サポートされている，BASICの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定
:: | レコードの構成要素の選択

## C.3.3 データ型

サポートされているBASICのデータ型を次に示します。

BASICのデータ型 | VMSのデータ型名
--- | ---
BYTE | バイト整数(B)
WORD | ワード整数(W)
LONG | ロングワード整数(L)
SINGLE | F浮動小数点数(F)
DOUBLE | D浮動小数点数(D)
GFLOAT | G浮動小数点数(G)
HFLOAT (VAX固有) | H浮動小数点数(H)
DECIMAL | パック10進数(P)
STRING | ASCIIテキスト(T)
RFA | (なし)
RECORD | (なし)
配列 | (なし)

## C.3.4 デバッグのためのコンパイル

BASIC環境でプログラムに変更を加えてから，そのプログラムを保存したり置換したりしないまま，/DEBUG 修飾子を使用してコンパイルしようとすると，"Unsaved changes, no source line debugging available" ( 変更を保存していないのでデバッグにソース行を使用できません) というBASIC のエラーが通知されます。この問題を防ぐには，プログラムを保存または置換してから，/DEBUG 修飾子を使用してプログラムを再コンパイルしてください。

## C.3.5 定数

[radix]"numeric-string"[type]という形式("12.34"GFLOAT など)や，n%という形式(整数25の25%など) のBASICの定数は，デバッガの式ではサポートされていません。

## C.3.6 式の評価

BASIC言語でオーバフローする式であっても，デバッガが評価する場合に必ずオーバフローするとはかぎりません。BASIC の規則でオーバフローになる場合でも， デバッガは数値的に正しい結果を計算しようとします。この違いは，10 進数を計算するときに特に影響があります。

## C.3.7 行番号

デバッグ・セッションではソース・コード・ディスプレイに表示される連続した行番号を参照しますが， この行番号を生成するのはコンパイラです。BASIC プログラムに他のファイルからコードを取り込んだり，付加したりする場合， 取り込まれたコードの行にもコンパイラによって順番に行番号が付けられます。

## C.3.8 ルーチンへのステップ

STEP/INTOコマンドは，外部関数をチェックするのに便利です。しかし， 内部サブルーチンやDEFで実行を停止するのにこのコマンドを使用すると， デバッガは最初に実行時ライブラリ(RTL)のルーチン内の命令をステップ実行するので， 有用な情報は何も得られません。次の例では， Print_routineを呼び出す8行目で実行が一時停止されます。

              . . .
         ->  8  GOSUB Print_routine
             9  STOP
              . . .
            20  Print_routine:
            21    IF Competition = Done
            22      THEN PRINT "The winning ticket is #";Winning_ticket
            23      ELSE PRINT "The game goes on."
            24    END IF
            25  RETURN

STEP/INTOコマンドを実行すると，デバッガは適切なRTLコード内の命令をステップ実行して， 表示のために使用できるソース行がないことをユーザに伝えてきます。 一方，STEPコマンドだけを使用すると，デバッガはPrint_routine への呼び出しを通り越して，直接ソース行の9行目に進みます。 サブルーチンまたはDEF関数のソース・コードをチェックするには， ルーチンのラベルにブレークポイントを設定してください。たとえば， SET BREAK PRINT_ROUTINEコマンドを入力します。こうすると，正確にルーチンの開始地点この例では20 行目で実行を一時停止してから，コード内の命令を直接ステップ実行することができます。

## C.3.9 シンボル参照

単一のBASICプログラム内の変数名とラベル名は，すべて固有のものでなければなりません。 固有でない場合，デバッガはシンボルのあいまいさを解消できません。

## C.3.10 ウォッチポイント

BASICでウォッチポイントを設定できるのは，COMMON文またはMAP文で宣言されている変数( 静的変数)に対してだけです。DECLARE文で明示的に宣言されている変数にウォッチポイントを設定することはできません。

# C.4 BLISS

次の各サブトピックでは，デバッガによるBLISSのサポートについて説明します。

## C.4.1 言語式の演算子

言語式でサポートされているBLISSの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | . | 間接参照
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | MOD | 剰余
挿入辞 | ^ | 左シフト
挿入辞 | EQL | 等値
挿入辞 | EQLU | 等値
挿入辞 | EQLA | 等値
挿入辞 | NEQ | 不等
挿入辞 | NEQU | 不等
挿入辞 | NEQA | 不等
挿入辞 | GTR | 大なり
挿入辞 | GTRU | 大なり符号なし
挿入辞 | GTRA | 大なり符号なし
挿入辞 | GEQ | 以上
挿入辞 | GEQU | 以上符号なし
挿入辞 | GEQA | 以上符号なし
挿入辞 | LSS | 小なり
挿入辞 | LSSU | 小なり符号なし
挿入辞 | LSSA | 小なり符号なし
挿入辞 | LEQ | 以下
挿入辞 | LEQU | 以下符号なし
挿入辞 | LEQA | 以下符号なし
接頭辞 | NOT | ビット単位のNOT
挿入辞 | AND | ビット単位のAND
挿入辞 | OR | ビット単位のOR
挿入辞 | XOR | ビット単位の排他的OR
挿入辞 | EQV | ビット単位の同値

## C.4.2 言語式とアドレス式の構造

サポートされている，BLISSの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
[ ] | 添字指定
[fldname] | フィールドの選択
<p,s,e> | ビット・フィールドの選択

## C.4.3 データ型

サポートされているBLISSのデータ型を次に示します。

BLISSのデータ型 | VMSのデータ型名
--- | ---
BYTE | バイト整数(B)
WORD | ワード整数(W)
LONG | ロングワード整数(L)
QUAD (Alpha固有) | クォドワード(Q)
BYTE UNSIGNED | バイト符号なし(BU)
WORD UNSIGNED | ワード符号なし(WU)
LONG UNSIGNED | ロングワード符号なし(LU)
QUAD UNSIGNED (Alpha固有) | クォドワード符号なし(QU)
VECTOR | (なし)
BITVECTOR | (なし)
BLOCK | (なし)
BLOCKVECTOR | (なし)
REF VECTOR | (なし)
REF BITVECTOR | (なし)
REF BLOCK | (なし)
REF BLOCKVECTOR | (なし)

# C.5 CC

次の各サブトピックでは，デバッガによるCのサポートについて説明します。

## C.5.1 言語式の演算子

言語式でサポートされているCの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | * | 間接参照
接頭辞 | & | アドレス
接頭辞 | sizeof | サイズ
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | % | 剰余
挿入辞 | << | 左シフト
挿入辞 | >> | 右シフト
挿入辞 | == | 等値
挿入辞 | != | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
接頭辞 | ~ (チルド) | ビット単位のNOT
挿入辞 | & | ビット単位のAND
挿入辞 | | | ビット単位のOR
挿入辞 | ^ | ビット単位の排他的OR
接頭辞 | ! | 論理否定
挿入辞 | && | 論理積
挿入辞 | || | 論理和

Cでは感嘆符(!)は演算子なので，感嘆符をコメント区切り文字として使用することはできません。 言語がCに設定されている場合は，感嘆符の代わりに/* がコメント区切り文字として受け入れられます。現在の行の終端までがコメントになります。 対応する*/は不要であり，認識もされません。 しかし，デバッガのログ・ファイルをデバッガの入力として使用できるようにするため，1 行の中で空白以外の最初の文字が感嘆符(!) である場合は， デバッガはその感嘆符をコメント区切り文字として認識します。

Cの言語式とデバッガのアドレス式の両方で，デバッガは接頭辞のアスタリスク(*) を間接参照演算子として受け入れます。言語がCに設定されているときのアドレス式では， 接頭辞"*"は接頭辞"."または"@"と同義です。

デバッガは，Cまたは他のどの言語でも代入演算子は何もサポートしません。 これは，デバッグされるプログラムに予期しない変更が加えられるのを防ぐためです。 したがって，=，+=，-=，++， -- などの演算子は認識されません。 メモリ記憶位置の内容を変更するには，DEPOSITコマンドを使用して明示的に変更しなければなりません。

## C.5.2 言語式とアドレス式の構造

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

シンボル | 構造
--- | ---
[ ] | 添字指定
.(ピリオド) | 構造体構成要素の選択
-> | ポインタの間接参照

## C.5.3 データ型

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

Cのデータ型 | VMSのデータ型名
--- | ---
__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 | (なし)
union | (なし)
ポインタ型 | (なし)
配列型 | (なし)
++ Alpha固有です。

float型の浮動小数点数は，コンパイラのスイッチによって，F浮動小数点数またはIEEE S 浮動小数点数のどちらかで表現されます。

double型の浮動小数点数は，コンパイラのスイッチによって，IEEE T浮動小数点数，D 浮動小数点数，またはG浮動小数点数のどちらかで表現されます。

## C.5.4 大文字小文字の区別

C言語では，シンボル名の大文字と小文字は区別され，それぞれ別個の文字として処理されます。

## C.5.5 静的変数と非静的変数

static，globaldef，globalref，externの各記憶クラスの変数は，静的に割り当てられます。

記憶クラスがautoまたはregisterの変数は，非静的に(スタックまたはレジスタに) 割り当てられます。このような非静的変数は，それらを定義しているルーチンが呼び出しスタック上でアクティブになっているときだけアクセス可能です。

## C.5.6 スカラ変数

デバッガ・コマンドでは，Cのどのデータ型であっても，プログラムのソース・ コードに記述するのとまったく同じようにスカラ変数を指定することができます。

次の説明では，char型変数とポインタについて補足します。

デバッガはchar型変数をASCII文字ではなく，バイト整数として解釈します。char 型変数chの内容を文字として表示するには，/ASCII修飾子を使用しなければなりません。

         DBG> EXAMINE/ASCII ch
         SCALARS\main\ch:      "A"

また，char型変数に格納する場合も，/ASCII修飾子を使用してバイト整数を同値のASCII 文字に変換する必要があります。次に例を示します。

         DBG> DEPOSIT/ASCII ch = 'z'
         DBG> EXAMINE/ASCII ch
         SCALARS\main\ch:        "z"

次の宣言と代入が行われている場合に，EXAMINEコマンドでポインタの構文を使用するときの例を示します。

         static long li  = 790374270;
         static int *ptr = &li;

         DBG> EXAMINE *ptr
         *SCALARS\main\ptr:       790374270

## C.5.7 配列

デバッガは，Cの配列を他のほとんどの言語と同様に処理します。したがって， 配列の構文を使用して(たとえば，EXAMINE arr[3]で)，配列の集合体全体， 配列断面，または配列の個々の要素をそれぞれチェックすることができます。 また，配列への格納は一度に1要素ずつです。

## C.5.8 文字列

Cの文字列は，NULLで終了するASCII文字列(ASCIZ文字列)として実現されています。 文字列全体をチェックする場合，または文字列全体にデータを格納する場合は， デバッガが文字列の終端を正しく解釈できるように，/ASCIZ ( または/AZ)修飾子を使用します。Cの配列の添字を指定する演算子([ ]) を使用すると，文字列の個々の文字をチェックしたり，文字列に個々に文字を格納することができます。 文字を個々に検査したり格納したりするときは，/ASCII 修飾子を使用してください。

次の宣言と代入が行われているものとします。

         static char *s = "vaxie";
         static char **t = &s;

EXAMINE/AZコマンドは，*sと**tが指す文字列の内容を表示します。

         DBG> EXAMINE/AZ  *s
         *STRING\main\s: "vaxie"
         DBG> EXAMINE/AZ  **t
         **STRING\main\t:        "vaxie"

DEPOSIT/AZコマンドは，`*s` が指す変数に新しいASCIZ文字列を格納します。 文字列の新しい内容を表示するには，EXAMINE/AZコマンドを使用します。

         DBG> DEPOSIT/AZ  *s = "DEC C"
         DBG> EXAMINE/AZ  *s,  **t
         *STRING\main\s: "DEC C"
         **STRING\main\t:         "DEC C"

配列の添字指定を行うと，文字列の文字を個々にチェックしたり，文字列の特定の記憶位置に新しいASCII 値を格納することができます。文字列の個々のメンバにアクセスするときは，/ASCII 修飾子を使用してください。 それに続けてEXAMINE/AZコマンドを実行すると，格納された値を含む文字列全体が表示されます。

         DBG> EXAMINE/ASCII s[3]
         [3]:    " "
         DBG> DEPOSIT/ASCII s[3] = "-"
         DBG> EXAMINE/AZ *s, **t
         *STRING\main\s:    "VAX-C"
         **STRING\main\t:   "VAX-C"

## C.5.9 構造体と共用体

構造体をチェックするときは，その全体を検査したり，メンバ単位で検査することができます。 また，構造体へのデータの格納は一度に1メンバずつ行うことができます。

構造体のメンバまたは共用体のメンバを参照するには，Cで参照するときの通常の構文を使用します。 つまり，変数`p` が構造体へのポインタの場合， その構造体のメンバ`y` は，`p ->y`という式で参照することができます。変数 `x` が，構造体に割り当てられた記憶域のベースを参照している場合， その構造体のメンバは`x.y` という式で参照することができます。

デバッガは，構造体や共用体のメンバを参照するのに，Cの型検査規則を使用します。 たとえば`x.y` の場合，`y` が`x` のメンバである必要はありません。`y` は，型と併せてオフセットとして処理されます。このような参照があいまいになる場合( メンバ`y` を持つ構造体が複数ある場合)，デバッガは次の規則に従って参照を解決しようとします。 なお，構造体や共用体のメンバ参照のあいまいさを解消するときは， `x.y` と`p ->y` の両方とも同じ規則が適用されます。

- メンバの中で`y` だけが構造体`x` または共用体 `x` に属している場合，`y` が参照される。

- メンバの中で`y` だけが`x`と同じ有効範囲にある場合は， `y` が参照される。

使用される有効範囲を絞るため，また，あいまいさを解消するために， `x` を参照するときは，いつでもパス名を与えることができます。 パス名は，`x` と`y` の両方を検索するのに使用されます。

# C.6 C++バージョン5.5および5.5以降(Alphaのみ)

Alphaシステムでは，OpenVMSデバッガはバージョン5.5以降(Alphaのみ)のコンパイラでコンパイルされたC++ モジュールデバッグする機能がサポートされています。

デバッガは，C++の次の機能をサポートします。

- C++の名前と式。次のものを含む。

  - クラス・メンバを参照するための明示的な，および暗黙のthis ポインタ

  - スコープ解決演算子(::)

  - メンバ・アクセス演算子であるピリオド(.)と右矢印(->)

  - テンプレートのインスタンス化

- 次に示す中でのブレークポイントの設定。

  - 静的な仮想関数を含む，メンバ関数

  - オーバロードされた関数

  - コンストラクタとデストラクタ

  - テンプレートのインスタンス化

  - 演算子

- 関数の呼び出し。オーバロードされた関数を含む。

- C++のコードと，他の言語のコードが混在したプログラムのデバッグ。

この節のデバッグの例は，例 C-1に含まれるテスト・ プログラムを参照しており，また，例 C-2 に含まれるデバッグ・セッションの一部を取り出したものになっています。 次節以降で，C++のデバッガ・サポートについて説明します( コンパイラ・バージョン5.5 (Alphaのみ))。

## C.6.1 言語式における演算子

言語式でサポートされるC++演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | * | 間接参照
接頭辞 | & | アドレス
接頭辞 | sizeof | オブジェクトのサイズ
接頭辞 | - | 単項マイナス(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | % | 剰余
挿入辞 | << | 左シフト
挿入辞 | >> | 右シフト
挿入辞 | == | 等しい
挿入辞 | != | 等しくない
挿入辞 | > | より大きい
挿入辞 | >= | 以上
挿入辞 | < | より小さい
挿入辞 | <= | 以下
接頭辞 | ~ (チルド) | ビットごとのNOT
挿入辞 | & | ビットごとのAND
挿入辞 | | | ビットごとのOR
挿入辞 | ^ | ビットごとの排他的OR
接頭辞 | ! | 論理NOT
挿入辞 | && | 論理AND
挿入辞 | || | 論理OR

感嘆符(!)は演算子なので，C++プログラムでコメント区切り文字として使用できません。 ただし，デバッガのログ・ファイルをデバッガの入力として使用できるように， 行内のスペースでない最初の文字が!である場合は， デバッガは!をコメント区切り文字として解釈します。デバッガはC++ 言語モードでは，/*または//をコメントの先頭として解釈し，その行の最後までをコメントとみなします。

デバッガは，C++言語式とデバッガ・アドレス式の両方で，アスタリスク(*) 接頭辞を間接参照演算子として扱います。デバッガがC++言語モードの場合， アドレス式では，`*`接頭辞はピリオド(.)接頭辞またはサイン(@) 接頭辞と同じです。

デバッグの対象のプログラムが意図に反して修正されることがないように， デバッガはC++，および他の言語の代入演算子をサポートしません。 このため，=，+=，-=，++， -- はデバッガコマンドによって解釈されません。 メモリの内容を変更するには，デバッガのDEPOSITコマンドを使用します。

## 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++では，インスタンス化されたテンプレート名の中の式を， stack<double,f*10>のような完全な定数式とすることができます。この形式は， デバッガではまだサポートされていません。このため，式の値を入力することが必要です( たとえば，stackの例でfが10であれば，100 を入力しなければなりません)。

### 例 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

# C.7 C++

次の各節では，バージョン5.5よりも前のバージョンのC++コンパイラによってコンパイルされたC++ プログラムのデバッガによるサポートについて説明します。

バージョン5.5以降のバージョン(Alphaのみ)でコンパイルされたC++プログラムのデバッガによるサポートについては， 第C.6 節を参照してください。

## C.7.1 %nameレキシカル関数

DEC C++で関数やデータ・メンバのような特定のエンティティを参照するには， デバッガ・コマンドで%nameレキシカル関数の使用が要求されます。 この関数を使用するときは，必ずコマンドと参照の間に置きます。次の各項で， この関数が必要な場合の正しい使用法の例を示します。

## C.7.2 言語式の演算子

言語式でサポートされているC++の演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | * | 間接参照
接頭辞 | & | アドレス
接頭辞 | sizeof | サイズ
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | % | 剰余
挿入辞 | << | 左シフト
挿入辞 | >> | 右シフト
挿入辞 | == | 等値
挿入辞 | != | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
接頭辞 | ~ (チルド) | ビット単位のNOT
挿入辞 | & | ビット単位のAND
挿入辞 | | | ビット単位のOR
挿入辞 | ^ | ビット単位の排他的OR
接頭辞 | ! | 論理否定
挿入辞 | && | 論理積
挿入辞 | || | 論理和

感嘆符(!)は演算子なので，C++プログラムではコメントの区切り文字としては使用できません。 ただし，デバッガのログ・ファイルをデバッガ入力として使用することを許可するために，! がスペースを除けば行の先頭にある場合にかぎって， デバッガは!をコメントの区切り文字として認識します。C++ 言語モードでは，デバッガは/*をコメントの区切り文字として受け入れます。 コメントは現在の行の最後まで続きます。対応する*/は不要ですし， 認識もされません。

デバッガは，アスタリスク(*)接頭辞をC++の言語式およびデバッガのアドレス式の両方で間接参照演算子として受け入れます。 言語がC++に設定されているときは， アドレス式では，`*` 接頭辞はピリオド(.) 接頭辞や`@` 接頭辞と同義です。

デバッグ中のプログラムの誤修正を防ぐために，デバッガはC++およびその他のどの言語でも代入演算子を一切サポートしません。 したがって，= ，+=，-=，++， -- のような演算子は認識しません。記憶位置の内容を変更するには， 明示的な`deposit` コマンドを使用しなければなりません。

## C.7.3 言語式とアドレス式の構造

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

シンボル | 構造
--- | ---
[ ] | 添字指定
.(ピリオド) | 構造体構成要素の選択
-> | ポインタの間接参照

## C.7.4 データ型

サポートされている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 | (なし)
ラベル | (なし)
ポインタ型 | (なし)
配列型 | (なし)
++ Alpha固有です。

float型の浮動小数点数は，コンパイラのスイッチによって，F浮動小数点数またはIEEE S 浮動小数点数のどちらかで表されます。

double型のの浮動小数点数は，コンパイラのスイッチによって，IEEE T浮動小数点数，D 浮動小数点数，またはG浮動小数点数のどれかで表されます。

## C.7.5 大文字小文字の区別

C++言語では，シンボル名の大文字と小文字は区別され，それぞれ別個の文字として処理されます。

## C.7.6 修飾子がついたクラス名

次の各項では，デバッガを使用するときのクラス・メンバの名前の作成方法を説明するために， 修飾子がついたクラス名という用語を使用します。 あるクラスが別のクラスで定義されていなければ，修飾子がついたクラス名はそのクラス自身の名前にすぎません。 しかし，もしこのクラスが別のクラス内でネストされていれば， そのネストのすぐ外のクラスの名前を前に付けなければなりません。 このとき，区切り文字として一対のコロン(::) を使用します。外側のクラスもネストされている場合は， その名前も前に付けなければなりません。

適切な修飾子がついたクラス名の例を次に示します。

         DBG> set break %name 'C::f'             ! f is a member of class C
         DBG> set break %name 'FOO::BAR::BAZ::g' ! g is a member of BAZ,
                                                 ! which is nested in BAR,
                                                 ! which is nested in FOO

## C.7.7 C++のデータに対するデバッガの使用法

本項では，C++のデータに対するデバッガの使用法を説明します。

### C.7.7.1 非静的データ・メンバ

本項では，静的とは宣言されていないデータ・メンバを参照する方法を説明します。

#### C.7.7.1.1 継承されないデータ・メンバ

C++のクラスまたはstructかunionで直接定義されている非静的データ・メンバを参照するには， その名前を，C言語のstructメンバやunionメンバの場合と同じように使用します。 非静的データ・メンバ参照の正しい使用法を次の例で示します。

         DBG> examine x.m, p->m

#### C.7.7.1.2 継承されるデータ・メンバ

現在のところ，デバッガのサポートでは，各種の基底クラスから継承される非静的データ・ メンバを区別するのに，メンバに至る継承パス，さらにメンバが宣言されているクラスに至る継承パス上の 重要な基底クラス名をメンバ名の前に付けます。 オブジェクトからメンバに至るパスの上の基底クラスが多重継承を使用して受け継がれたものなら， 当基底クラスは重要です。 したがって，2つ以上の基底指定子が含まれている基底リストで基底クラスが言及されていれば， その基底クラスは重要です。

この表記法では，基底クラスに至る継承パスを記述するための必要最少限の数の基底クラス接頭辞を作成します。 つまりこの表記法では，パスをたどっていくときに次に進む先を選ぶために必要な基底クラスだけを命名するからです。 多重継承を行わないときは，参照は次の形式を取ります。

         %name'CLASS::member'

オブジェクトの基底クラスから継承された非静的データ・メンバを参照するには，%name で二重コロンで区切った一連の修飾子がついた重要な基底クラス名とメンバ名を引用符で囲みます。 一連の重要な基底クラスを指定する順序は， オブジェクトの最も疎遠の重要クラスからオブジェクトに最も近い重要基底クラスへという順序です。 たとえば，次の宣言の継承図式を考えてみましょう。

         struct A { int a_member; };
         struct B : A { int b_member; };
         struct C { int c_member; };
         struct D : B, C { int d_member; };
         struct E : D { int e_member; };
         struct F { int f_member; };
         struct G : F { int g_member; };
         struct H : E, G { int h_member; };
         struct I : H { int i_member; };
         struct J : I { int j_member; };

         static J j_object;

多重継承の行われる基底リストでクラスB，C，E，およびGが言及されているので， これらのクラスは接頭辞として現れる重要クラスです。次の例は， デバッガのdepositコマンドですべてのメンバを参照しています。継承されたメンバが重要なクラスに属するかどうかに関係なく， そのメンバ自身のクラスはメンバ名の前に出現することに注意してください。

#### C.7.7.1.3 継承される仮想データ・メンバ

デバッガでは，仮想基底クラスのデータ・メンバへのシンボリック・アクセスは現在サポートされていません。 ただし，例外がひとつあります。それは，__bptr という名前のポインタ・メンバがそのようなオブジェクトの中にあるということです。

### C.7.7.2 静的データ・メンバ

静的データ・メンバを参照するには，%nameで，その修飾子がついたクラス名，2 つのコロン(::)，およびメンバ名を引用符で囲ます。

静的データ・メンバ参照の正しい使用法を次の例で示します。

         DBG> examine %name 'C::s'
         DBG> examine %name 'FOO::BAR::BAZ::sdm'

### C.7.7.3 参照オブジェクトと参照メンバ

参照で宣言されたオブジェクトの値にアクセスするには，そのオブジェクトの名前を使用します。

デバッガは，参照型で宣言されたデータ・メンバをポインタ変数であるかのように扱います。 したがって，そのメンバ名には間接参照演算子の `*` または`->` を使用しなければなりません。

次に例を示します。

         class C {
         public:
             int &ref_mem;
             C(int &arg) : ref_mem(arg) {}
         };

         main()
         {
             auto int obj = 5;
             auto int &ref_obj = obj;
             auto C c(obj);
             obj = 23;
         }
          . . .

メンバをチェックするためにデバッガを使用するための正しい方法を次のシーケンスで示します。

         stepped on return from routine REF\main
           to REF\main\%LINE 13+16
             13: }
         DBG> examine obj, ref_obj
         REF\main\obj:   23
         REF\main\ref_obj:       23
         DBG> examine c
         REF\main\c
             ref_mem:    2144211292
         DBG> symbolize c.ref_mem
         address 7FCE1154:
             REF\main\c
         DBG> examine *c.ref_mem
         *REF\main\c.ref_mem:    23

### C.7.7.4 メンバを指すポインタ

メンバを指すポインタであるオブジェクトは，64ビットの整数で表されます。

### C.7.7.5 型によるエンティティの参照

オブジェクトやメンバの値を型でチェックし，表示するには，EXAMINE /TYPEというコマンドを使用します。同様に，DEPOSIT/TYPEというコマンドを使用することにより， 指定した型に格納する式の値を修正できます。/TYPE 修飾子を使用する場合，これらのコマンドの構文は次のとおりです。

         deposit/type=(name)
         examine/type=(name)

nameで示された型は，プログラムで宣言された変数の名前またはデータ型の名前でなければなりません。 `/type` 修飾子は， 特に2つ以上の型で宣言されたC++のオブジェクトを参照するときに役立ちます。

## C.7.8 C++の関数に対するOpenVMSデバッガの使用

本項では，各種の関数や関数の引数を参照する方法を説明します。

### C.7.8.1 オーバロードされた関数

コードの中で関数のシンボリック名を見つけるには，SHOW SYMBOLコマンドを使用します。 関数がオーバロードされている場合は，オーバロードされているシンボリック名を表示するために， 名前の指定でワイルドカード文字(*) を使用します。

次に例を示します。

         class base
           {
           public:
             base();
             base( int );

             ~base();

             int base_f1();

             void base_f2();
             void base_f2( int );
             void base_f2( char );
            };

オーバロードされている記号を表示し，適当な関数参照を決定する方法を次のシーケンスで示します。

         DBG> set break %name 'base::base_f2'
         %DEBUG-E-NOTUNQOVR, symbol 'base::base_f2' is overloaded
                 use SHOW SYMBOL to find the unique symbol names

         DBG> show symbol *base_f2
         overloaded symbol CXX_T10_179\base::base_f2
           overloaded instance CXX_T10_179\base::base_f2__1
           overloaded instance CXX_T10_179\base::base_f2__2
           overloaded instance CXX_T10_179\base::base_f2__3
         DBG> set break %name 'base::base_f2__2'

         DBG> step
         stepped to CXX_T10_179\main\%LINE 20
             20:     x.base_f2();
         DBG> step
         stepped to CXX_T10_179\main\%LINE 21
             21:     x.base_f2(5);

         DBG> step
         break at routine CXX_T10_179\base::base_f2__2
             12:     void base_f2( int ) {}
         DBG> step
         stepped to CXX_T10_179\main\%LINE 22
             22:     x.base_f2('W');
         stepped to CXX_T10_179\main\%LINE 22
         DBG> go
         'Normal successful completion'
         DBG> ^Z

### C.7.8.2 静的メンバ関数および非静的メンバ関数の参照

メンバ関数を参照するには，%nameで，その修飾子がついているクラス名，2 つのコロン(::)，およびメンバ関数の名前を引用符で囲みます。 メンバ関数がオーバロードされている場合は，接尾辞`__` integer-numberを付けます。

メンバ関数参照の正しい使用法を次の例で示します。

         DBG> set break %name 'MYSTRING::length'
         DBG> set break %name 'MYCOMPLEX::format__1', %name
               'MYCOMPLEX::format__2'

### C.7.8.3 コンストラクタの参照

コンストラクタを参照するには，その名前を使用します。コンストラクタがオーバロードされている場合は， 接尾辞`__` integer- numberを付けます。

コンストラクタ参照の正しい方法を次の例で示します。

         DBG> set break FOO
         DBG> set break MYSTRING__1

### C.7.8.4 デストラクタの参照

デストラクタを参照するには，%name で，その名前と共にチルド( `~` )を引用符で囲みます。

デコンストラクタ参照の正しい方法を次の例で示します。

         DBG> set break %name '~FOO'

### C.7.8.5 変換の参照

クラスSRCから型destへの変換を行うための演算子を参照するには，%name でSRC，2つのコロン(::)，それからdestを引用符で囲みます。

次の1組の名前から基本型が抽出されます。

         void            char   signed_char   unsigned_char   signed_short
         unsigned_short  int    signed_int    unsigned_int    signed_long
         unsigned_long   float  double        long_double

ポインタ型は(type)*と名付けられています。参照型は(type)&と名付けられています。struct ，union class，およびenumという型は，それぞれのタグで名付けられます。 型の前には，修飾子constおよびvolatileが付き， 修飾子と修飾子の間にはスペースが1文字入ります。次に例を示します。

         DBG> set break %name 'C::int', %name 'C::(const S)&'

### C.7.8.6 ユーザ定義演算子の参照

次の演算子はユーザ定義関数によりオーバロードされることがあります。

         +     -      *     /       %      ^      &      |      ~       !
         =     <      >     +=      -=     *=     /=     %=     ^=      &=
         |=    <<     >>    >>=     <<=    ==     !=     <=     >=      &&
         |     ++     --    ->*     ,      ->     []     ()     delete  new

詳細については，C++のマニュアルと共に提供される『The Annotated C++ Reference Manual』の7.2節を参照してください。

そのようなユーザ定義関数を参照するには，ユーザ定義演算子がメンバ関数の場合は，%name で演算子文字を引用符で囲みます。通常の関数の場合と同じように，%name に続いて引用符付きで文字列，修飾子がついたクラス名，2 つのコロン(::)を指定します。同様に，関数がオーバロードされている場合は， 接尾辞`__` integer_numberを演算子文字に付けます。 特に，`+` のような演算子が単項演算子や二項演算子として定義されている場合や， `++` や`-` が接頭辞として定義されている場合は，この接尾辞が必要です。

ユーザ定義関数参照の正しい使用法を次の例で示します。

         DBG> set break %name 'MYSTRING::+'
         DBG> set break %name 'COUNTER::++__1', %name 'COUNTER::++__2'

### C.7.8.7 関数の引数の参照

デバッガによる参照では，`this`，`*this`，および `this->` を次のように使用します。

- すべての非静的メンバ関数には`this` と名付けられたポインタ・ パラメータが利用できます。例を次に示します。

           DBG> examine this

- メンバ関数が呼び出された目的の接頭辞オブジェクトをチェックするには， `*this` を使用します。例を次に示します。

           DBG> examine *this

- メンバ関数の接頭辞引数のデータ・メンバ`m` を参照するためにこのパラメータを使用します。 例を次に示します。

           DBG> examine this->m

# C.8 COBOL

次の各サブトピックでは，デバッガによるCOBOLのサポートについて説明します。

## C.8.1 言語式の演算子

言語式でサポートされているCOBOLの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | ** | べき乗(VAX固有)
挿入辞 | = | 等値
挿入辞 | NOT = | 不等
挿入辞 | > | 大なり
挿入辞 | NOT < | 以上
挿入辞 | < | 小なり
挿入辞 | NOT > | 以下
挿入辞 | NOT | 論理否定
挿入辞 | AND | 論理積
挿入辞 | OR | 論理和

## C.8.2 言語式とアドレス式の構造

サポートされているCOBOLの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定
OF | レコードの構成要素の選択
IN | レコードの構成要素の選択

## C.8.3 データ型

サポートされているCOBOLのデータ型を次に示します。

COBOLのデータ型 | VMSのデータ型名
--- | ---
COMP | ロングワード整数(L,LU)
COMP | ワード整数(W,WU)
COMP | クォドワード整数(Q,QU)
COMP-1 | F浮動小数点数(F)
COMP-1 (Alpha 固有) | IEEE S浮動小数点数(FS)
COMP-2 | D浮動小数点数(D)
COMP-2 (Alpha固有) | IEEE T浮動小数点数(FT)
COMP-3 | パック10 進数(P)
INDEX | ロングワード整数(L)
英数字 | ASCII テキスト(T)
レコード | (なし)
数値符号なし | 数値文字列， 符号なし(NU)
先行分離記号 | 数値文字列，左分離記号(NL)
先行オーバパンチ記号 | 数値文字列，左オーバパンチされた記号(NLO)
終了分離記号 | 数値文字列,右分離記号(NR)
後続オーバパンチ記号 | 数値文字列，右オーバパンチされた記号(NRO)

COMP-1型の浮動小数点数は，コンパイラのスイッチによって，F浮動小数点数またはIEEE S 浮動小数点数のどちらかで表現されます。

COMP-2型の浮動小数点数は，コンパイラのスイッチによって，D浮動小数点数またはIE EE T 浮動小数点数のどちらかで表現されます。

## C.8.4 ソース表示

デバッガは，COPY文またはCOPY REPLACING文でプログラムに取り込まれたソース・ テキストを表示することができます。しかし，COPY REPLACING文またはREPLACE 文を使用した場合は，COPY REPLACING文またはREPLACE文で作成された修正後のソース・ テキストではなく，元のソース・テキストが表示されます。

デバッガは，REPORT節のコードに対応する元のソース行を表示することはできません。REPORT に対応するDATA SECTIONのソース行を見ることはできますが， レポートを作成するためのコンパイル済みコードに対応するソース行は表示されません。

## C.8.5 COBOLのINITIALIZE文と大きいテーブル( 配列) (Alphaのみ)

OpenVMS Alphaシステムでは，大きいテーブル(配列)が初期化されるときに，STEP コマンドを使用してCOBOLプログラムでINITIALIZE文を実行する場合， デバッガは非常に長い時間と多くのリソースを使用することがあります。

この問題を回避するには，INITIALIZE文をステップ実行するのではなく， INITIALIZE文の後の最初の実行可能な行にブレークポイントを設定します。

# C.9 DIBOL (VAXのみ)

次の各サブトピックでは，デバッガによるDIBOLのサポートについて説明します。

## C.9.1 言語式の演算子

言語式でサポートされているDIBOLの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | # | 丸め
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | // | 商が小数となる除算
挿入辞 | .EQ. | 等値
挿入辞 | .NE. | 不等
挿入辞 | .GT. | 大なり
挿入辞 | .GE. | 以上
挿入辞 | .LT. | 小なり
挿入辞 | .LE. | 以下
挿入辞 | .NOT. | 論理否定
挿入辞 | .AND. | 論理積
挿入辞 | .OR. | 論理和
挿入辞 | .XOR. | 排他的論理和

## C.9.2 言語式とアドレス式の構造

サポートされているDIBOLの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 部分文字列
[ ] | 添字指定
.(ピリオド) | レコードの構成要素の選択

## C.9.3 データ型

サポートされているDIBOLのデータ型を次に示します。

DIBOLのデータ型 | VMSのデータ型名
--- | ---
I1 | バイト整数(B)
I2 | ワード整数(W)
I4 | ロングワード整数(L)
Pn | パック10進数文字列(P)
Pn.m | パック10進数文字列(P)
Dn | 数値文字列，ゾーン記号(NZ)
Dn.m | 数値文字列，ゾーン記号(NZ)
An | ASCIIテキスト(T)
配列 | (なし)
レコード | (なし)

# C.10 Fortran

次の各サブトピックでは，デバッガによるFortranのサポートについて説明します。

## C.10.1 言語式の演算子

言語式でサポートされているFortranの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | ** | べき乗(VAX固有)
挿入辞 | // | 連結
挿入辞 | .EQ. | 等値
挿入辞 | == | 等値
挿入辞 | .NE. | 不等
挿入辞 | /= | 不等
挿入辞 | .GT. | 大なり
挿入辞 | > | 大なり
挿入辞 | .GE. | 以上
挿入辞 | >= | 大なりまたは等値
挿入辞 | .LT. | 小なり
挿入辞 | < | 小なり
挿入辞 | .LE. | 以下
挿入辞 | <= | 小なりまたは等値
接頭辞 | .NOT. | 論理否定
挿入辞 | .AND. | 論理積
挿入辞 | .OR. | 論理和
挿入辞 | .XOR. | 排他的論理和
挿入辞 | .EQV. | 同値
挿入辞 | .NEQV. | 排他的論理和

## C.10.2 言語式とアドレス式の構造

サポートされているFortranの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定
.(ピリオド) | レコードの構成要素の選択
% (パーセント記号) | レコードの構成要素の選択

## C.10.3 定義済みのシンボル

サポートされているFortranの定義済みのシンボルを次に示します。

シンボル | 説明
--- | ---
.TRUE. | 論理値TRUE
.FALSE. | 論理値FALSE

## C.10.4 データ型

サポートされているFortranのデータ型を次に示します。

Fortranのデータ型 | VMSのデータ型名
--- | ---
LOGICAL*1 | バイト符号なし(BU)
LOGICAL*2 | ワード符号なし(WU)
LOGICAL*4 | ロングワード符号なし(LU)
LOGICAL*8(Alpha 固有) | クォドワード符号なし(QU)
BYTE | バイト(B)
INTEGER*1 | バイト整数(B)
INTEGER*2 | ワード整数(W)
INTEGER*4 | ロングワード整数(L)
INTEGER*8(Alpha固有) | クォドワード整数(Q)
REAL*4 | F 浮動小数点数(F)
REAL*4(Alpha固有) | IEEE S浮動小数点数(FS)
REAL*8 | D浮動小数点数(D)
REAL*8 | G浮動小数点数(G)
REAL*8 (Alpha固有) | IEEE T浮動小数点数(FT)
REAL*16 (Alpha固有) | H浮動小数点数(H)
COMPLEX*8 | F複素数(FC)
COMPLEX*8 (Alpha固有) | IEEE S浮動小数点数(SC)
COMPLEX*16 | D複素数(DC)
COMPLEX*16 | G複素数(GC)
COMPLEX*16 (Alpha固有) | IEEE T浮動小数点数(TC)(Alpha固有)
CHARACTER | ASCIIテキスト(T)
配列 | (なし)
レコード | (なし)

LOGICALデータ型を表すのに内部的にはVMSの符号なし整数のデータ型(BU ，WU，LU，QU)が使用されるとしても，LOGICAL変数およびLOGICAL の値が言語式で使用されている場合は，デバッガはコンパイラと同様にLOGICAL の変数および値を符号付きとして処理します。

デバッガはLOGICAL変数およびLOGICAL式の値を.TRUE.や.FALSE.ではなく， 数値でプリントします。LOGICALの変数や値で有効なのは，通常は下位ビットだけで，0 が.FALSE.，1が.TRUE.です。しかし，Fortranでは， LOGICALの値のすべてのビットを操作することが許されており，言語式の中でLOGICAL の値を使用することができます。この理由から，LOGICAL変数やLOGICAL 式の整数値全体を見なければならない場合があるので，デバッガがそれを表示します。

(1.0,2.0)などのCOMPLEX定数は，デバッガの式ではサポートしていません。

REAL*4型およびCOMPLEX*8型の浮動小数点数は，コンパイラのスイッチに応じて，F 浮動小数点数またはIEEE S浮動小数点数で表現されることがあります。

REAL*8型およびCOMPLEX*16型の浮動小数点数は，コンパイラのスイッチに応じて，D 浮動小数点数，G浮動小数点数，またはIEEE T浮動小数点数で表現されることがあります。

OpenVMS Alphaシステムでは，デバッガは複素数変数を含む式を評価できません。 この問題を回避するには，複素数変数の内容を調べ，EXAMINEコマンドによって表示された複素数変数の実数部と虚数部を使用して， 式を評価します。

## C.10.5 初期化コード

/CHECK=UNDERFLOW修飾子または/PARALLEL修飾子を使用してコンパイルしたプログラムをデバッグする場合には， 次の例に示すようなメッセージが表示されます。

         DBG> RUN FORMS
         Language: FORTRAN, Module: FORMS
         Type GO to reach main program
         DBG>

"Type GO to reach MAIN program"というメッセージは，メイン・プログラムを開始する前に実行が中断されるため， デバッガの制御のもとで初期化コードを実行できることを示します。GO コマンドを入力すると，メイン・ プログラムの先頭に設定されます。その時点で，GOコマンドを入力すると， 他のFortranプログラムの場合と同様に，プログラムの実行を開始できます。

# C.11 MACRO-32

次の節では，デバッガによるMACRO-32のサポートについて説明します。

## C.11.1 言語式の演算子

MACRO-32言語には，高級言語の式と同じ意味での式というものはありません。 受け入れられるのはアセンブリ時の式と，限られた数の演算子だけです。 デバッグ時にMACRO-32のプログラミングで，他の言語の場合と同じくらい自由に式を使用できるようにするため， デバッガは，MACRO-32自体には含まれていない多数の演算子をMACRO-32 の言語式の中で受け入れるようになっています。 特に，BLISS以後にモデル化された比較演算子とブール演算子はすべて受け入れます。 間接参照演算子と通常の算術演算子も受け入れられます。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | @ | 間接参照
接頭辞 | . | 間接参照
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号( 否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | MOD | 剰余
挿入辞 | @ | 左シフト
挿入辞 | EQL | 等値
挿入辞 | EQLU | 等値
挿入辞 | NEQ | 不等
挿入辞 | NEQU | 不等
挿入辞 | GTR | 大なり
挿入辞 | GTRU | 大なり符号なし
挿入辞 | GEQ | 以上
挿入辞 | GEQU | 以上符号なし
挿入辞 | LSS | 小なり
挿入辞 | LSSU | 小なり符号なし
挿入辞 | LEQ | 以下
挿入辞 | LEQU | 以下符号なし
接頭辞 | NOT | ビット単位のNOT
挿入辞 | AND | ビット単位のAND
挿入辞 | OR | ビット単位のOR
挿入辞 | XOR | ビット単位の排他的論理和
挿入辞 | EQV | ビット単位の同値

## C.11.2 言語式とアドレス式の構造

サポートされている，MACRO-32の言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
[ ] | 添字指定
<p,s,e> | BLISS同様のビットフィールドの選択

MACRO-32アセンブラが作成するDST情報では，記憶域を割り当てるアセンブラ指示文の前にあるラベルは， そのラベルが変数名である配列変数として扱われます。 その結果，このようなデータを検査または操作するときに， 高級言語の配列の構文を使用することができます。

次のMACRO-32ソース・コードの例では，4個のワードに格納されている16 進数のデータをLAB4ラベルで指定しています。

         LAB4:    .WORD    ^X3F,5[2],^X3C

デバッガはLAB4を配列変数として処理します。たとえば次のコマンドは， 各要素(ワード)に格納されている値を表示します。

         DBG> EXAMINE LAB4
         .MAIN.\MAIN\LAB4
             [0]:        003F
             [1]:        0005
             [2]:        0005
             [3]:        003C

次のコマンドは，4番目のワードに格納されている値を表示します。1番目のワードは要素"0" で表されます。

         DBG> EXAMINE LAB4[3]
         .MAIN.\MAIN\LAB4[3]:    03C

## C.11.3 データ型

MACRO-32は，データ型をラベル名にバイトします。バインドは，ラベル定義に続くアセンブラ指示文に従って行なわれます。 サポートされているMACRO-32 の指示文を次に示します。

MACRO-32の指示文 | VMSのデータ型名
--- | ---
.BYTE | バイト符号なし(BU)
.WORD | ワード符号なし(WU)
.LONG | ロングワード符号なし(LU)
.SIGNED_BYTE | バイト整数(B)
.SIGNED_ WORD | ワード整数(W)
.LONG | ロングワード整数(L)
.QUAD | クォドワード整数(Q)
.F_FLOATING | F浮動小数点数(F)
.D_FLOATING | D浮動小数点数(D)
.G_ FLOATING | G浮動小数点数(G)
.H_FLOATING | H浮動小数点数(H)(VAX固有)
(該当なし) | パック10 進数(P)

## C.11.4 MACRO-32コンパイラ(AMACRO) (Alpha専用)

MACRO-32で記述したアプリケーションをAlphaシステムに移植する場合は，MACRO-32 コンパイラ(AMACRO)を使用します。MACRO-32でコンパイルされたコードをデバッグするためのデバッグ・ セッションは，アセンブルされたコードの場合に似ていますが， 本項で説明するような重要な相違もあります。 これらのアプリケーションを移植する場合の説明については， 『Porting VAX MACRO Code from OpenVMS VAX to OpenVMS Alpha』を参照してください。

### C.11.4.1 コードの再配置

大きな相違は，コードがコンパイルされているという事実です。VAXシステムでは，MACRO-32 の各命令は単一のマシン命令です。Alphaシステムでは，MACRO-32 の各命令は，Alphaの複数のマシン命令へとコンパイルされることがあります。 この相違によって大きな副作用が生じます。それは， コンパイル・コマンドで/NOOPTIMIZEを指定しない場合，コードの再配置と再スケジューリングが行われるということです。 コードのデバッグが終わってから，/NOOPTIMIZE を指定しないでリコンパイルすることにより性能を改善できます。

### C.11.4.2 シンボリック変数

コンパイルされたコードをデバッグする場合とアセンブルされたコードをデバッグする場合とには， 他にも大きな相違があります。それは， MACRO-32にとっての新しいコンセプトである，ルーチンの引数を調べるためのシンボリック変数の定義です。VAX システムでは，ルーチンをデバッグしていて， 引数をチェックしたくなったら，通常は，次のような入力を行うと考えられます。

                 DBG> EXAMINE @AP        ; to see the argument count
                 DBG> EXAMINE @AP+4      ; to examine the first arg

また，次のような入力をすることも考えられます。

                 DBG> EXAMINE @AP        ; to see arg count
                 DBG> EXAMINE .+4:.+20   ; to see first 5 args

Alphaシステムでは，引数はメモリ内のベクタには常駐していません。これがVAX システムとは異なる点です。さらにはまた，AlphaシステムにはAP レジスタがありません。MACROでコンパイルしたコードをデバッグしているときに，EXAMINE @AP と入力すると，デバッグは，APは未定義シンボルであるというメッセージを発行します。

コンパイルしたコードでは，引数は，次に述べる項目を組み合せたものとして常駐することができます。

- レジスタ

- ルーチンのスタック・フレームの上のスタック

- スタック・フレーム(ただし，引数リストがホーム・ポジションにあった， つまりVAX AP参照を解決するためにスタック・フレームの固定位置に配置されていた場合， またはレジスタ引数のセーブを要求するルーチンからの呼び出しがあった場合)

作成されたコードを読み出して引数を検索することをコンパイラがユーザに要求することはありません。 コンパイラには，引数の正しい位置を指し示す$ARG nシンボルがあります。$ARG0は，VAXシステムの@AP+0と同じもの， つまり引数の個数です。たとえば$ARG1は最初の引数，$ARG2は2 番目の引数です。これらの引数は，CALL_ENTRY指示文およびJSB_ENTRY指示文で定義されますが，EXCEPTION_ENTRY 指示文では定義されません。

### C.11.4.3 $ARGnシンボルを使用しない引数検索

ユーザのコードで，コンパイラが$ARGnシンボルを作成しない追加の引数が使用されることがあります。.CALL_ENTRY ルーチンに対して定義される$ARG nシンボルの個数は，コンパイラが自動検出またはMAX_ARGS によって検出した最大値または16のどちらか小さい方です。.JSB_ENTRY ルーチンの場合，引数は呼び出す側のスタック・フレーム内のホーム・ ポジションにあり，コンパイラは実際の数を検出できないので，$ARG nシンボルを常に8個作成します。

ほとんどの場合，追加の引数は容易に見つけられますが，そうでない場合もあります。

### C.11.4.4 検索しやすい引数

次の場合は，追加の引数は容易に見つけられます。

- 引数リストがホーム・ポジションにセットされていないで，$ARG nシンボルが$ARG7またはそれより大きいと定義されている場合。 引数リストがホーム・ポジションにセットされていない場合，$ARG7 以上の$ARGnシンボルは，スタック上でクォドワードとして引き渡されるパラメータのリストを常に指している。 それ以降の引数は， 最後に定義された$ARGnシンボルに続くクォドワードにある。

- 引数リストがホーム・ポジションにセットされていて，コンパイラが自動検出またはMAX_ARGS によって検出した最大値以下の引数をチェックしたい場合。 引数がホーム・ポジションにセットされていれば，$ARG nシンボルは，ホーム・ポジションにセットされた引数リストを常に指し示している。 それ以降の引数は，最後に定義された$ARG nシンボルに続くクォドワードにある。

たとえば，次のようにすればJSBルーチン内の8番目の引数より先にある引数を調べることができます。 この場合，引数リストのホーム・ポジションへのセットは呼び出す側で行うことが必要です。

           DBG> EX $ARG8  ; highest defined $ARGn
           .
           .
           .
           DBG> EX .+4  ; next arg is in next longword
           .
           .
           .
           DBG> EX .+4  ; and so on

この例では，引数リストをホーム・ポジションにセットするときに呼び出す側が少なくとも10 個の引数を検出したと想定しています。

引数のホーム・ポジションをセットしなかったルーチンの最後の$ARG nシンボルより先の引数を見つけるには，上記の例でEX .+4をEX .+8で置き換えた後，例に示すとおりに実行します。

### C.11.4.5 検出しにくい引数

次の場合は，追加の引数を見つけるのは容易ではありません。

- 引数リストがホーム・ポジションにセットされていて，コンパイラが検出した数を超える引数を調べたい場合。$ARG nシンボルは， ホーム・ポジションにセットされた引数リストに格納されているロングワードを指している。 コンパイラが転送する引数の数は，このリストで検出できる個数だけである。 ホーム・ポジションにセットされた引数のうちの最後の引数の先のロングワードを調べると， 各種の他のスタック・ コンテキストを調べることになる。

- 引数リストがホーム・ポジションにセットされていないで，$ARG nシンボルが単に$ARG6と定義されている場合。この場合， 既存の$ARGnはレジスタを指し示すか，スタック・フレーム内のクォドワードの記憶位置を指し示すことになる。 どちらの場合も， それ以降の引数は，定義された$ARGnシンボルの先のクォドワードの記憶位置を見ても調べることはできない。

これらのケースで追加の引数を見つける方法は，コンパイルされたマシン・ コードを調べ，引数がどこに常駐しているかを判断することです。チェックしたい引数の最大値に対してMAX_ARGS が正しく指定されていれば， どちらの問題も解消します。

### C.11.4.6 浮動小数点数データ付きのコードのデバッグ

Alphaシステムで浮動小数点数データ付きの，コンパイルされたMACRO-32 コードをデバッグする際の重要な情報を次に説明します。

- Alpha整数レジスタが浮動小数点数かどうか調べるには， EXAMINE/FLOATコマンドが使用できる。

  Alphaシステムに浮動小数点演算用レジスタが1セットあるとしても， 浮動小数点演算を含む，コンパイルされたMACRO-32コードでこれらのレジスタを使用することはない。 使用されるのはAlpha整数レジスタだけである。

  コンパイルされたMACRO-32コードでの浮動小数点数演算は，コンパイラの外部で動作するエミュレーション・ ルーチンで実行される。したがって， たとえばR7にMACRO-32浮動小数点数演算を実行しても，Alpha の浮動小数点数レジスタ7には影響はない。

- .FLOAT指示文または他の浮動小数点数記憶域指示文で宣言された記憶位置を調べるためにEXAMINE コマンドを使用するときは，デバッガは自動的にその値を浮動小数点数データとして表示する。

- G_FLOATデータ型を調べるためにEXAMINEコマンドを使用しているとき， デバッガは，その値をVAXデータに用に作成するためには2つのレジスタの内容を使用しない。

  次に例を示します。

           EXAMINE/G_FLOAT   R4

  この例では，VAXの場合と異なるり，R4とR5の下位ロングワードは値の作成には使用されない。 その代わり，R4の内容のクォドワードが使用される。

  コンパイラがD_FLOAT演算およびG_FLOAT演算用に作成したコードは，2 つの連続するレジスタの下位ロングワードのデータのVAX形式を保持している。 したがって，これらの2つのレジスタのどちらかにEXAMINE/G_ FLOATを使用しても，真の浮動小数点数値を得ることはできない。また， これらのレジスタのひとつにDEPOSIT/G_GLOATを実行しても必要な結果は得られない。 ただし，そのような値を半分にしたものをマニュアルで結合することはできる。 例えば，次の命令を実行したとする。

           MOVG    DATA, R6

  その後，現在R6とR7にあるG_FLOAT値を次のシーケンスで読み出すことができる。

           DBG> EX R6
           .MAIN.\%LINE 100\%R6:   0FFFFFFFF D8E640D1
           DBG> EX R7
           .MAIN.\%LINE 100\%R7:   00000000 2F1B24DD
           DBG> DEP R0 = 2F1B24DDD8E640D1
           DBG> EX/G_FLOAT R0
           .MAIN.\%LINE 100\%R0:   4568.89900000000

- DEPOSITコマンドを使用すれば，Alpha整数レジスタに浮動小数点数データを格納できる。 構文はVAXの場合と同じである。

- H_FLOATはサポートされていない。

### C.11.4.7 パック10進数データ付きのコードのデバッグ

Alphaシステムでパック10進数データ付きの，コンパイルされたMACRO-32 コードをデバッグする際の重要な情報を次に説明します。

- .PACKED指示文で宣言された記憶位置を調べるためにEXAMINEコマンドを使用するときは， デバッガは自動的にその値をパック10進数データ型として表示する。

- パック10進数データを格納できる。構文はVAXの場合と同じである。

# C.12 MACRO-64 (Alphaのみ)

以下の各節では，デバッガによるMACRO-64のサポートについて説明します。

## C.12.1 言語式の演算子

MACRO-64言語には，高級言語と同じ意味での式というものはありません。 受け入れられるのはアセンブリ時の式と，限られたセットの演算子だけです。 デバッグ時にMACRO-64 のプログラミングで，他の言語の場合と同じくらい自由に式を使用できるようにするため， デバッガは，MACRO-64自体には含まれていない多数の演算子をMACRO-64 の言語式の中で受け入れるようになっています。 特に，BLISS以後にモデル化された比較演算子とブール演算子のセットは完全に受け入れます。 間接参照演算子と通常の算術演算子も受け入れられます。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | @ | 間接参照
接頭辞 | . | 間接参照
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号( 否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | MOD | 剰余
挿入辞 | @ | 左シフト
挿入辞 | EQL | 等値
挿入辞 | EQLU | 等値
挿入辞 | NEQ | 不等
挿入辞 | NEQU | 不等
挿入辞 | GTR | 大なり
挿入辞 | GTRU | 大なり符号なし
挿入辞 | GEQ | 以上
挿入辞 | GEQU | 以上符号なし
挿入辞 | LSS | 小なり
挿入辞 | LSSU | 小なり符号なし
挿入辞 | LEQ | 以下
挿入辞 | LEQU | 以下符号なし
接頭辞 | NOT | ビット単位のNOT
挿入辞 | AND | ビット単位のAND
挿入辞 | OR | ビット単位のOR
挿入辞 | XOR | ビット単位の排他的論理和
挿入辞 | EQV | ビット単位の同値

## C.12.2 言語式とアドレス式の構造

サポートされている，MACRO-64の言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
<p,s,e> | BLISS同様のビットフィールド

## C.12.3 データ型

MACRO-64は，データ型をラベル名にバインドします。バインドは，ラベル定義に続くアセンブラ指示文に従って行われます。 たとえば，次のコード内の.LONG データ指示文は，ロングワード整数データ型をラベルV1，V2， およびV3にバインドするようMACRO-64に対して指示します。

         .PSECT A, NOEXE
         .BYTE 5
         V1:
         V2:
         V3: .LONG 7

V1，V2，およびV3にバインドされている型を確認するには，SHOW SYMBOL /TYPEコマンドをV*パラメータ付きで実行します。実行結果の表示は次のとおりです。

            data  .MAIN.\V1
               atomic type, longword integer, size: 4 bytes
            data .MAIN.\V2
               atomic type, longword integer, size: 4 bytes
            data .MAIN.\V3
               atomic type, longword integer, size: 4 bytes)

サポートされているMACRO-64の指示文を次に示します。

MACRO-64のデータ型 | VMSのデータ型名
--- | ---
.BYTE | バイト符号なし(BU)
.WORD | ワード符号なし(WU)
.LONG | ロングワード符号なし(LU)
.SIGNED_BYTE | バイト整数(B)
.SIGNED_ WORD | ワード整数(W)
.LONG | ロングワード整数(L)
.QUAD | クォドワード整数(Q)
.F_FLOATING | F浮動小数点数(F)
.D_FLOATING | D浮動小数点数(D)
.G_FLOATING | G浮動小数点数(G)
.S_FLOATING (Alpha固有) | S浮動小数点数(S)
.T_FLOATING (Alpha固有) | T浮動小数点数(T)
(該当なし) | パック10 進数(P)

# C.13 PASCAL

以下の各サブトピックでは，デバッガによるPascalのサポートについて説明します。

## C.13.1 言語式の演算子

言語式でサポートされているPascalの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算，連結
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 実数の除算
挿入辞 | DIV | 整数の除算
挿入辞 | MOD | モジュロ
挿入辞 | REM | 剰余
挿入辞 | ** | べき乗(VAX固有)
挿入辞 | IN | 集合メンバーシップ
挿入辞 | = | 等値
挿入辞 | <> | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
接頭辞 | NOT | 論理否定
挿入辞 | AND | 論理積
挿入辞 | OR | 論理和
+ VAX固有

型キャスト演算子(::)は，言語式ではサポートされていません。

## C.13.2 言語式とアドレス式の構造

サポートされている，Pascalの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
[ ] | 添字指定
.(ピリオド) | レコードの構成要素の選択
^(サーカンフレックス) | ポインタの間接参照

## C.13.3 定義済みのシンボル

サポートされている，Pascalの定義済みのシンボルを次に示します。

シンボル | 意味
--- | ---
TRUE | 論理値TRUE
FALSE | 論理値FALSE
NIL | NILポインタ

## C.13.4 組み込み関数

サポートされている，Pascalの組み込み関数を次に示します。

シンボル | 意味
--- | ---
SUCC | 論理的後続データ
PRED | 論理的先行データ

## C.13.5 データ型

サポートされているPascalのデータ型を次に示します。

Pascalのデータ型 | VMSのデータ型名
--- | ---
INTEGER | ロングワード整数(L)
INTEGER | ワード整数(W,WU)
INTEGER | バイト整数(B,BU)
UNSIGNED | ロングワード符号なし(LU)
UNSIGNED | ワード符号なし(WU)
UNSIGNED | バイト符号なし(BU)
SINGLE，REAL | F 浮動小数点数(F)
REAL(Alpha固有) | IEEE S浮動小数点数(FS)
DOUBLE | D浮動小数点数(D)
DOUBLE | G浮動小数点数(G)
DOUBLE(Alpha固有) | IEEE T浮動小数点数(FT)
QUADRUPLE(VAX固有) | H浮動小数点数(H)
BOOLEAN | (なし)
CHAR | ASCIIテキスト(T)
VARYING OF CHAR | 変形テキスト(VT)
SET | (なし)
FILE | (なし)
列挙 | (なし)
部分範囲 | (なし)
型付きポインタ | (なし)
配列 | (なし)
レコード | (なし)
可変レコード | (なし)

Pascalの言語式の中では，デバッガは，[1,2,5,8..10]や[RED,BLUE]といったPascal の集合定数を受け入れます。

REAL型の浮動小数点数は，コンパイラのスイッチまたはソース・コードの属性によって，F 浮動小数点数またはIEEE S浮動小数点数のどちらかで表現されます。

DOUBLE型の浮動小数点数は，コンパイラのスイッチまたはソース・コードの属性によって，D 浮動小数点数，G浮動小数点数，またはIEEE T浮動小数点数のどれかで表現されます。

## C.13.6 補足情報

通常は，変数，レコード・フィールド，配列の構成要素のそれぞれに対して， 検査，評価，格納を行うことができますが，次の場合は例外です。プログラムの中で変数が参照されていない場合，Pascal コンパイラは変数を割り当てません。 変数を割り当てていないときにその変数を検査しようとしたり， その変数へ格納しようとするとエラー・メッセージが表示されます。

変数にデータを格納する場合，格納される値が変数よりも大きいときは， デバッガは上位ビットを切り捨てます。格納される値が変数よりも小さいときは， 上位ビットをゼロで埋めます。代入互換性の規則に違反した格納をすると情報メッセージが表示されます。

実行中のブロック内であればどのブロックでも自動変数を調べたり，自動変数へ格納することができます。 しかし，自動変数はスタック領域に割り当てられ， レジスタに格納されるので，変数が初期化されるまで，または変数に値が代入されるまで， 自動変数の値は未定義であるとみなされます。

## C.13.7 制限事項

Pascalについてのデバッガの制限事項は次のとおりです。

VARYING OF CHARの文字列の値を調べることはできますが，Pascalの通常の構文を使用して.LENGTH フィールドや.BODYフィールドの値を調べることはできません。 たとえば，VARSが文字列変数名の場合，次のコマンドはサポートされません。

         DBG> EXAMINE VARS.LENGTH
         DBG> EXAMINE VARS.BODY

これらのフィールドを確認するには，次の方法を使用します。

使用する | 使用しない
--- | ---
EXAMINE/WORD VARS | EXAMINE VARS.LENGTH
EXAMINE/ASCII VARS+2 | EXAMINE VARS.BODY

# C.14 PL/I

次の各サブトピックでは，デバッガによるPL/Iのサポートについて説明します。

## C.14.1 言語式の演算子

言語式でサポートされているPL/Iの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | ** | べき乗
挿入辞 | || | 連結
挿入辞 | = | 等値
挿入辞 | ^= | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | ^< | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
挿入辞 | ^> | 以下
接頭辞 | ^ | ビット単位のNOT
挿入辞 | & | ビット単位のAND
挿入辞 | | | ビット単位のOR

## C.14.2 言語式とアドレス式の構造

サポートされている，PL/Iの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定
.(ピリオド) | 構造体の構成要素の選択
-> | ポインタの間接参照

## C.14.3 データ型

サポートされているPL/Iのデータ型を次に示します。

PL/Iのデータ型 | VMSのデータ型名
--- | ---
FIXED BINARY | バイト整数(B)，ワード整数 (W) ，またはロングワード整数(L)
FIXED DECIMAL | パック10進数(P)
FLOAT BIN/DEC | F浮動小数点数(F)
FLOAT BIN/DEC | D浮動小数点数(D)
FLOAT BIN /DEC | G浮動小数点数(G)
FLOAT BIN/DEC(VAX固有) | H浮動小数点数(H)
BIT | ビット(V)
BIT | ビット境界合わせなし(VU)
CHARACTER | ASCIIテキスト(T)
CHARACTER VARYING | 変形テキスト(VT)
FILE | (なし)
ラベル | (なし)
ポインタ | (なし)
配列 | (なし)
構造体 | (なし)

## C.14.4 静的変数と非静的変数

次の記憶クラスの変数は静的に割り当てられます。
STATIC
EXTERNAL
GLOBALDEF
GLOBALREF

次の記憶クラスの変数は，スタック上またはレジスタ内に非静的に割り当てられます。
AUTOMATIC
BASED
CONTROLLED
DEFINED
PARAMETER

## C.14.5 データの検査と操作

以下の各サブトピックでは，PL/Iのデータ型を使用したEXAMINEコマンドの例を示します。 デバッガのサポートでPL/I固有の事項についても説明しています。

### C.14.5.1 EXAMINEコマンドの例

次に，EXAMINEコマンドでのいくつかのPL/Iのデータ型の使用例を示します。

- FIXED DECIMAL (10,5)として宣言されている変数の値を調べます。

           DBG> EXAMINE X
           PROG4\X:    540.02700

- 構造体変数の値を表示します。

           DBG> EXAMINE PART
           MAIN_PROG\INVENTORY_PROG\PART
               ITEM:       "WF-1247"
               PRICE:        49.95
               IN_STOCK:     24

- ピクチャ変数の値を調べます。デバッガは値を二重引用符で囲んで表示するので注意してください。

           DBG> EXAMINE Q
           MAIN\Q:    "666.3330"

- ポインタの値(ポインタがアクセスする変数の仮想アドレス)を調べ， その値を省略時設定の10進数ではなく，16進数で表示します。

           DBG> EXAMINE/HEXADECIMAL P
           PROG4\SAMPLE.P:  0000B2A4

- BASED属性を持った変数の値を調べます。ここでは，変数XのポインタであるPTR を使用して，変数XをBASED(PTR)として宣言しています。

           DBG> EXAMINE X
           PROG\X:    "A"

- BASEDとして宣言されている変数Xの値を，POINTERとして宣言されている変数PTR を使用して調べます。ここでは前の例のようにXがBASED(PTR) として宣言されているのではなく，PL/Iコードの後続行でPTR をXと対応づけています。

           ALLOCATE X SET (PTR);

  この場合，Xの値は次のように調べられます。

           DBG> EXAMINE PTR->X
           PROG6\PTR->X:    "A"

### C.14.5.2 デバッガのサポートについての注意事項

デバッガによるPL/Iのサポートについては次の点に注意してください。

入口変数やラベル変数で，または入口やラベルの形式でDEPOSITコマンドを使用することはできません。 また，配列全体や構造体全体といっしょにDEPOSIT コマンドを使用することもできません。入口変数やラベル変数で， または入口やラベルの形式でEXAMINEコマンドを使用することはできません。EXAMINE コマンドの代わりにEVALUATE/ADDRESSコマンドを使用してください。

GLOBALDEF VALUEリテラルなどのグローバル・リテラルの属性や値を確認するためにEXAMINE コマンドを使用することはできません。これはグローバル・ リテラルが静的な式であるためです。代わりにEVALUATEコマンドを使用してください。

コンパイル時の変数およびプロシージャといっしょに，EXAMINE， EVALUATE，DEPOSITの各コマンドを使用することはできません。しかし， その定数がデスティネーションではなくソースである場合は，コンパイル時の定数とともにEVALUATE コマンドやDEPOSITコマンドを使用することができます。EXAMINE コマンドは使用できません。

初期化されていない自動変数の内容は，値が代入されるまでは無効です。 代入する前に検査した場合，どのような値が表示されるかは予測できません。

他のポインタの値をポインタ変数に格納することで両方のポインタへのシンボル参照を行うか， または，仮想アドレスをポインタ変数に格納するかのどちらかの方法によって， ポインタ変数へ値を格納することができます。EVALUATE/ADDRESS コマンドを使用すると，変数の仮想アドレスを知ることができます。 それからそのアドレスをポインタに格納してください。 ポインタをチェックする場合，デバッガは，ポインタが指す変数の仮想アドレスの形式でポインタの値を表示します。

PL/Iの言語規則に準拠するために，PL/Iの言語式のnまたは n.nの形式の数値定数はすべて整数定数や浮動小数点定数ではなく， パック10進数の定数として処理されます。したがって，10の内部表現は0C01h であり，0Ahではありません。

nEnまたはn.nEnの構文を使用すると，浮動小数点定数を入力することができます。

内部表現がロングワード整数である定数を入力する構文は，PL/Iにはありません。 デバッガはPL/Iの型変換規則をサポートしているので，通常， デバッグ時にこの制約が重大なものになることはありませんが，整数定数を入力することはできます。 入力にはデバッガの%HEX，%OCT，%BINの各演算子を使用してください。 これが可能なのは，10進数以外の定数はFIXED BINARY とみなされるためです。たとえば，EVALUATE/HEXADECIMAL 53 + %HEX 0というコマンドは00000035を表示します。

# C.15 RPG II (VAXのみ)

次の各節では，デバッガによるRPG IIのサポートについて説明します。

## C.15.1 言語式の演算子

言語がRPG IIに設定されている場合，言語式では次の演算子がサポートされます。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | = | 等値
挿入辞 | NOT = | 不等
挿入辞 | > | 大なり
挿入辞 | NOT < | 以上
挿入辞 | < | 小なり
挿入辞 | NOT > | 以下
接頭辞 | NOT | 論理否定
挿入辞 | AND | 論理積
挿入辞 | OR | 論理和

## C.15.2 言語式とアドレス式の構造

サポートされている，RPG IIの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定

## C.15.3 データ型

サポートされているRPG IIのデータ型を次に示します。

RPG IIのデータ型 | VMSのデータ型名
--- | ---
ロングワード2進数 | ロングワード整数(L)
ワード2進数 | ワード整数(W)
パック10 進数 | パック10進数(P)
文字 | ASCIIテキスト(T)
オーバパンチされた10進数 | 右オーバパンチされた記号(NRO)
配列 | (なし)
表 | (なし)

## C.15.4 ブレークポイントまたはトレースポイントの設定

RPG IIプログラムでは，ソースの行番号，論理サイクルのラベル，ユーザ定義のタグ名， サブルーチンのラベルなどを使用してブレークポイントを設定することができます。RPG II プログラムのデバッグは，他のプログラムのデバッグと多少異なります。 次の各サブトピックでは，ブレークポイントやトレースポイントを設定する場所とその方法について説明します。

### C.15.4.1 仕様

仕様のどこにブレークポイントまたはトレースポイントを行番号で設定できるかを次に説明します。

RPG IIプログラムのサイクルは，プログラムの行が処理される順番を決定します。 ブレークポイントやトレースポイントを設定するときは，RPG II がユーザ・プログラムに割り当てる行番号を参照することができます。これらの行番号はリスト・ ファイルか，デバッガのソース表示で見ることができます。 仕様の欄1から5にユーザが指定する行番号は使用されません。

コンパイラは，特定の仕様にだけ，論理サイクル内の特定の箇所で行番号を付けます。 したがって，プログラム内のそれらの箇所にブレークポイントやトレースポイントを設定することができます。

- ファイル仕様でのブレークポイントは，入力ファイルまたは更新ファイルをオープンする前， または出力ファイルを作成した直後に置きます。 このブレークポイントの行番号は，このファイルのファイル仕様に対応します。

- 入力仕様でのブレークポイントは，レコードからのデータをフィールドにロードする前に置きます。 このブレークポイントの行番号は， 入力仕様のレコード定義に対応します。

- 各演算仕様には，それぞれ2つのブレークポイントを設定することができます。1 つ目のブレークポイントは，制御レベル標識がある場合はそれをテストしたあと， かつ条件指定標識をテストする直前に置きます。2 番目のブレークポイントは，演算コードを実行する直前に置きます。 次の構文を使用してください。

           SET BREAK line-number.statement-number

  たとえば，演算仕様が行番号25から始まっているとします。SET BREAK 25.1というコマンドで，標識をテストすることができます。SET BREAK 25.2というコマンドを使用すると，演算コードを実行する直前にブレークポイントが置かれます。 演算仕様に条件指定標識がない場合は， SET BREAK 25というコマンドを使用すると，演算コードを実行する直前にブレークポイントが置かれます。

  文番号を指定できるのは，条件指定標識がある演算仕様だけです。

- 出力仕様のブレークポイントは，出力バッファが作成されたあと， かつレコードが出力される前に置きます。ブレークポイントの行番号は， 出力仕様の中のレコード定義に対応します。

### C.15.4.2 ラベル

RPG IIのラベルをブレークポイントやトレースポイントとして設定することができます。 ユーザ定義のタグに加えて，次のRPG IIのラベルが用意されています。 これらのラベルは論理サイクル内の特定の箇所に対応します。 これらのラベルはソース・コードには表示されませんが，デバッガからはアクセス可能です。 これらのラベルは機械語コード・リストに記されています。

RPG IIのラベル | 機能およびブレークポイントの動作
--- | ---
*DETL | 行の詳細と見出しを出力する直前でブレークする。
*GETIN | 1次ファイルまたは2次ファイルから次のレコードを読み込む直前でブレークする。
*TOTC | 合計時の算出を実行する直前でブレークする。
*TOTL | 合計時の出力を実行する直前でブレークする。
*OFL | オーバフローの出力を実行する直前でブレークする。
*DETC | 明細時の算出を実行する直前でブレークする。

次に例を示します。

         DBG> SET BREAK *TOTL

## C.15.5 EXAMINEコマンド

EXAMINEコマンドを使用すると，変数の内容，現在のテーブル項目，配列要素， または入出力バッファを確認することができます。

- 配列変数の値を調べるときは，次の例のように配列の構文を使用します。

           DBG> EXAMINE ARR3(9)    ! ARR3 配列の要素 9 を表示する
           DBG> EXAMINE ARRY(1:7)  ! ARRY 配列の要素 1 〜 7 を表示する

- テーブル名を指定すると，最後のLOKUP操作で検索した項目を確認することができます。

- 入出力バッファの内容を表示するには，ファイル名の後ろに文字列$BUF を付けて，入力ファイル，更新ファイル，出力ファイルをそれぞれ指定します。 たとえば，次のコマンドは入力ファイルINPUTのための入出力バッファの内容を表示します。

           DBG> EXAMINE INPUT$BUF

- 次のコマンドは，6文字の長さの文字列であるSTRINGを，同値のASCII 形式で表示します。

           DBG> EXAMINE/ASCII:6 STRING

- アットマーク(@)を含む変数の値を調べるときは，次のように%NAME を使用します。

           DBG> EXAMINE %NAME 'ITEM@'

- 非外部標識の値を調べるときは，文字列*INを使用して非外部標識を指定してください。 次に例を示します。

           DBG> EXAMINE *IN56
           *IN56:  "0"

  標識がオフに設定されていると0が表示され，オンに設定されていると1 が表示されます。

  この方法で外部標識を確認することはできません。外部標識の値を調べるには， その前に，/NOSYSSHR修飾子を使用してプログラムをリンクする必要があります。 その後，次の例のようにCALLコマンドを使用します。 この例ではU5の値を表示します。

           DBG> CALL RPG$EXT_INDS(5)
           value returned is 0

## C.15.6 DEPOSITコマンド

DEPOSITコマンドを使用するときは，次の点に注意してください。

- 配列の構文を使用して，配列の1つの要素に1つの値を格納することができます。 次に例を示します。この例はARR配列の要素2に150という値を格納します。

           DBG> DEPOSIT ARR(2) = 150

- DEPOSITコマンドで/ASCII修飾子を使用すると，1つの文字列配列に複数の値を格納することができます。 たとえば，INV.RPGプログラムのPARTS 配列が10個の要素を持っており，各要素の文字列の長さは3 であるとします。次のDEPOSITコマンドでは，PARTS配列の要素4，5，6 にそれぞれ，P04，P05，P06という文字列が格納されます。

           DBG> DEPOSIT/ASCII PARTS(4) = "P04P05P06"
           DBG> EXAMINE PARTS(4:6)
           INV\PARTS
               (4):     'P04'
               (5):     'P05'
               (6):     'P06'

- 数値フィールドに格納された値は，小数点で位置合わせが行われます。 フィールドが短い場合，小数点の左右にゼロが埋め込まれます。

- 文字フィールドに格納される値は左寄せされます。格納された値が文字フィールドよりも少ない場合， フィールドの右は空白文字で埋められます。

- DEPOSITコマンドで非外部標識の設定をオンまたはオフにするには， 文字列*INで標識を指定します。値1を格納すると標識はオンになり， 値0を格納するとオフに設定されます。たとえば次のコマンドは， 標識56をオンに設定します。

           DBG> DEPOSIT *IN56 = "1"

## C.15.7 EDITコマンド

EDITコマンドを使用すると，DECランゲージ・センシティブ・エディタではなく，RPG II のエディタが起動します。

# C.16 SCAN (VAXのみ)

次の各サブトピックでは，デバッガによるSCANのサポートについて説明します。

## C.16.1 言語式の演算子

言語式でサポートされているSCANの演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | & | 連結
挿入辞 | = | 等値
挿入辞 | <> | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
接頭辞 | NOT | 補数
挿入辞 | AND | 論理積
挿入辞 | OR | 集合和
挿入辞 | XOR | 排他的論理和

## C.16.2 言語式とアドレス式の構造

サポートされている，SCANの言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
( ) | 添字指定
.(ピリオド) | レコードの構成要素の選択
-> | ポインタの間接参照

## C.16.3 定義済みのシンボル

サポートされている，SCANの定義済みのシンボルを次に示します。

シンボル | 意味
--- | ---
TRUE | 論理値TRUE
FALSE | 論理値FALSE
NIL | NILポインタ

## C.16.4 データ型

サポートされているSCANのデータ型を次に示します。

SCANのデータ型 | VMSのデータ型名
--- | ---
BOOLEAN | (なし)
INTEGER | ロングワード整数(L)
POINTER | (なし)
FIXED STRING(n) | CLASS=Sのテキスト
VARYING STRING(n) | CLASS=VSのテキスト
DYNAMIC STRING | CLASS=Dのテキスト
TREE | (なし)
TREEPTR | (なし)
RECORD | (なし)
OVERLAY | (なし)

次のデータ型はサポートしていません。
FILE
TOKEN
GROUP
SET

## C.16.5 名前

デバッガ・コマンドでは，次のSCANの構造名を使用することができます。
プロシージャ
マクロ
定数
変数
ラベル

## C.16.6 実行の制御

SCANのブレークポイント，トレースポイント，ウォッチポイントについては， 次の点に注意してください。

### C.16.6.1 ブレークポイントとトレースポイント

行番号の他に，プロシージャ，トリガ・マクロ，構文マクロ，ラベルにもブレークポイントやトレースポイントを設定することができます。 次に例を示します。

         DBG> SET BREAK find_keyword    !トリガ・マクロでブレークする。
         DBG> CANCEL BREAK exit         !ラベルのブレークを取り消す。
         DBG> SET BREAK compare_trees   !プロシージャでブレークする。

SCANの画像マッチングをモニタする場合，通常のブレークポイントやトレースポイントはそれほど便利ではありません。 プログラムが作成するトークンをモニタするにはどこにブレークポイントやトレースポイントを設定したらいいのでしょう。 プログラムにはそのようなブレークポイントを設定すべき文がありません。

この問題を解決するために，VAX SCANはいくつかのイベントを定義します。 これらのイベントにブレークポイントやトレースポイントを設定すると， 画像マッチングのプロセスをモニタすることができます。

SCANプログラムでは，次のイベント・キーワードが定義されます。

イベント・キーワード | 機能
--- | ---
TOKEN | トークンを作成する。
PICTURE | 画像のオペランドを照合中である。
INPUT | 入力ストリームの改行を読み込む。
OUTPUT | 出力ストリームの改行を書き込む。
TRIGGER | トリガ・マクロを開始または終了する。
SYNTAX | 構文マクロを開始または終了する。
ERROR | 画像マッチングのエラー回復を開始または終了する。

これらのキーワードは，次のコマンドで/EVENT修飾子といっしょに使用してください。
(SET,CANCEL,ACTIVATE,DEACTIVATE) BREAK
(SET,CANCEL,ACTIVATE,DEACTIVATE) TRACE

たとえば，次のコマンドで設定したブレークポイントは，TOKENを作成すると必ず検出されます。

         DBG> SET BREAK/EVENT=TOKEN

メイン・プログラムがSCANで記述されている場合，デバッガは自動的にSCAN のイベントを認識できるようにします。別の言語で記述されたプログラムをデバッグしていて， そのプログラムがSCANルーチンを呼び出す場合は， 次の手順に従ってSCANの環境を設定してください。

1. 言語固有の演算子，式，およびその他の構造を認識可能にするために，SET LANGUAGE SCAN コマンドを入力する(SET LANGUAGEコマンドの説明を参照。)

2. SCANのイベントを認識可能にするために，SET EVENT_FACILITY SCANコマンドを入力する(SET EVENT_FACILITYコマンドの説明を参照) 。SHOW EVENT_FACILITYコマンドを使用すると，現在のファシリティとそのイベントを表示できます。

### C.16.6.2 ウォッチポイント

SCANのウォッチポイントについては，次の点に注意してください。

- 省略時設定では，MODULEレベルで宣言された変数は静的変数になる。

- 省略時設定では，PROCEDUREレベルまたはMACROレベルで宣言された変数は自動( 非静的)変数になる。

- DYNAMIC STRING変数は動的に作成される。文字列の値が変わると， その文字列の値を保持している記憶域も変更されることがある。 したがって，文字列の値が変更された場合，デバッガがウォッチしている記憶域が違ったものになることがある。

## C.16.7 検査と格納

次の各サブトピックでは，次のSCAN変数の検査方法と，これらの変数への格納の方法について説明します。
STRING
FILL
POINTER
TREE
TREEPTR
RECORD
OVERLAY

### C.16.7.1 STRING変数

FIXED STRING変数に格納する場合，その変数の宣言で設定したサイズよりも長い文字列を格納すると， 切り捨てが行われます。

VARYING STRING変数に格納する場合，その変数の宣言で設定した最大長よりも長いサイズの文字列を格納すると， 切り捨てが行われます。

DYNAMIC STRING変数に格納する場合，その変数の現在のサイズよりも長い文字列を格納すると， 切り捨てが行われます。

FIXED STRING変数およびDYNAMIC STRING変数では，変数の現在のサイズよりも短い文字列を格納すると， その文字列は左寄せされ，埋められなかった部分の右側はブランク文字で埋められます。

VARYING STRING変数の場合，変数を格納している現在の領域は，格納される変数に合わせてサイズが調節されます。

### C.16.7.2 FILL変数

省略時設定でFILL変数の値を調べると，指定した変数の内容が文字列として表示されるので， それを見てもほとんど意味がないことがあります。フィルの特性または型が分かっているときは， 適切な修飾子をコマンドに使用することによって， 意味のある表示を行わせることができます。次の例は， フィルxが単精度浮動小数点数であると分かっているときのコマンドです。

         DBG> EXAMINE/FLOAT x

### C.16.7.3 POINTER変数

POINTERが指している変数のアドレスを検索するために，POINTERを名前でチェックすることができます。POINTER に基づく変数を検査するには，負符号と右不等号を組み合わせた演算子(->) を使用してください。

次の宣言と代入が行われた場合について考えます。

         TYPE symnode: RECORD
                          ptr:  POINTER TO symnode,
                          vstr: VARYING STRING( 20 ),
                       END RECORD;

         DECLARE x   : symnode;
         DECLARE xptr: POINTER TO symnode;
         xptr        = POINTER(x);
         x.vstr      = 'prehensile';

次のコマンドは，xの構成要素であるvstrの値を表示します。

         DBG> EXAMINE x.vstr
         POINTER\MAINPOINTER\X.VSTR: 'prehensile'

次のコマンドは，POINTERに基づいてvstrの値を表示します。

         DBG> EXAMINE xptr->.vstr
         POINTER\MAINPOINTER\XPTR->.VSTR: 'prehensile '

### C.16.7.4 TREE変数とTREEPTR変数

次の構文を使用すると，木構造のノードの内容を調べることができます。

         EXAMINE tree_variable([subscript], . . . )

TREE変数へ格納することはできません。

EXAMINEコマンドで木構造の名前を指定すると，その木構造のノードと葉の内容がすべて表示されます。 次に例を示します。

         DBG> EXAMINE voters

下位ノードの指定は，そのノードの添字を入力すればできます。次に例を示します。

         DBG> EXAMINE voters('salem')

確認したい葉につながる添字をすべて指定すると，木構造の葉ノードを調べることができます。 次に例を示します。

         DBG> EXAMINE voters('salem',ward2)

cityptrまたはwardptrなどのTREEPTR変数を調べると， その木ノードのアドレスが表示されます。TREEPTR変数が何を指しているかを次のようにして確認します。

         DBG> EXAMINE cityptr->

### C.16.7.5 RECORD変数とOVERLAY変数

EXAMINEコマンドを使用するときにRECORDを名前で指定すると，RECORDのすべての構成要素が表示されます。RECORD の構成要素を個々に調べるには， 各構成要素をフル・ネームで指定します。

一般的な書式は次のとおりです。

         EXAMINE recordname

         EXAMINE recordname.componentname.componentname . . .

OVERLAYの確認方法もこれと同様です。OVERLAYの場合も構成要素がすべて表示されます。 このように，FILL(4)，INTEGER，VARYING STRING(2)がそれぞれ4 バイトの領域であれば，4つのバイトは3種類の異なった形式で表示されます。

# C.17 UNKNOWN言語

次の各サブトピックでは，UNKNOWNである言語の，デバッガのサポートについて説明します。

## C.17.1 言語式の演算子

UNKNOWNの言語について，言語式でサポートされている演算子を次に示します。

種類 | シンボル | 機能
--- | --- | ---
接頭辞 | + | 単項正符号
接頭辞 | - | 単項負符号(否定)
挿入辞 | + | 加算
挿入辞 | - | 減算
挿入辞 | * | 乗算
挿入辞 | / | 除算
挿入辞 | ** | べき乗(VAX固有)
挿入辞 | & | 連結
挿入辞 | // | 連結
挿入辞 | = | 等値
挿入辞 | <> | 不等
挿入辞 | /= | 不等
挿入辞 | > | 大なり
挿入辞 | >= | 以上
挿入辞 | < | 小なり
挿入辞 | <= | 以下
挿入辞 | EQL | 等値
挿入辞 | NEQ | 不等
挿入辞 | GTR | 大なり
挿入辞 | GEQ | 以上
挿入辞 | LSS | 小なり
挿入辞 | LEQ | 以下
接頭辞 | NOT | 論理否定
挿入辞 | AND | 論理積
挿入辞 | OR | 論理和
挿入辞 | XOR | 排他的論理和
挿入辞 | EQV | 同値

## C.17.2 言語式とアドレス式の構造

UNKNOWNの言語について，サポートされている言語式とアドレス式の構造を次に示します。

シンボル | 構造
--- | ---
[ ] | 添字指定
( ) | 添字指定
.(ピリオド) | レコードの構成要素の選択
^(サーカンフレックス) | ポインタの間接参照

## C.17.3 定義済みのシンボル

UNKNOWNの言語について，サポートされている定義済みのシンボルを次に示します。

シンボル | 意味
--- | ---
TRUE | 論理値TRUE
FALSE | 論理値FALSE
NIL | NILポインタ

## C.17.4 データ型

言語がUNKNOWNに設定されている場合，デバッガは，他の言語で受け入れられるデータ型をすべて認識しますが， ピクチャ型やファイル型など，限られたいくつかの言語固有のデータ型は認識しません。UNKNOWN の言語式では，OpenVMS 呼び出し標準規則のスカラ・データ型のほとんどを使用することができます。

- UNKNOWNの言語では，レコードの構成要素の選択にドット表記法を使用することができます。 たとえば，CがレコードBの構成要素であり， そのBがレコードAの構成要素である場合，A.B.Cという表記でC を参照することができます。また，配列のどの構成要素にも添字を付けることができます。 たとえばBが配列であるとすると，A.B[2,3].CでC を参照することができます。

- UNKNOWNの言語では，丸括弧と角括弧の両方を添字の括弧に使用することができます。 たとえば，A[2,3]とA(2,3)は等価です。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]