COBOL のコンパイラーの各バージョンは、COBOL プログラムの開発に利用可能な機能強化を提供します。これらの機能強化により、さまざまなレベルのデバッグ機能が得られます。ここでは以下のトピックで、これらの機能強化を使用して COBOL プログラムをデバッグする方法を説明します。
COBOL プログラムのテストを行うために、COBOL 文に類似したデバッグ用コマンドを記述することができます。Debug Tool は、該当する COBOL 文の構文とアクションに非常に類似しているか、またはそれらを複写した、COBOL 文の解釈サブセットを提供します。このためユーザーは、使い慣れたコマンドで作業を行い、また、デバッグ・セッションにおいて開発したプログラム・パッチをソース・コードに挿入することができます。
下の表では、Debug Tool で認識される COBOL 文の解釈サブセットを示します。
| コマンド | 説明 |
|---|---|
| CALL | サブルーチンの呼び出し |
| COMPUTE | 計算指定 (式を含む) |
| Declarations | セッション変数の宣言 |
| EVALUATE | 複数方式切り替え |
| IF | 条件付きの実行 |
| MOVE | 非計算指定 |
| PERFORM | 繰り返しループ |
| SET | INDEX および POINTER 割り当て |
このコマンドのサブセットは、現行のプログラム言語が COBOL のときにのみ有効です。
コマンドを直接、端末またはワークステーションで入力しているとき、その形式はフリー・フォームです。コマンドを 1 桁目から始めて、長いコマンドは 適宜の方法で続けられます。Debug Tool セッション中に、次の行に継続するには、1 バイト文字 (SBCS) の ハイフン (-) を継続文字として使用してください。
ただし、ファイルをコマンド入力源として使用すると、コマンドの形式は、システム/370 COBOL コンパイラーのソース形式に類似します。最初の 6 桁は無視され、7 桁目の SBCS ハイフンは、前の行からの継続を 示します。コマンドは、8 桁目以降から開始して、72 桁目で終了しなければ なりません。
継続行 (7 桁目にハイフンがある) は、ハイフンの後に任意に 1 つ以上 の空白を入れて、その続きを継続させることができます。リテラル・ストリングを継続させる場合には、引用符を追加することが必要です。継続するトークンがリテラル・ストリングではない場合、前の行の 最後の非ブランク文字のあとのブランクは、ハイフンのあとのブランクと 同じように無視されます。
Debug Tool がログ・ファイルにコマンドをコピーする場合、コマンドは上記の 規則に沿ってフォーマット設定されるので、ログ・ファイルを後続の Debug Tool セッション で使用することができます。
継続は、DBCS 名または DBCS リテラル・ストリング内では許可されません。この制約事項は、対話式入力とコマンド・ファイル入力の両方に適用されます。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool では COBOL コマンドに類似したコマンド、または同等のコマンドの多くが使用できますが、Debug Tool が、必ずしもプログラムのコンパイル時に選択したコンパイラー・オプションに従って これらのコマンドを解釈するとは限りません。その理由は、Debug Tool 環境では、次の設定値が有効だからです。
Debug Tool 使用時に使用できる COBOL のコマンドのサブセットの 他に、COBOL によって使用および認識される予約キーワードが あります。これらのキーワードを省略したり、変数名として使用 したり、他のタイプの識別名として使用したりすることはできません。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool は、COBOL 言語で有効なすべての変数タイプを処理することができます。
セッション時に値を変数に代入して変数の値を表示することができ、またセッション変数をテスト要件を満たすように宣言することができます。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool は、コンパイラーによって作成されたシンボル・テーブルに含まれる情報を 使用して、名前からプログラム変数に関する情報を入手します。シンボル・テーブルを Debug Tool が使用できるようにするには、TEST コンパイラー・オプションを指定してコンパイルします。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool は、変数への値の割り当てに使用する 3 つの COBOL 類似 コマンド、COMPUTE、MOVE、および SET を 提供しています。Debug Tool は、COBOL の規則に従って値を割り当てます。COMPUTE、MOVE、および SET コマンドの ソースとレシーバーに可能な値を記述するテーブルについては、「Debug Tool リファレンスおよびメッセージ」を参照してください。
COMPUTE、MOVE、および SET コマンドの例では、次の COBOL プログラム・セグメントで定義された宣言を使用します。
01 GRP.
02 ITM-1 OCCURS 3 TIMES INDEXED BY INX1.
03 ITM-2 PIC 9(3) OCCURS 3 TIMES INDEXED BY INX2.
01 B.
02 A PIC 9(10).
01 D.
02 C PIC 9(10).
01 F.
02 E PIC 9(10) OCCURS 5 TIMES.
77 AA PIC X(5) VALUE 'ABCDE'.
77 BB PIC X(5).
88 BB-GOOD-VALUE VALUE 'BBBBB'.
77 XX PIC 9(9) COMP.
77 ONE PIC 99 VALUE 1.
77 TWO PIC 99 VALUE 2.
77 PTR POINTER.
値 TRUE を BB-GOOD-VALUE に割り当てます。 レベル 88 のレシーバーについては、値 TRUE のみが有効です。 例えば、次のようになります。
SET BB-GOOD-VALUE TO TRUE;
変数 xx に対して、式 (a + e(1))/c * 2 の結果を代入します。
COMPUTE xx =(a + e(1))/c * 2;
このような代入を行う際、以下の例に示すとおり、テーブル・エレメントを使用することもできます。
COMPUTE itm-2(1,2)=(a + 1)/e(2);
ある変数に対して代入された値は、常にその変数のストレージに割り当てられます。最適化されたプログラムでは、変数は一時的にレジスターに割り当てることができますが、その変数に割り当てられる新しい値はプログラムが使用する値を変化させるとは限りません。
ある構造体 d に見られるプログラム変数 c に対して、構造体 b に見られるプログラム変数 a の値を割り当てます。
MOVE a OF b TO c OF d;
この例に使用されている修飾に注目してください。
最初のテーブル・エレメント itm-2 に 123 の値を割り当てます。
MOVE 123 TO itm-2(1,1);
値を割り当てる際に、以下の 2 つの例に示すとおり、参照変更を使用することもできます。
MOVE aa(2:3)TO bb; MOVE aa TO bb(1:4);
inx1 に値 3 を代入し、itm-1 に指標を代入します。
SET inx1 TO 3;
inx1 の値を inx2 に代入します。
SET inx2 TO inx1;
無効アドレス (非数値 0) の値を ptr に割り当てます。
SET ptr TO NULL;
XX のアドレスを ptr に割り当てます。
SET ptr TO ADDRESS OF XX;
X'20000' の 16 進値を、ポインター ptr に割り当てます。
SET ptr TO H'20000';
変数の値を表示するには、LIST コマンドを出します。LIST コマンドを使用すると、Debug Tool は 変数の現行値 (要求されれば名前も) を記録して表示します。例えば、変数 aa, bb, one と、プログラムのステートメント 52 におけるそれぞれの変数の値を表示したい場合には、次のコマンドを入力します。
AT 52 LIST TITLED (aa, bb, one); GO;
Debug Tool は、ステートメント 52 にブレークポイントを設定し (AT)、プログラムの実行を開始し (GO)、ステートメント 52 で停止して、変数名 (TITLED) とそれらの値を表示します。
複数のリストを出すときには、変数の間にコンマを置いてください。変数名を表示したくない場合は、LIST コマンドを出す時に、LIST TITLED でなく LIST UNTITLED と 入力します。
表示される変数の値は、常にその変数のストレージに保管された値です。 最適化されたプログラムでは、変数は一時的にレジスターに割り当てることが でき、その変数に示される値は、プログラムによって使用されている値と 異なる場合があります。
LIST コマンドで国別変数を表示する場合、 表示前に Debug Tool がユニコード・データを EBCDIC に変換します。 変換によって文字が表示できなくなった場合、 LIST %HEX() コマンドを入力して、変換されていないユニコード・データを 16 進形式で表示します。
Debug Tool で実行するプログラムは、2 バイト文字セット (DBCS) で書かれた 変数および文字ストリングを含むことができます。Debug Tool では、DBCS の変数とストリングを含むコマンドを出すこともできます。例えば、DBCS 変数の値を表示したり (LIST)、それに新しい値を割り当てたり、モニター・ウィンドウ内でモニターしたり (MONITOR)、ウィンドウの中でそれを探したり (FIND) することができます。
Debug Tool で DBCS を使用するには、次のように入力します。
SET DBCS ON;
フルスクリーン・モードでデバッグしていて、端末が DBCS 対応でない場合、 SET DBCS ON は使用できません。
COBOL の場合の DBCS のデフォルトは、OFF です。
Debug Tool コマンドで DBCS 変数を使用する際の DBCS 構文および継続規則は、COBOL 言語の場合と同じです。
COBOL の場合、値を更新したい場合は、モニター・ウィンドウあるいはポップアップ・ ウィンドウで、DBCS の値の前に G のような DBCS リテラル を入力する必要があります。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
下の表は、現行プログラム言語が COBOL のときの、Debug Tool の 変数 %PATHCODE に使用可能な値を示しています。
| -1 | Debug Tool は、パスまたはアテンション状態の結果、制御をもっていません。 |
| 0 | アテンション関数 (ATTENTION 条件ではありません)。 |
| 1 | ブロックに入っています。 |
| 2 | ブロックから出ようとしています。 |
| 3 | 制御がプログラムでコード化されているラベルに達しました (段落名 またはセクション名)。 |
| 4 | CALL または INVOKE の結果、制御が渡されます。呼び出されたルーチンのパラメーターがあれば、それは準備ができています。 |
| 5 | 制御が CALL または INVOKE から戻っています。GPR 15 が戻りコードを含む場合には、それは既に保管されています。 |
| 6 | インラインの PERFORM に含まれるいくつかのロジックが 実行されようとしています。 (ライン外の PERFORM の範囲は、段落またはセクション名で始まらなければならず、%PATHCODE = 3 によって識別されます。) |
| 7 | IF...THEN に続くロジックが 実行されようとしています。 |
| 8 | ELSE に続くロジックが実行されようとしています。 |
| 9 | EVALUATE 内の WHEN に続くロジックが実行されようとしています。 |
| 10 | EVALUATE 内の WHEN OTHER に続くロジックが実行されようとしています。 |
| 11 | SEARCH 内の WHEN に続くロジックが実行されようとしています。 |
| 12 | SEARCH 内の AT END に続くロジックが実行されようとしています。 |
| 13 | 次の構造体の 1 つの終わりに続くロジックが
実行されようとしています。
|
| 14 | USE AFTER ERROR などの宣言プロシージャーから制御が戻ろうと しています。(宣言プロシージャーは、セクション名で始まらなければならず、%PATHCODE = 3 によって識別されます。) |
| 15 | 次の句のいずれかと関連するロジックが実行されようとしています。
|
| 16 | 次の句のいずれかを含むステートメントの終わりに続くロジックが
実行されようとしています。
|
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool セッション中にセッション変数を宣言してください。関係のある変数割り当てコマンドは、COBOL 言語で対応するコマンドに 類似しています。COBOL で変数名を形成するための規則は、Debug Tool セッション時の セッション変数の宣言にも適用されます。
次の宣言は、ストリング変数、10 進変数、ポインター変数、および 浮動小数点変数についてです。description という名前のストリングの宣言には、次のように入力します。
77 description PIC X(25)
numbers という名前の変数を宣言するには、次のように入力します。
77 numbers PIC 9(4) COMP
pinkie という名前のポインター変数を宣言するには、次のように入力します。
77 pinkie POINTER
shortfp という名前の浮動小数点変数を宣言するには、次のように入力します。
77 shortfp COMP-1
セッション変数は、デバッグ・セッション全体を通して有効です。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool は COBOL の規則に従って COBOL の式を解釈します。いくつかの制約事項が適用されます。例えば、演算式が指定される場合、次のような制約事項が適用されます。
演算式が比較条件で使用されるときには、両方の被比較数属性が考慮されます。比較条件は、EVALUATE 規則よりもむしろ、IF 規則に従います。
単純比較条件だけがサポートされます。符号条件、クラス条件、条件名条件、切り替え状況条件、複合条件、および簡略条件はサポートされません。比較条件の被比較数のどちらかが演算式 (プラスおよびマイナスなどの演算子を 使用して) の形式の場合は、浮動小数点オペランドに関する制約事項が 両方の被比較数に適用されます。IF コマンドで可能な比較を記述するテーブルについては、 「Debug Tool リファレンスおよびメッセージ」を参照してください。 比較に関する COBOL の規則の説明については、「Enterprise COBOL for z/OS プログラミング・ガイド」を参照してください。
ウィンドウ化日付フィールドは、関係条件ではサポートされません。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
式の結果を表示するには、LIST コマンドを 使用します。例えば、式を評価して、その結果をログ・ウィンドウに表示するには、次のように入力します。
LIST a + (a - 10) + one;
式で構造エレメントを使用することもできます。e が配列の場合、次の 2 つの例は有効です。
LIST a + e(1) / c * two;
LIST xx / e(two + 3);
式の計算の条件は、プログラム・ステートメントの場合と同じです。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
Debug Tool セッション中に、オペランドにストリング定数を用いる式の 使用が可能であり、また変数名あるいは数字定数を 1 オペランドとして含む 式の使用が可能です。「Enterprise COBOL for z/OS 言語解説書」で説明されているすべての COBOL ストリング定数タイプが Debug Tool 内では 有効ですが、次の制限があります。
さらに、Debug Tool では、アドレスを表す 16 進定数を使用することができます。この 16 進定数 は、数値 16 進リテラル形式 (16 進文字のみであり、引用符 (") またはアポストロフィ (') によって区切られ、先頭には H が付く) を使用して 16 進で指定するフルワードの値です。値は、右寄せにして、左はゼロで埋め込みます。例えば、次のようにします。
LIST STORAGE (H'20cd0');
指定されたアドレスの内容を 16 進形式で表示します。このタイプの定数を SET コマンドで使用できます。例えば、次のようにします。
SET ptr TO H'124bf';
16 進値 124bf を変数 ptr に割り当てます。
Debug Tool は、プログラム変数およびストレージに関する詳細な情報を得るために使用できる、特定の関数を提供します。
LIST コマンドとともに %HEX を使用して、オペランドの 16 進値を表示することができます。例えば、PIC 9(9) として定義されている パック 10 進数 pvar3 を、16 進数 (または内部的) に等価な 1234 から、外部表示するには、次のように入力します。
LIST %HEX (pvar3);
ログ・ウィンドウには、16 進ストリング X'000001234' が表示されます。
この Debug Tool 関数で、ストレージをアドレスと長さを指定して参照できます。CHANGE ブレークポイントをセットするときに %STORAGE 関数を 参照として使用すると、ストレージの特定区域での変更を見ることができます。例えば、16 進アドレス 22222 のストレージの 8 バイトの変更を モニターするには、次のように入力します。
AT CHANGE %STORAGE (H'00022222', 8) LIST 'Storage has changed at Hex address 22222'
修飾は、修飾子を使用してオブジェクトを指定し、視点をあるブロックから 別のブロックに変更し、現在実行されているブロックには認識されないデータを 処理できるようにする方法です。例えば、割り当て MOVE 5 TO x; は、Debug Tool が処理できないほど難解には見えません。しかし、x という名の変数を複数もつ場合があります。そこで、どの変数 x に 5 を割り当てるのかを Debug Tool に 知らせる必要があります。
修飾を使用して、特定の変数がどのコンパイル単位またはブロックに 属するかを指定することができます。Debug Tool が呼び出されるとき、現在実行されているブロックにはデフォルトの修飾が設定されており、それは暗黙に 修飾されています。したがって、ほかのブロック内のすべての ステートメント番号および変数名に対する参照は、明示的に修飾しなければなりません。1 つ以上のブロックまたはコンパイル単位を呼び出すコンパイル単位を テストするときには、これを行わなければなりません。コマンドを出すときには、どのブロックに特定のステートメント番号または 変数名が含まれるのかを指定する必要があります。
修飾子は、ロード・モジュール、コンパイル単位、ブロック、セクション名、または段落名を組み合わせたものであり、より大きい記号 (>)、コロン、および COBOL データ修飾表記法の OF または IN を組み合わせてこれらを区切り、参照されるステートメント番号または変数名の前に置きます。
1 つのブロック・レベル上のオブジェクトを修飾するときには、データ修飾の COBOL 形式だけを使用してください。データ名が固有であるか、または GLOBAL として定義されている 場合には、それらはそのブロック・レベルに対して修飾する必要はありません。
次に示すのは、完全修飾オブジェクトです。
load_name::>cu_name:>block_name:>object;
必要であれば、load_name がロード・モジュールの名前となります。これは、プログラムが複数のロード・モジュールで構成されていて、現行のロード・モジュール以外の修飾を変更するときにだけ必要になります。load_name は、Debug Tool 変数の %LOAD にすることもできます。
必要であれば、cu_name がコンパイル単位の名前となります。cu_name は、完全に修飾されたコンパイル単位名でなければなりません。これは、修飾を現在修飾されているコンパイル単位以外に変更したい場合にのみ必要です。これは、Debug Tool 変数 %CU にすることができます。
必要であれば、block_name がブロックの名前となります。block_name は、修飾を、現在修飾されているブロック以外に変更したい場合にのみ必要です。これは、Debug Tool 変数 %BLOCK にすることができます。block_name に大/小文字の区別がある場合、ブロック名を引用符 (") またはアポストロフィ (') で囲んでください。名前が引用符に囲まれていない場合、Debug Tool は名前を大文字に変換します。
以下は、2 つの類似した COBOL プログラム (ブロック) です。
MAIN
·
·
·
01 VAR1. 02 VAR2. O3 VAR3 PIC XX. 01 VAR4 PIC 99.. ****************MOVE commands entered here****************
SUBPROG
·
·
·
01 VAR1. 02 VAR2. O3 VAR3 PIC XX. 01 VAR4 PIC 99. 01 VAR5 PIC 99. ****************LIST commands entered here****************
main と subprog ブロックは修飾を使用して 区別することができます。現在実行されているブロックが main であるときに、次の MOVE コマンドを入力したとします。
MOVE 8 TO var4; MOVE 9 TO subprog:>var4; MOVE 'A' TO var3 OF var2 OF var1; MOVE 'B' TO subprog:>var3 OF var2 OF var1;
そして、現在実行されているブロックが subprog であるときに、次の LIST コマンドを入力したとします。
LIST TITLED var4; LIST TITLED main:>var4; LIST TITLED var3 OF var2 OF var1; LIST TITLED main:>var3 OF var2 OF var1;
上記の各 LIST コマンドにより、次の出力 (コメントのないもの) が ユーザーのログ・ウィンドウに表示されます。
VAR4 = 9; /* var4 with no qualification refers to a variable */
/* in the currently executing block (subprog). */
/* Therefore, the LIST command displays the value of 9.*/
MAIN:>VAR4 = 8 /* var4 is qualified to main. */
/* Therefore, the LIST command displays 8, */
/* the value of the variable declared in main. */
VAR3 OF VAR2 OF VAR1 = 'B';
/* In this example, although the data qualification */
/* of var3 is OF var2 OF var1, the */
/* program qualification defaults to the currently */
/* executing block and the LIST command displays */
/* 'B', the value declared in subprog. */
VAR3 OF VAR2 OF VAR1 = 'A'
/* var3 is again qualified to var2 OF var1 */
/* but further qualified to main. */
/* Therefore, the LIST command displays */
/* 'A', the value declared in main. */
上記の変数修飾方法がコマンド・ファイルには必要です。
視点は、通常は現在実行されているブロックです。SET QUALIFY コマンドを使用して視点を変更し、アクセス不能なデータを入手することもできます。SET キーワードはオプションです。例えば、視点 (現行の実行) が main の中であり、subprog の中で宣言されている変数を使用してコマンドを 出す場合には、次のように視点を変更することができます。
QUALIFY BLOCK subprog;
これにより、修飾子を使用せずに、subprog 内に宣言されている変数を使用してコマンドを出すことができます。Debug Tool は、プロシージャー main で宣言されている変数は 参照しません。例えば、次の割り当てコマンドは、subprog の視点で有効です。
MOVE 10 TO var5;
ただし、視点がまだ subprog にある時に、main にある変数の値を表示したい場合には、次のように修飾子を使用する必要があります。
LIST (main:>var-name);
上記の視点変更の方法がコマンド・ファイルに必要です。
Enterprise COBOL for z/OS and OS/390 バージョン 3 リリース 1 またはそれ以降で作成された COBOL クラスのブロック構造は、 COBOL プログラムのブロック構造と異なります。 COBOL クラスのブロック構造には、次の相違があります。
メソッドは、FACTORY ブロックまたは OBJECT ブロックのいずれかに属します。 FACTORY パラグラフのメソッドに対する完全修飾ブロック名は、次のとおりです。
class-name:>FACTORY:>method-name
OBJECT パラグラフのメソッドに対する完全修飾ブロック名は、次のとおりです。
class-name:>OBJECT:>method-name
メソッドのブレークポイントにいる場合、 現行の修飾ブロックはそのメソッドです。LIST TITLED コマンドをパラメーターなしで入力すると、そのメソッドに関連付けられたすべてのデータ項目 を Debug Tool がリストします。FACTORY または OBJECT 内のすべてのデータ項目をリストするには、 次のステップを行います。
例えば、ACCOUNT というクラスに関するすべてのオブジェクト・インスタンス・データ項目をリストするには、 次のコマンドを入力します。
QUALIFY BLOCK ACCOUNT:>OBJECT; LIST TITLED;
TEST コンパイラー・オプションを使用してコンパイルし、言語環境プログラムのライブラリーとリンクした VS COBOL II プログラムのデバッグには、制限があります。言語環境プログラムの呼び出し可能サービス (CEETEST を含む) は使用できません。 ただし、言語環境プログラムのランタイムを使用する必要があります。
Debug Tool は、ユーザーが以下のコマンドを使用して設定したブレークポイントでは、プログラムの制御を行うことができません。
ただし、非 VS COBOL II プログラムを呼び出す AT CALL コマンドを使用してブレークポイントを設定した場合は、Debug Tool はプログラムの制御を行うことができます。Debug Tool がプログラムの制御に使用できるブレークポイントを設定するには、AT ENTRY *、AT EXIT *、AT GLOBAL ENTRY 、および AT GLOBAL EXIT の各コマンドを使用してください。
ユーザーが入り口点および出口ステートメントに設定するブレークポイントは、それに関連するステートメントを持っていません。したがって、そのようなブレークポイントに対しては、コンパイル単位のレベルでトリガーがかけられます。トリガーがかけられると、リストの現在の表示は上面に移動し、ステートメントの強調表示がされない状態になります。ユーザーが入り口点および出口ステートメントに設定するブレークポイントは、STEP により無視されます。
VS COBOL II プログラムをリモート・デバッグ・モードでデバッグする場合、どの COBOL プログラムとも同じ TEST ランタイム・オプションを使用してください。
VS COBOL II コンパイラーは、リストのデータ・セットの名前をオブジェクト (ロード・モジュール) に残しません。Debug Tool は、リストのデータ・セットを userid.CUName.LIST の中から探そうとします。リストが PDS に入っている場合は、以下のいずれかの方法で、PDS のロケーション を Debug Tool に指示してください。
VS COBOL II プログラムのデバッグ方法についての追加情報は、「連携開発環境プログラム /370 リリース 2 VS COBOL II と OS PL/I による連携開発環境プログラム (CODE)/370 の使い方」(SC88-7344) を参照してください。