[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]
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コンパイラでコンパイルしなければなりません。 | |||
サポートされている言語のほとんどに共通するデバッグ方法については, マニュアルで説明しています。ヘルプ・トピックには各言語に固有の次の内容が含まれています。
デバッガは,各言語の構文,データ型,有効範囲規則を認識します。また, 各言語の演算子および式の構文も認識します。したがって,デバッガ・ コマンドを使用するときは,変数やその他のプログラム要素をプログラムのソース・ コードに記述する場合と同じように指定することができます。 また,その言語の構文を使用してソース言語の式の値を計算することもできます。
サポートされている言語のほとんどに共通するデバッグ方法については, マニュアルで説明しています。ヘルプ・トピックには各言語に固有の次の内容が含まれています。
言語固有のデバッガのサポートについての詳しい説明は,各言語とともに提供されるドキュメントを参照してください。
プログラムが複数の言語で記述されている場合,デバッグ・セッションの途中でデバッグ・ コンテキストを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を参照してください。
次の各サブトピックではデバッガによるAdaのサポートについて説明します。Ada のタスキング・プログラムに固有の情報については,第17章も参照してください。
次の各サブトピックでは,デバッガがサポートしているAdaの名前,シンボル, および定義済みの属性について説明します。
名前の一部分は言語式(たとえば,'FIRSTや'POSといった属性)である場合があるので注意してください。 このことは,EXAMINE,EVALUATE, DEPOSITの各コマンドでこれらの名前を使用する方法に影響します。列挙型の例については, オンライン・ヘルプのSpecifying_Attributes_with_ Enumeration_Typesを参照してください。
サポートされているAdaの名前を次に示します。
名前の種類 | デバッガのサポート |
---|---|
レキシカル要素 | Adaの識別子の構文規則を完全にサポートしている。
識別子ではなく演算子のシンボル(たとえば,+や*)である関数の名前には, 接頭辞%NAMEを付ける必要がある。また,演算子のシンボルは二重引用符で囲まなければならない。 数値リテラル,文字リテラル,文字列リテラル,予約語についてのAdaの規則を完全にサポートしている。 -2147483648から2147483647までの範囲で,符号付き整数リテラルを受け入れる。 コンテキストとアーキテクチュアに応じて浮動小数点数型を,F浮動小数点数型,D 浮動小数点数型,G浮動小数点数型,H浮動小数点数型, S浮動小数点型,またはT浮動小数点数型と解釈する。 |
添字付き要素 | 完全にサポートしている。 |
断面 | 断面全体,または断面の添字付き要素を確認および評価することができる。
断面の添字付き要素の格納だけができる。断面全体の格納はできない。 |
選択要素 | .allのallキーワードの使用も含めて,完全にサポートしている。 |
リテラル | nullキーワードも含めて,完全にサポートしている。 |
ブール・シンボル | 完全にサポートしている(TRUE ,FALSE)。 |
集合体 | EXAMINEコマンドでレコード全体および配列のオブジェクトを確認することができる。 配列またはレコードの構成要素に値を格納することができる。 文字列の値を格納する場合を除き,DEPOSITコマンドで集合体を使用することはできない。 |
サポートされている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。 |
次の宣言について考えます。
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
次の宣言について考えます。
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
次の節では,Adaの演算子と言語式に関するデバッガのサポートについて説明します。
サポートされているAdaの言語式の演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号(一致) |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | MOD | モジュロ |
挿入辞 | REM | 剰余 |
挿入辞 | ** | べき乗(VAX固有) |
接頭辞 | ABS | 絶対値 |
挿入辞 | & | 連結(文字列型のみ) |
挿入辞 | = | 等値(スカラ型および文字列型のみ) |
挿入辞 | /= | 不等(スカラ型および文字列型のみ) |
挿入辞 | > | 大なり(スカラ型および文字列型のみ) |
挿入辞 | >= | 以上(スカラ型および文字列型のみ) |
挿入辞 | < | 小なり(スカラ型および文字列型のみ) |
挿入辞 | <= | 以下(スカラ型および文字列型のみ) |
接頭辞 | NOT | 論理否定 |
挿入辞 | AND | 論理積(ビット配列以外の場合) |
挿入辞 | OR | 論理和(ビット配列以外の場合) |
挿入辞 | XOR | 排他的論理和(ビット配列以外の場合) |
次に示す項目はサポートされていません。
サポートされているAdaの式を次に示します。
式の種類 | デバッガのサポート |
---|---|
型変換 | Adaで指定された明示的な
型変換はどれもサポートしていない。しかし,デバッガが式を評価するときは数値型の間で特定の型変換が
暗黙に行われる。
精度の異なる型が式に含まれている場合,デバッガは式を評価する前に, 精度の低い型を精度の高い型に変換する。
|
部分型 | 完全にサポートしている。 ただし,デバッガは,部分型および範囲の制約がある型を"部分範囲"型として示す。 |
型明示式 | オーバロードされた列挙リテラル( 識別子は同じだが,異なる列挙型に含まれるリテラル) を解決しなければならないので,サポートしている。それ以外の目的では型明示式をサポートしていない。 |
アロケータ | アロケータを使用する演算は何もサポートしていない。 |
ユニバーサル式 | サポートしていない。 |
サポートされている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) 。それ以外の列挙型に対応するオペレーティング・システムのデータ型はない。 |
配列 | (なし) |
レコード | (なし) |
アクセス(ポインタ) | (なし) |
タスク | (なし) |
ユーザのシステムのプログラム・ライブラリADA$PREDEFINEDにある,Ada の定義済みユニットは/NODEBUG修飾子を使用してコンパイルされています。 定義済みユニットの中で宣言されている名前をデバッガで参照するにはその前に, 定義済みユニットのソース・ファイルをACS EXTRACT SOURCE コマンドでコピーしなければなりません。そして,コピーしたファイルを/DEBUG 修飾子を使用してコンパイルし,適切なライブラリにしてから,/DEBUG 修飾子を付けてプログラムを再リンクする必要があります。
Adaの各コンパイル・コマンドで/NODEBUG修飾子を使用した場合,デバッグのためにモジュールに含まれるのはグローバル・ シンボル・レコードだけです。 このときのグローバル・シンボルは,プログラムが他言語のモジュールへエクスポートする名前です。 プログラムは次のAdaのエクスポート・ プラグマを使用して名前をエクスポートします。
ACS LINKコマンドで/DEBUG修飾子を使用すると,リンカは,実行可能なイメージ内の特定のユニットのクロージャにデバッグの情報をすべて含めます。
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 コマンドを使用します。
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コマンドで使用中のソース・ファイル検索リストが取り消され, 省略時の検索モードに戻ります。
AdaプログラムでGOコマンドやSTEPコマンドを使用する場合は,次の点に注意してください。
パッケージ確立フェーズをモニタする方法については,オンライン・ ヘルプのDebugging_Ada_Library_Packagesを参照してください。
Adaのメイン・プログラム,またはAdaのコードを呼び出すAda以外のメイン・ プログラムが実行されるときに,Adaの実行時ライブラリに対して初期化コードが実行され, プログラムが依存するすべてのライブラリ単位に対して確立コードが実行されます。 確立コードは,メイン・プログラムの実行前にライブラリ単位を適切な順序で確立します。 ライブラリの仕様と本体, およびそれらのサブユニットもこのプロセスによって確立されます。
ライブラリ・パッケージを確立すると,次の処理が行われます。
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 項を参照してください。
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>
Adaプログラムの場合,デバッガは次の3種類の例外を認識します。
次の各サブトピックでは,これらの例外をモニタする方法について説明します。
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の例外名は表示されません。
例外が発生すると,デバッガは次の組み込みシンボルを設定します。この組み込みシンボルを使用すると, 特定の例外が発生したときだけ検出されるように, 例外のブレークポイントやトレースポイントを指定することができます。
%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,または?)。 |
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
データを検査または操作するときは,次の関連事項に注意してください。
型明示式の使用も含め,デバッガではほとんどの場合,プログラムのソース・ コードに指定するのとまったく同じように,変数や式をデバッガ・コマンドの中で指定することができます。 次の各サブトピックでは,レコードとアクセス型についてのデバッガのサポートに関する補足事項について説明します。
デバッガによるレコードのサポートについては次の点に注意してください。
DBG> EXAMINE REC1.COMP3 %DEBUG-I-BADDISCVAL, incorrect value of 1 in discriminant field STATUS MAIN.REC1.COMP3: 438
デバッガによるアクセス型のサポートについては,次の点に注意してください。
DBG> EXAMINE A.ALL EXAMPLE.A.ALL NAME(1..10): "John Doe " AGE : 6 NEXT: 1462808
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 変数を操作することはできます。
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は, その文またはブロックが始まる行番号を示します。
Adaプログラムでパス名(Adaの展開された名前を含む)を指定しなかった場合, デバッガは次のように実行時シンボル・テーブルを検索します。
%DEBUG-E-NOUNIQUE, symbol 'X' is not unique
ユーザまたはデバッガがAdaのモジュールを設定するときに,省略時設定では, デバッガが"関連"モジュールもすべて設定します。この関連モジュールとは, 設定されるモジュールの中でシンボルが可視でなければならないモジュールを指します。 これらの関連モジュールは,with句またはサブユニット関係のどちらかで設定されるモジュールに関連づけられます。
関連モジュールの設定は次のように行われます。設定されるモジュールがM1 である場合,次の各モジュールが関連しているとみなされ,設定されます。
P1の仕様がwith句でP2パッケージを指定している場合は,P2の仕様も設定されます。 同様に,P2の仕様がwith句でP3パッケージを指定している場合はP3 の仕様も設定され,同じように設定されていきます。このようなライブラリ・ パッケージはすべて,それらの仕様が設定されるので, 他のパッケージで宣言されているデータ構成要素(たとえばレコードの構成要素) をアクセスすることができます。
多くのモジュールが設定されることでデバッガの性能に問題が生じるときは,SET MODE NODYNAMIC コマンドを使用してください。このコマンドで, 動的モジュールの設定が禁止されるとともに,関連モジュールの設定が禁止されます。 そのあとでSET MODULEコマンドを使用して,個々のモジュールを明示的に設定する必要があります。
省略時のSET MODULEコマンドでは,コマンドで指定したモジュールと同時に関連モジュールが設定されます。
SET MODULE/NORELATEDコマンドでは,明示的に指定したモジュールだけが設定されます。 しかし,SET MODULE/NORELATEDを使用した場合,別のユニットで宣言されていて実行の時点で可視であるはずのシンボルが可視でない場合があります。 つまり,同じそのシンボルを再宣言することによって隠されるはずのシンボルが可視になっていることがあります。
CANCEL MODULE/NORELATEDコマンドでRSTから削除されるのは,明示的に指定したモジュールだけです。 省略時設定のCANCEL MODULE/NORELATEDコマンドは,Ada の有効範囲規則と可視性の規則の目的に合致した方法で関連モジュールを削除します。 正確な効果はモジュールの関連性に依存します。
サブユニットの関連と直接関連の違いは,ライブラリ・パッケージの関連の違いと同様です。
デバッガは,パッケージ本体のためのモジュールを自動的には設定しません。
パッケージ本体をデバッグするには,または,対応するパッケージ仕様の中で宣言されているサブプログラムをデバッグするには, ユーザが自分でライブラリ・ パッケージ本体のためのモジュールを設定しなければならない場合があります。
オーバロードされた名前やシンボルが現れると,次のようなメッセージが表示されます。
%DEBUG-E-NOTUNQOVR, symbol 'ADD' is overloaded use SHOW SYMBOL to find the unique symbol names
オーバロードされたシンボルが列挙リテラルである場合は,オーバロードを解決するために, 型明示式を使用することができます。
オーバロードされたシンボルがサブプログラムまたはタスクのaccept文を表す場合は, コンパイラがデバッガ用に作成する固有の名前を使用することができます。 名前は,あとでパッケージ本体でオーバロードされることがあるので, コンパイラは必ず各サブプログラム固有の名前をライブラリ・ パッケージの仕様に作成します。タスクのaccept文やサブプログラムが他の場所で宣言されているときは, タスクのaccept文やサブプログラムが実際にオーバロードされる場合にだけ, 固有の名前が作成されます。
オーバロードされたタスクのaccept文とサブプログラムの名前は,2つのアンダスコアとそれに続く整数からなる接尾辞によって区別されます。 それぞれのシンボルは, この整数で別々のものとして示されます。名前がオーバロードされているサブプログラムを別々のものとして指定するには, 固有の名前を表記してデバッガ・コマンドを使用する必要があります。しかし, あいまいさがない場合は,固有の名前が作成されてもその名前を使用する必要はありません。
Adaプログラムで確実にCALLコマンドを使用できるのは,エクスポートされているサブプログラムでこのコマンドを使用する場合だけです。 エクスポートされるサブプログラムは, ライブラリのサブプログラムであるか, またはライブラリ・パッケージの最も外側にある宣言部で宣言されている必要があります。
CALLコマンドは,サブプログラムをエクスポートできるかどうかはチェックしません。 また,ユーザが指定するパラメータの受け渡し方式もチェックしません。 パラメータの値を変更するためにCALLコマンドを使用することはできませんので注意してください。
Adaの実行時ライブラリを実行中にCALLコマンドを入力するとデッドロックを起こすことがあります。 実行時ライブラリ・ルーチンは,タスキング環境で実行時ライブラリ・ ルーチンを作動可能にする内部ロックを取得および解放します。 デッドロックを生じる可能性があるのは,CALLコマンドから呼び出されたサブプログラムが, 実行中の実行時ライブラリ・ルーチンによってロックされている資源を要求するときです。 非タスキング・プログラムにおいてこういった状況が生じないようにするには,Ada の文を実行する直前, または実行した直後にCALLコマンドを入力してください。 しかし,この方法では,タスキング・プログラムでのデッドロックの発生を完全に防ぐことはできません。 呼び出しの時点で他の何らかのタスクが実行時ライブラリ・ ルーチンを実行している可能性があるからです。タスキング・ プログラムでCALLコマンドを使用しなければならない場合は,呼び出されるサブプログラムがタスキング操作や入出力操作を何も実行しないようにすると, デッドロックを避けることができます。
次の各サブトピックでは,デバッガによるBASICのサポートについて説明します。
言語式でサポートされているBASICの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算,文字列の連結 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | ** | べき乗 |
挿入辞 | ^ | べき乗 |
挿入辞 | = | 等値 |
挿入辞 | <> | 不等 |
挿入辞 | >< | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | => | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
挿入辞 | =< | 以下 |
接頭辞 | NOT | ビット単位のNOT |
挿入辞 | AND | ビット単位のAND |
挿入辞 | OR | ビット単位のOR |
挿入辞 | XOR | ビット単位の排他的論理和 |
挿入辞 | IMP | ビット単位の含意 |
挿入辞 | EQV | ビット単位の同値 |
サポートされている,BASICの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
:: | レコードの構成要素の選択 |
サポートされている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 | (なし) |
配列 | (なし) |
BASIC環境でプログラムに変更を加えてから,そのプログラムを保存したり置換したりしないまま,/DEBUG 修飾子を使用してコンパイルしようとすると,"Unsaved changes, no source line debugging available" ( 変更を保存していないのでデバッグにソース行を使用できません) というBASIC のエラーが通知されます。この問題を防ぐには,プログラムを保存または置換してから,/DEBUG 修飾子を使用してプログラムを再コンパイルしてください。
[radix]"numeric-string"[type]という形式("12.34"GFLOAT など)や,n%という形式(整数25の25%など) のBASICの定数は,デバッガの式ではサポートされていません。
BASIC言語でオーバフローする式であっても,デバッガが評価する場合に必ずオーバフローするとはかぎりません。BASIC の規則でオーバフローになる場合でも, デバッガは数値的に正しい結果を計算しようとします。この違いは,10 進数を計算するときに特に影響があります。
デバッグ・セッションではソース・コード・ディスプレイに表示される連続した行番号を参照しますが, この行番号を生成するのはコンパイラです。BASIC プログラムに他のファイルからコードを取り込んだり,付加したりする場合, 取り込まれたコードの行にもコンパイラによって順番に行番号が付けられます。
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 行目で実行を一時停止してから,コード内の命令を直接ステップ実行することができます。
単一のBASICプログラム内の変数名とラベル名は,すべて固有のものでなければなりません。 固有でない場合,デバッガはシンボルのあいまいさを解消できません。
BASICでウォッチポイントを設定できるのは,COMMON文またはMAP文で宣言されている変数( 静的変数)に対してだけです。DECLARE文で明示的に宣言されている変数にウォッチポイントを設定することはできません。
次の各サブトピックでは,デバッガによるBLISSのサポートについて説明します。
言語式でサポートされている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 | ビット単位の同値 |
サポートされている,BLISSの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
[fldname] | フィールドの選択 |
<p,s,e> | ビット・フィールドの選択 |
サポートされている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のサポートについて説明します。
言語式でサポートされているCの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | * | 間接参照 |
接頭辞 | & | アドレス |
接頭辞 | sizeof | サイズ |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | % | 剰余 |
挿入辞 | << | 左シフト |
挿入辞 | >> | 右シフト |
挿入辞 | == | 等値 |
挿入辞 | != | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
接頭辞 | ~ (チルド) | ビット単位のNOT |
挿入辞 | & | ビット単位のAND |
挿入辞 | | | ビット単位のOR |
挿入辞 | ^ | ビット単位の排他的OR |
接頭辞 | ! | 論理否定 |
挿入辞 | && | 論理積 |
挿入辞 | || | 論理和 |
Cでは感嘆符(!)は演算子なので,感嘆符をコメント区切り文字として使用することはできません。 言語がCに設定されている場合は,感嘆符の代わりに/* がコメント区切り文字として受け入れられます。現在の行の終端までがコメントになります。 対応する*/は不要であり,認識もされません。 しかし,デバッガのログ・ファイルをデバッガの入力として使用できるようにするため,1 行の中で空白以外の最初の文字が感嘆符(!) である場合は, デバッガはその感嘆符をコメント区切り文字として認識します。
Cの言語式とデバッガのアドレス式の両方で,デバッガは接頭辞のアスタリスク(*) を間接参照演算子として受け入れます。言語がCに設定されているときのアドレス式では, 接頭辞"*"は接頭辞"."または"@"と同義です。
デバッガは,Cまたは他のどの言語でも代入演算子は何もサポートしません。 これは,デバッグされるプログラムに予期しない変更が加えられるのを防ぐためです。 したがって,=,+=,-=,++, -- などの演算子は認識されません。 メモリ記憶位置の内容を変更するには,DEPOSITコマンドを使用して明示的に変更しなければなりません。
サポートされている,Cの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
.(ピリオド) | 構造体構成要素の選択 |
-> | ポインタの間接参照 |
サポートされている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言語では,シンボル名の大文字と小文字は区別され,それぞれ別個の文字として処理されます。
static,globaldef,globalref,externの各記憶クラスの変数は,静的に割り当てられます。
記憶クラスがautoまたはregisterの変数は,非静的に(スタックまたはレジスタに) 割り当てられます。このような非静的変数は,それらを定義しているルーチンが呼び出しスタック上でアクティブになっているときだけアクセス可能です。
デバッガ・コマンドでは,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の配列を他のほとんどの言語と同様に処理します。したがって, 配列の構文を使用して(たとえば,EXAMINE arr[3]で),配列の集合体全体, 配列断面,または配列の個々の要素をそれぞれチェックすることができます。 また,配列への格納は一度に1要素ずつです。
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"
構造体をチェックするときは,その全体を検査したり,メンバ単位で検査することができます。 また,構造体へのデータの格納は一度に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
の両方を検索するのに使用されます。
Alphaシステムでは,OpenVMSデバッガはバージョン5.5以降(Alphaのみ)のコンパイラでコンパイルされたC++ モジュールデバッグする機能がサポートされています。
デバッガは,C++の次の機能をサポートします。
この節のデバッグの例は,例 C-1に含まれるテスト・ プログラムを参照しており,また,例 C-2 に含まれるデバッグ・セッションの一部を取り出したものになっています。 次節以降で,C++のデバッガ・サポートについて説明します( コンパイラ・バージョン5.5 (Alphaのみ))。
言語式でサポートされるC++演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | * | 間接参照 |
接頭辞 | & | アドレス |
接頭辞 | sizeof | オブジェクトのサイズ |
接頭辞 | - | 単項マイナス(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | % | 剰余 |
挿入辞 | << | 左シフト |
挿入辞 | >> | 右シフト |
挿入辞 | == | 等しい |
挿入辞 | != | 等しくない |
挿入辞 | > | より大きい |
挿入辞 | >= | 以上 |
挿入辞 | < | より小さい |
挿入辞 | <= | 以下 |
接頭辞 | ~ (チルド) | ビットごとのNOT |
挿入辞 | & | ビットごとのAND |
挿入辞 | | | ビットごとのOR |
挿入辞 | ^ | ビットごとの排他的OR |
接頭辞 | ! | 論理NOT |
挿入辞 | && | 論理AND |
挿入辞 | || | 論理OR |
感嘆符(!)は演算子なので,C++プログラムでコメント区切り文字として使用できません。 ただし,デバッガのログ・ファイルをデバッガの入力として使用できるように, 行内のスペースでない最初の文字が!である場合は, デバッガは!をコメント区切り文字として解釈します。デバッガはC++ 言語モードでは,/*または//をコメントの先頭として解釈し,その行の最後までをコメントとみなします。
デバッガは,C++言語式とデバッガ・アドレス式の両方で,アスタリスク(*)
接頭辞を間接参照演算子として扱います。デバッガがC++言語モードの場合,
アドレス式では,*
接頭辞はピリオド(.)接頭辞またはサイン(@)
接頭辞と同じです。
デバッグの対象のプログラムが意図に反して修正されることがないように, デバッガはC++,および他の言語の代入演算子をサポートしません。 このため,=,+=,-=,++, -- はデバッガコマンドによって解釈されません。 メモリの内容を変更するには,デバッガのDEPOSITコマンドを使用します。
C++の言語式とアドレス式でサポートされる構造体を次に示します。
シンボル | 構造体 |
---|---|
[ ] | 添字付け |
. (ピリオド) | 構造体の構成要素の選択 |
-> | ポインタ間接参照 |
:: | スコープ解決 |
サポートされる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++では,シンボル名の大文字小文字が区別されます。つまり,大文字と小文字は異なる文字として扱われます。
クラス宣言に関する静的な情報を表示するには,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++のシンボル検索規則を使用します。 現在のオブジェクトの値を表示するには, 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項を参照)。
オブジェクトのウォッチポイントを設定することができます。静的でないすべてのデータ・ メンバはウォッチされます(基底クラス中のデータ・メンバを含みます) 。オブジェクト上にウォッチポイントを設定すると,静的なデータ・ メンバはウォッチされません。ただし,静的なデータ・メンバについて, 明示的にウォッチポイントを設定することは可能です。例を示します。
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++シンボル検索ルールを使用します。 例を示します。
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>
デバッガは,コンストラクタ,デストラクタ,および演算子のデバッグをサポートします。 例を示します。
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++プログラムをデバッグする場合は,次の制限事項が適用されます。
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 に含まれているプログラムのデバッグ・セッションの例です。
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
次の各節では,バージョン5.5よりも前のバージョンのC++コンパイラによってコンパイルされたC++ プログラムのデバッガによるサポートについて説明します。
バージョン5.5以降のバージョン(Alphaのみ)でコンパイルされたC++プログラムのデバッガによるサポートについては, 第C.6 節を参照してください。
DEC C++で関数やデータ・メンバのような特定のエンティティを参照するには, デバッガ・コマンドで%nameレキシカル関数の使用が要求されます。 この関数を使用するときは,必ずコマンドと参照の間に置きます。次の各項で, この関数が必要な場合の正しい使用法の例を示します。
言語式でサポートされているC++の演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | * | 間接参照 |
接頭辞 | & | アドレス |
接頭辞 | sizeof | サイズ |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | % | 剰余 |
挿入辞 | << | 左シフト |
挿入辞 | >> | 右シフト |
挿入辞 | == | 等値 |
挿入辞 | != | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
接頭辞 | ~ (チルド) | ビット単位のNOT |
挿入辞 | & | ビット単位のAND |
挿入辞 | | | ビット単位のOR |
挿入辞 | ^ | ビット単位の排他的OR |
接頭辞 | ! | 論理否定 |
挿入辞 | && | 論理積 |
挿入辞 | || | 論理和 |
感嘆符(!)は演算子なので,C++プログラムではコメントの区切り文字としては使用できません。 ただし,デバッガのログ・ファイルをデバッガ入力として使用することを許可するために,! がスペースを除けば行の先頭にある場合にかぎって, デバッガは!をコメントの区切り文字として認識します。C++ 言語モードでは,デバッガは/*をコメントの区切り文字として受け入れます。 コメントは現在の行の最後まで続きます。対応する*/は不要ですし, 認識もされません。
デバッガは,アスタリスク(*)接頭辞をC++の言語式およびデバッガのアドレス式の両方で間接参照演算子として受け入れます。
言語がC++に設定されているときは,
アドレス式では,*
接頭辞はピリオド(.)
接頭辞や@
接頭辞と同義です。
デバッグ中のプログラムの誤修正を防ぐために,デバッガはC++およびその他のどの言語でも代入演算子を一切サポートしません。
したがって,=
,+=,-=,++, -- のような演算子は認識しません。記憶位置の内容を変更するには,
明示的なdeposit
コマンドを使用しなければなりません。
サポートされている,C++の言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
.(ピリオド) | 構造体構成要素の選択 |
-> | ポインタの間接参照 |
サポートされている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++言語では,シンボル名の大文字と小文字は区別され,それぞれ別個の文字として処理されます。
次の各項では,デバッガを使用するときのクラス・メンバの名前の作成方法を説明するために, 修飾子がついたクラス名という用語を使用します。 あるクラスが別のクラスで定義されていなければ,修飾子がついたクラス名はそのクラス自身の名前にすぎません。 しかし,もしこのクラスが別のクラス内でネストされていれば, そのネストのすぐ外のクラスの名前を前に付けなければなりません。 このとき,区切り文字として一対のコロン(::) を使用します。外側のクラスもネストされている場合は, その名前も前に付けなければなりません。
適切な修飾子がついたクラス名の例を次に示します。
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++のデータに対するデバッガの使用法を説明します。
本項では,静的とは宣言されていないデータ・メンバを参照する方法を説明します。
C++のクラスまたはstructかunionで直接定義されている非静的データ・メンバを参照するには, その名前を,C言語のstructメンバやunionメンバの場合と同じように使用します。 非静的データ・メンバ参照の正しい使用法を次の例で示します。
DBG> examine x.m, p->m
現在のところ,デバッガのサポートでは,各種の基底クラスから継承される非静的データ・ メンバを区別するのに,メンバに至る継承パス,さらにメンバが宣言されているクラスに至る継承パス上の 重要な基底クラス名をメンバ名の前に付けます。 オブジェクトからメンバに至るパスの上の基底クラスが多重継承を使用して受け継がれたものなら, 当基底クラスは重要です。 したがって,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コマンドですべてのメンバを参照しています。継承されたメンバが重要なクラスに属するかどうかに関係なく, そのメンバ自身のクラスはメンバ名の前に出現することに注意してください。
デバッガでは,仮想基底クラスのデータ・メンバへのシンボリック・アクセスは現在サポートされていません。 ただし,例外がひとつあります。それは,__bptr という名前のポインタ・メンバがそのようなオブジェクトの中にあるということです。
静的データ・メンバを参照するには,%nameで,その修飾子がついたクラス名,2 つのコロン(::),およびメンバ名を引用符で囲ます。
静的データ・メンバ参照の正しい使用法を次の例で示します。
DBG> examine %name 'C::s' DBG> examine %name 'FOO::BAR::BAZ::sdm'
参照で宣言されたオブジェクトの値にアクセスするには,そのオブジェクトの名前を使用します。
デバッガは,参照型で宣言されたデータ・メンバをポインタ変数であるかのように扱います。
したがって,そのメンバ名には間接参照演算子の
*
または->
を使用しなければなりません。
次に例を示します。
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
メンバを指すポインタであるオブジェクトは,64ビットの整数で表されます。
オブジェクトやメンバの値を型でチェックし,表示するには,EXAMINE /TYPEというコマンドを使用します。同様に,DEPOSIT/TYPEというコマンドを使用することにより, 指定した型に格納する式の値を修正できます。/TYPE 修飾子を使用する場合,これらのコマンドの構文は次のとおりです。
deposit/type=(name) examine/type=(name)
nameで示された型は,プログラムで宣言された変数の名前またはデータ型の名前でなければなりません。
/type
修飾子は,
特に2つ以上の型で宣言されたC++のオブジェクトを参照するときに役立ちます。
本項では,各種の関数や関数の引数を参照する方法を説明します。
コードの中で関数のシンボリック名を見つけるには,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
メンバ関数を参照するには,%nameで,その修飾子がついているクラス名,2
つのコロン(::),およびメンバ関数の名前を引用符で囲みます。
メンバ関数がオーバロードされている場合は,接尾辞__
integer-numberを付けます。
メンバ関数参照の正しい使用法を次の例で示します。
DBG> set break %name 'MYSTRING::length' DBG> set break %name 'MYCOMPLEX::format__1', %name 'MYCOMPLEX::format__2'
コンストラクタを参照するには,その名前を使用します。コンストラクタがオーバロードされている場合は,
接尾辞__
integer-
numberを付けます。
コンストラクタ参照の正しい方法を次の例で示します。
DBG> set break FOO DBG> set break MYSTRING__1
デストラクタを参照するには,%name で,その名前と共にチルド(
~
)を引用符で囲みます。
デコンストラクタ参照の正しい方法を次の例で示します。
DBG> set break %name '~FOO'
クラス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)&'
次の演算子はユーザ定義関数によりオーバロードされることがあります。
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && | ++ -- ->* , -> [] () 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'
デバッガによる参照では,this
,*this
,および
this->
を次のように使用します。
this
と名付けられたポインタ・
パラメータが利用できます。例を次に示します。
DBG> examine this
*this
を使用します。例を次に示します。
DBG> examine *this
m
を参照するためにこのパラメータを使用します。
例を次に示します。
DBG> examine this->m
次の各サブトピックでは,デバッガによるCOBOLのサポートについて説明します。
言語式でサポートされているCOBOLの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | ** | べき乗(VAX固有) |
挿入辞 | = | 等値 |
挿入辞 | NOT = | 不等 |
挿入辞 | > | 大なり |
挿入辞 | NOT < | 以上 |
挿入辞 | < | 小なり |
挿入辞 | NOT > | 以下 |
挿入辞 | NOT | 論理否定 |
挿入辞 | AND | 論理積 |
挿入辞 | OR | 論理和 |
サポートされているCOBOLの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
OF | レコードの構成要素の選択 |
IN | レコードの構成要素の選択 |
サポートされている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 浮動小数点数のどちらかで表現されます。
デバッガは,COPY文またはCOPY REPLACING文でプログラムに取り込まれたソース・ テキストを表示することができます。しかし,COPY REPLACING文またはREPLACE 文を使用した場合は,COPY REPLACING文またはREPLACE文で作成された修正後のソース・ テキストではなく,元のソース・テキストが表示されます。
デバッガは,REPORT節のコードに対応する元のソース行を表示することはできません。REPORT に対応するDATA SECTIONのソース行を見ることはできますが, レポートを作成するためのコンパイル済みコードに対応するソース行は表示されません。
OpenVMS Alphaシステムでは,大きいテーブル(配列)が初期化されるときに,STEP コマンドを使用してCOBOLプログラムでINITIALIZE文を実行する場合, デバッガは非常に長い時間と多くのリソースを使用することがあります。
この問題を回避するには,INITIALIZE文をステップ実行するのではなく, INITIALIZE文の後の最初の実行可能な行にブレークポイントを設定します。
次の各サブトピックでは,デバッガによるDIBOLのサポートについて説明します。
言語式でサポートされているDIBOLの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | # | 丸め |
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | // | 商が小数となる除算 |
挿入辞 | .EQ. | 等値 |
挿入辞 | .NE. | 不等 |
挿入辞 | .GT. | 大なり |
挿入辞 | .GE. | 以上 |
挿入辞 | .LT. | 小なり |
挿入辞 | .LE. | 以下 |
挿入辞 | .NOT. | 論理否定 |
挿入辞 | .AND. | 論理積 |
挿入辞 | .OR. | 論理和 |
挿入辞 | .XOR. | 排他的論理和 |
サポートされているDIBOLの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 部分文字列 |
[ ] | 添字指定 |
.(ピリオド) | レコードの構成要素の選択 |
サポートされているDIBOLのデータ型を次に示します。
DIBOLのデータ型 | VMSのデータ型名 |
---|---|
I1 | バイト整数(B) |
I2 | ワード整数(W) |
I4 | ロングワード整数(L) |
Pn | パック10進数文字列(P) |
Pn.m | パック10進数文字列(P) |
Dn | 数値文字列,ゾーン記号(NZ) |
Dn.m | 数値文字列,ゾーン記号(NZ) |
An | ASCIIテキスト(T) |
配列 | (なし) |
レコード | (なし) |
次の各サブトピックでは,デバッガによるFortranのサポートについて説明します。
言語式でサポートされているFortranの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | ** | べき乗(VAX固有) |
挿入辞 | // | 連結 |
挿入辞 | .EQ. | 等値 |
挿入辞 | == | 等値 |
挿入辞 | .NE. | 不等 |
挿入辞 | /= | 不等 |
挿入辞 | .GT. | 大なり |
挿入辞 | > | 大なり |
挿入辞 | .GE. | 以上 |
挿入辞 | >= | 大なりまたは等値 |
挿入辞 | .LT. | 小なり |
挿入辞 | < | 小なり |
挿入辞 | .LE. | 以下 |
挿入辞 | <= | 小なりまたは等値 |
接頭辞 | .NOT. | 論理否定 |
挿入辞 | .AND. | 論理積 |
挿入辞 | .OR. | 論理和 |
挿入辞 | .XOR. | 排他的論理和 |
挿入辞 | .EQV. | 同値 |
挿入辞 | .NEQV. | 排他的論理和 |
サポートされているFortranの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
.(ピリオド) | レコードの構成要素の選択 |
% (パーセント記号) | レコードの構成要素の選択 |
サポートされているFortranの定義済みのシンボルを次に示します。
シンボル | 説明 |
---|---|
.TRUE. | 論理値TRUE |
.FALSE. | 論理値FALSE |
サポートされている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コマンドによって表示された複素数変数の実数部と虚数部を使用して, 式を評価します。
/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プログラムの場合と同様に,プログラムの実行を開始できます。
次の節では,デバッガによるMACRO-32のサポートについて説明します。
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 | ビット単位の同値 |
サポートされている,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
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) |
MACRO-32で記述したアプリケーションをAlphaシステムに移植する場合は,MACRO-32 コンパイラ(AMACRO)を使用します。MACRO-32でコンパイルされたコードをデバッグするためのデバッグ・ セッションは,アセンブルされたコードの場合に似ていますが, 本項で説明するような重要な相違もあります。 これらのアプリケーションを移植する場合の説明については, 『Porting VAX MACRO Code from OpenVMS VAX to OpenVMS Alpha』を参照してください。
大きな相違は,コードがコンパイルされているという事実です。VAXシステムでは,MACRO-32 の各命令は単一のマシン命令です。Alphaシステムでは,MACRO-32 の各命令は,Alphaの複数のマシン命令へとコンパイルされることがあります。 この相違によって大きな副作用が生じます。それは, コンパイル・コマンドで/NOOPTIMIZEを指定しない場合,コードの再配置と再スケジューリングが行われるということです。 コードのデバッグが終わってから,/NOOPTIMIZE を指定しないでリコンパイルすることにより性能を改善できます。
コンパイルされたコードをデバッグする場合とアセンブルされたコードをデバッグする場合とには, 他にも大きな相違があります。それは, 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は未定義シンボルであるというメッセージを発行します。
コンパイルしたコードでは,引数は,次に述べる項目を組み合せたものとして常駐することができます。
作成されたコードを読み出して引数を検索することをコンパイラがユーザに要求することはありません。 コンパイラには,引数の正しい位置を指し示す$ARG nシンボルがあります。$ARG0は,VAXシステムの@AP+0と同じもの, つまり引数の個数です。たとえば$ARG1は最初の引数,$ARG2は2 番目の引数です。これらの引数は,CALL_ENTRY指示文およびJSB_ENTRY指示文で定義されますが,EXCEPTION_ENTRY 指示文では定義されません。
ユーザのコードで,コンパイラが$ARGnシンボルを作成しない追加の引数が使用されることがあります。.CALL_ENTRY ルーチンに対して定義される$ARG nシンボルの個数は,コンパイラが自動検出またはMAX_ARGS によって検出した最大値または16のどちらか小さい方です。.JSB_ENTRY ルーチンの場合,引数は呼び出す側のスタック・フレーム内のホーム・ ポジションにあり,コンパイラは実際の数を検出できないので,$ARG nシンボルを常に8個作成します。
ほとんどの場合,追加の引数は容易に見つけられますが,そうでない場合もあります。
次の場合は,追加の引数は容易に見つけられます。
たとえば,次のようにすれば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で置き換えた後,例に示すとおりに実行します。
次の場合は,追加の引数を見つけるのは容易ではありません。
これらのケースで追加の引数を見つける方法は,コンパイルされたマシン・ コードを調べ,引数がどこに常駐しているかを判断することです。チェックしたい引数の最大値に対してMAX_ARGS が正しく指定されていれば, どちらの問題も解消します。
Alphaシステムで浮動小数点数データ付きの,コンパイルされたMACRO-32 コードをデバッグする際の重要な情報を次に説明します。
Alphaシステムに浮動小数点演算用レジスタが1セットあるとしても, 浮動小数点演算を含む,コンパイルされたMACRO-32コードでこれらのレジスタを使用することはない。 使用されるのはAlpha整数レジスタだけである。
コンパイルされたMACRO-32コードでの浮動小数点数演算は,コンパイラの外部で動作するエミュレーション・ ルーチンで実行される。したがって, たとえばR7にMACRO-32浮動小数点数演算を実行しても,Alpha の浮動小数点数レジスタ7には影響はない。
次に例を示します。
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
Alphaシステムでパック10進数データ付きの,コンパイルされたMACRO-32 コードをデバッグする際の重要な情報を次に説明します。
以下の各節では,デバッガによるMACRO-64のサポートについて説明します。
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 | ビット単位の同値 |
サポートされている,MACRO-64の言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
<p,s,e> | BLISS同様のビットフィールド |
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) |
以下の各サブトピックでは,デバッガによるPascalのサポートについて説明します。
言語式でサポートされているPascalの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算,連結 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 実数の除算 |
挿入辞 | DIV | 整数の除算 |
挿入辞 | MOD | モジュロ |
挿入辞 | REM | 剰余 |
挿入辞 | ** | べき乗(VAX固有) |
挿入辞 | IN | 集合メンバーシップ |
挿入辞 | = | 等値 |
挿入辞 | <> | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
接頭辞 | NOT | 論理否定 |
挿入辞 | AND | 論理積 |
挿入辞 | OR | 論理和 |
+ VAX固有 |
型キャスト演算子(::)は,言語式ではサポートされていません。
サポートされている,Pascalの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
.(ピリオド) | レコードの構成要素の選択 |
^(サーカンフレックス) | ポインタの間接参照 |
サポートされている,Pascalの定義済みのシンボルを次に示します。
シンボル | 意味 |
---|---|
TRUE | 論理値TRUE |
FALSE | 論理値FALSE |
NIL | NILポインタ |
サポートされている,Pascalの組み込み関数を次に示します。
シンボル | 意味 |
---|---|
SUCC | 論理的後続データ |
PRED | 論理的先行データ |
サポートされている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浮動小数点数のどれかで表現されます。
通常は,変数,レコード・フィールド,配列の構成要素のそれぞれに対して, 検査,評価,格納を行うことができますが,次の場合は例外です。プログラムの中で変数が参照されていない場合,Pascal コンパイラは変数を割り当てません。 変数を割り当てていないときにその変数を検査しようとしたり, その変数へ格納しようとするとエラー・メッセージが表示されます。
変数にデータを格納する場合,格納される値が変数よりも大きいときは, デバッガは上位ビットを切り捨てます。格納される値が変数よりも小さいときは, 上位ビットをゼロで埋めます。代入互換性の規則に違反した格納をすると情報メッセージが表示されます。
実行中のブロック内であればどのブロックでも自動変数を調べたり,自動変数へ格納することができます。 しかし,自動変数はスタック領域に割り当てられ, レジスタに格納されるので,変数が初期化されるまで,または変数に値が代入されるまで, 自動変数の値は未定義であるとみなされます。
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 |
次の各サブトピックでは,デバッガによるPL/Iのサポートについて説明します。
言語式でサポートされているPL/Iの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | ** | べき乗 |
挿入辞 | || | 連結 |
挿入辞 | = | 等値 |
挿入辞 | ^= | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | ^< | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
挿入辞 | ^> | 以下 |
接頭辞 | ^ | ビット単位のNOT |
挿入辞 | & | ビット単位のAND |
挿入辞 | | | ビット単位のOR |
サポートされている,PL/Iの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
.(ピリオド) | 構造体の構成要素の選択 |
-> | ポインタの間接参照 |
サポートされている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 | (なし) |
ラベル | (なし) |
ポインタ | (なし) |
配列 | (なし) |
構造体 | (なし) |
次の記憶クラスの変数は静的に割り当てられます。
次の記憶クラスの変数は,スタック上またはレジスタ内に非静的に割り当てられます。
以下の各サブトピックでは,PL/Iのデータ型を使用したEXAMINEコマンドの例を示します。 デバッガのサポートでPL/I固有の事項についても説明しています。
次に,EXAMINEコマンドでのいくつかのPL/Iのデータ型の使用例を示します。
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"
DBG> EXAMINE/HEXADECIMAL P PROG4\SAMPLE.P: 0000B2A4
DBG> EXAMINE X PROG\X: "A"
ALLOCATE X SET (PTR);
この場合,Xの値は次のように調べられます。
DBG> EXAMINE PTR->X PROG6\PTR->X: "A"
デバッガによる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を表示します。
次の各節では,デバッガによるRPG IIのサポートについて説明します。
言語がRPG IIに設定されている場合,言語式では次の演算子がサポートされます。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | = | 等値 |
挿入辞 | NOT = | 不等 |
挿入辞 | > | 大なり |
挿入辞 | NOT < | 以上 |
挿入辞 | < | 小なり |
挿入辞 | NOT > | 以下 |
接頭辞 | NOT | 論理否定 |
挿入辞 | AND | 論理積 |
挿入辞 | OR | 論理和 |
サポートされている,RPG IIの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
サポートされているRPG IIのデータ型を次に示します。
RPG IIのデータ型 | VMSのデータ型名 |
---|---|
ロングワード2進数 | ロングワード整数(L) |
ワード2進数 | ワード整数(W) |
パック10 進数 | パック10進数(P) |
文字 | ASCIIテキスト(T) |
オーバパンチされた10進数 | 右オーバパンチされた記号(NRO) |
配列 | (なし) |
表 | (なし) |
RPG IIプログラムでは,ソースの行番号,論理サイクルのラベル,ユーザ定義のタグ名, サブルーチンのラベルなどを使用してブレークポイントを設定することができます。RPG II プログラムのデバッグは,他のプログラムのデバッグと多少異なります。 次の各サブトピックでは,ブレークポイントやトレースポイントを設定する場所とその方法について説明します。
仕様のどこにブレークポイントまたはトレースポイントを行番号で設定できるかを次に説明します。
RPG IIプログラムのサイクルは,プログラムの行が処理される順番を決定します。 ブレークポイントやトレースポイントを設定するときは,RPG II がユーザ・プログラムに割り当てる行番号を参照することができます。これらの行番号はリスト・ ファイルか,デバッガのソース表示で見ることができます。 仕様の欄1から5にユーザが指定する行番号は使用されません。
コンパイラは,特定の仕様にだけ,論理サイクル内の特定の箇所で行番号を付けます。 したがって,プログラム内のそれらの箇所にブレークポイントやトレースポイントを設定することができます。
SET BREAK line-number.statement-number
たとえば,演算仕様が行番号25から始まっているとします。SET BREAK 25.1というコマンドで,標識をテストすることができます。SET BREAK 25.2というコマンドを使用すると,演算コードを実行する直前にブレークポイントが置かれます。 演算仕様に条件指定標識がない場合は, SET BREAK 25というコマンドを使用すると,演算コードを実行する直前にブレークポイントが置かれます。
文番号を指定できるのは,条件指定標識がある演算仕様だけです。
RPG IIのラベルをブレークポイントやトレースポイントとして設定することができます。 ユーザ定義のタグに加えて,次のRPG IIのラベルが用意されています。 これらのラベルは論理サイクル内の特定の箇所に対応します。 これらのラベルはソース・コードには表示されませんが,デバッガからはアクセス可能です。 これらのラベルは機械語コード・リストに記されています。
RPG IIのラベル | 機能およびブレークポイントの動作 |
---|---|
*DETL | 行の詳細と見出しを出力する直前でブレークする。 |
*GETIN | 1次ファイルまたは2次ファイルから次のレコードを読み込む直前でブレークする。 |
*TOTC | 合計時の算出を実行する直前でブレークする。 |
*TOTL | 合計時の出力を実行する直前でブレークする。 |
*OFL | オーバフローの出力を実行する直前でブレークする。 |
*DETC | 明細時の算出を実行する直前でブレークする。 |
次に例を示します。
DBG> SET BREAK *TOTL
EXAMINEコマンドを使用すると,変数の内容,現在のテーブル項目,配列要素, または入出力バッファを確認することができます。
DBG> EXAMINE ARR3(9) ! ARR3 配列の要素 9 を表示する DBG> EXAMINE ARRY(1:7) ! ARRY 配列の要素 1 〜 7 を表示する
DBG> EXAMINE INPUT$BUF
DBG> EXAMINE/ASCII:6 STRING
DBG> EXAMINE %NAME 'ITEM@'
DBG> EXAMINE *IN56 *IN56: "0"
標識がオフに設定されていると0が表示され,オンに設定されていると1 が表示されます。
この方法で外部標識を確認することはできません。外部標識の値を調べるには, その前に,/NOSYSSHR修飾子を使用してプログラムをリンクする必要があります。 その後,次の例のようにCALLコマンドを使用します。 この例ではU5の値を表示します。
DBG> CALL RPG$EXT_INDS(5) value returned is 0
DEPOSITコマンドを使用するときは,次の点に注意してください。
DBG> DEPOSIT ARR(2) = 150
DBG> DEPOSIT/ASCII PARTS(4) = "P04P05P06" DBG> EXAMINE PARTS(4:6) INV\PARTS (4): 'P04' (5): 'P05' (6): 'P06'
DBG> DEPOSIT *IN56 = "1"
EDITコマンドを使用すると,DECランゲージ・センシティブ・エディタではなく,RPG II のエディタが起動します。
次の各サブトピックでは,デバッガによるSCANのサポートについて説明します。
言語式でサポートされているSCANの演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | & | 連結 |
挿入辞 | = | 等値 |
挿入辞 | <> | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
接頭辞 | NOT | 補数 |
挿入辞 | AND | 論理積 |
挿入辞 | OR | 集合和 |
挿入辞 | XOR | 排他的論理和 |
サポートされている,SCANの言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
( ) | 添字指定 |
.(ピリオド) | レコードの構成要素の選択 |
-> | ポインタの間接参照 |
サポートされている,SCANの定義済みのシンボルを次に示します。
シンボル | 意味 |
---|---|
TRUE | 論理値TRUE |
FALSE | 論理値FALSE |
NIL | NILポインタ |
サポートされている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 | (なし) |
次のデータ型はサポートしていません。
デバッガ・コマンドでは,次のSCANの構造名を使用することができます。
SCANのブレークポイント,トレースポイント,ウォッチポイントについては, 次の点に注意してください。
行番号の他に,プロシージャ,トリガ・マクロ,構文マクロ,ラベルにもブレークポイントやトレースポイントを設定することができます。 次に例を示します。
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修飾子といっしょに使用してください。
たとえば,次のコマンドで設定したブレークポイントは,TOKENを作成すると必ず検出されます。
DBG> SET BREAK/EVENT=TOKEN
メイン・プログラムがSCANで記述されている場合,デバッガは自動的にSCAN のイベントを認識できるようにします。別の言語で記述されたプログラムをデバッグしていて, そのプログラムがSCANルーチンを呼び出す場合は, 次の手順に従ってSCANの環境を設定してください。
SCANのウォッチポイントについては,次の点に注意してください。
次の各サブトピックでは,次のSCAN変数の検査方法と,これらの変数への格納の方法について説明します。
FIXED STRING変数に格納する場合,その変数の宣言で設定したサイズよりも長い文字列を格納すると, 切り捨てが行われます。
VARYING STRING変数に格納する場合,その変数の宣言で設定した最大長よりも長いサイズの文字列を格納すると, 切り捨てが行われます。
DYNAMIC STRING変数に格納する場合,その変数の現在のサイズよりも長い文字列を格納すると, 切り捨てが行われます。
FIXED STRING変数およびDYNAMIC STRING変数では,変数の現在のサイズよりも短い文字列を格納すると, その文字列は左寄せされ,埋められなかった部分の右側はブランク文字で埋められます。
VARYING STRING変数の場合,変数を格納している現在の領域は,格納される変数に合わせてサイズが調節されます。
省略時設定でFILL変数の値を調べると,指定した変数の内容が文字列として表示されるので, それを見てもほとんど意味がないことがあります。フィルの特性または型が分かっているときは, 適切な修飾子をコマンドに使用することによって, 意味のある表示を行わせることができます。次の例は, フィルxが単精度浮動小数点数であると分かっているときのコマンドです。
DBG> EXAMINE/FLOAT x
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 '
次の構文を使用すると,木構造のノードの内容を調べることができます。
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->
EXAMINEコマンドを使用するときにRECORDを名前で指定すると,RECORDのすべての構成要素が表示されます。RECORD の構成要素を個々に調べるには, 各構成要素をフル・ネームで指定します。
一般的な書式は次のとおりです。
EXAMINE recordname
EXAMINE recordname.componentname.componentname . . .
OVERLAYの確認方法もこれと同様です。OVERLAYの場合も構成要素がすべて表示されます。 このように,FILL(4),INTEGER,VARYING STRING(2)がそれぞれ4 バイトの領域であれば,4つのバイトは3種類の異なった形式で表示されます。
次の各サブトピックでは,UNKNOWNである言語の,デバッガのサポートについて説明します。
UNKNOWNの言語について,言語式でサポートされている演算子を次に示します。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | ** | べき乗(VAX固有) |
挿入辞 | & | 連結 |
挿入辞 | // | 連結 |
挿入辞 | = | 等値 |
挿入辞 | <> | 不等 |
挿入辞 | /= | 不等 |
挿入辞 | > | 大なり |
挿入辞 | >= | 以上 |
挿入辞 | < | 小なり |
挿入辞 | <= | 以下 |
挿入辞 | EQL | 等値 |
挿入辞 | NEQ | 不等 |
挿入辞 | GTR | 大なり |
挿入辞 | GEQ | 以上 |
挿入辞 | LSS | 小なり |
挿入辞 | LEQ | 以下 |
接頭辞 | NOT | 論理否定 |
挿入辞 | AND | 論理積 |
挿入辞 | OR | 論理和 |
挿入辞 | XOR | 排他的論理和 |
挿入辞 | EQV | 同値 |
UNKNOWNの言語について,サポートされている言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
( ) | 添字指定 |
.(ピリオド) | レコードの構成要素の選択 |
^(サーカンフレックス) | ポインタの間接参照 |
UNKNOWNの言語について,サポートされている定義済みのシンボルを次に示します。
シンボル | 意味 |
---|---|
TRUE | 論理値TRUE |
FALSE | 論理値FALSE |
NIL | NILポインタ |
言語がUNKNOWNに設定されている場合,デバッガは,他の言語で受け入れられるデータ型をすべて認識しますが, ピクチャ型やファイル型など,限られたいくつかの言語固有のデータ型は認識しません。UNKNOWN の言語式では,OpenVMS 呼び出し標準規則のスカラ・データ型のほとんどを使用することができます。
[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]