会話型デバッガ
-
A-VXのCOBOL85コンパイラには、会話型デバッガという名前の簡単なデバッガが付いています。
デバッガを使うと画面の右下にIDSPという表示が出るので、IDSPデバッガと言う人もいます。
プログラムの途中で止めて、そのときの変数の値を見たり、シングルステップで少しずつ進めて行ったりということができます。
- 簡単な使い方
-
全部は書ききれないので、さわりだけ説明します。
詳しくは、「COBOL85会話型デバッガ説明書」を参照。
- 1.準備
-
まず、普通にプログラムを書きます。
例えば、以下のような感じ。
プログラム名:MIYAZA 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. MIYAZA. 000030 ENVIRONMENT DIVISION. 000040 CONFIGURATION SECTION. 000050 SPECIAL-NAMES. GDD IS ERR-MSG. 000060 DATA DIVISION. 000070 WORKING-STORAGE SECTION. 000080 01 GR01. 000090 05 I1 PIC 9(04) VALUE ZERO. 000100 05 I2 PIC 9(04) VALUE ZERO. 000110 PROCEDURE DIVISION. 000120 MAIN-R-SEC SECTION. 000130 MAIN-RTN. 000140 MOVE "1234AGZ=" TO GR01. 000150 DISPLAY "I1=" I1. 000160 DISPLAY "I2=" I2. 000170 COMPUTE I2 = I2 + 1. 000180 DISPLAY "成功終了。RESETキーでプログラム終了" 000190 UPON ERR-MSG. 000200 STOP RUN.
実は、上のプログラムは14行目が間違っています。
I2は数字項目なのに、「AGZ=」という文字を移送しています。
そのため、17行目のCOMPUTE命令でエラーになるはずです。
会話型デバッガを使うためには、コンパイルのときにパラメータで指定してあげる必要があります。
下のように、DEBUG INFORMATION OUTPUT(DIO=)パラメータでYES(または1)と入力します。
RANGE CHECK(RNG=)もYESにします。
後はコンパイル後にリンクして、普通にロードモジュールを作ります。
- 2.実行する
-
作ったロードモジュールを実行します。
このとき、RUNコマンドのパラメータ「DEBUG」を付けます。
参考:RUNコマンドの説明
デバッガが動いていると、最初に下のような画面になります。
会話型デバッガの画面です。
もし画面の下の方に「C C1B97:このLMではデバッグできません」とエラーメッセージが出ていたら、コンパイルのときのパラメータが間違っています。もう一度コンパイルからやり直しです。
- 3.会話型デバッガを使う(1)
-
シングルステップで1行ずつ進めてもいいですが、まずはエラーになるかどうか確認するために、実行してしまいましょう。
さっきの画面でGOコマンド(GOと打ち込んでENTERキーを押すか、省略形コマンドならGと打ち込んでENTERキーを押す。)を実行します。
GOコマンドは、ブレイクポイントのところまで実行するコマンドです。まだブレイクポイントは設定していないので、エラーにならなければ、プログラムの最後まで実行します。でも、今回はわざとエラーのあるプログラムを実行しているので、14行目のところでエラーで止まるはずです。
すると下の画面のように、予想通りエラーになりました。
ここでリセットキー(WindowsのW/Sエミュレータだと普通は[ESC]キーになる)を押すと、デバッガの画面に変わります。
PROGRAM ABORT(要するにエラー)で終わって、MIYAZAという名前のCUの17行目で止まっているということを示しています。
PRINTコマンドで現在の変数の値を見ることができます。
PRINT I1(または省略形コマンドP I1)でI1の現在の値、PRINT I2(P I2)でI2の現在の値を見ることができます。
下の画面ではI1が1234、I2がAGZ=になっていることがわかります。
STOPコマンドで、プログラムを終了させることができます。
下のような画面になりますが、気にせずにENTERキーを押します。
(この画面の意味は、メモリダンプ解析ツール(#ABANA)を参照。)
- 4.会話型デバッガを使う(2)
-
さらに、いくつかのコマンドを説明します。
もう一回、最初からロードモジュールを実行してみます。
ブレイクポイント(中断点)を設定してみます。
ブレイクコマンドは、いろいろな止まり方を指定できます。(例えば「BREAK ALL OF /I2/ , IF I2 = "AGZ="」とすれば、変数I2がAGZ=になった時に止めることができます。)
今回は簡単に、行番号を指定して止めてみます。
16行目で止まるようにするには、BREAK 16と入力してENTERキーを押します。
そして、GOコマンドを実行すると、(うまくいけば)16行で止まります。(15行を実行して、16行目まで来た、まだ16行目は実行していないというタイミングで止まっています)
デバッガの画面ではなく、プログラムの画面を見たいときは、USERコマンドか、画面接続コマンドのどちらかを使って切り替えます。
下の画面が、画面接続コマンドを使って、15行目まで実行したところのプログラムの画面を表示したところです。
デバッガの画面に戻るには、USERコマンドを使った時はRESETキーで戻ります。画面接続コマンドを使った時は、戻す時も画面接続コマンドです。
下の画面は、デバッガの画面に戻って、PRINTコマンドを実行したところ。
16行目で止まっている時点のI2の値を見てみる場合は「P I2」と入力します。
PRINTコマンドは複数指定やデータタイプ毎や16進形式、文字形式などでも表示できます。
I2の値が悪いのでエラーになっていることは分かっているので、I2の値を変えちゃいましょう。
変数の値を変更するには、CHANGEコマンドを使います。
下の画面では、I2を1に変えています。「CHANGE I2=1」と入力します。
変わったか確認してみます。
PRINTコマンドでI2の値を表示してみると0001になっていました。確かに変わっています。
次の行を実行してみましょう。シングルステップはNEXTコマンドです。
1行分命令を実行したので、16行目を実行して、17行目実行前まで来たことになります。
下の画面は、16行目まで実行したところで画面接続コマンドでプログラム側の画面を見てみたところです。
もちろん、USERコマンドでプログラム側の画面を見ても構いません。
GOコマンドを実行して、残りを一気に実行してみます。
とりあえず、最後まで実行できました。
あとはRESETキー([ESC]キー)を押せば、プログラムは終わります。
NEXTコマンドを実行するなどして、デバッガが止まったような状態になったときは、画面接続コマンドでプログラム側の画面に切り替えて、その状態を確認してみましょう。
プログラム側が画面にDISPLAY命令やACCEPT命令などで画面に何かを表示しようとしていたり、入力要求されていたりして、デバッガが止まったように見えている可能性があります。
DISPLAY命令ならば、いったんプログラム側の画面にすれば、画面に無事何かを表示でき、その後画面接続コマンドでデバッガの画面に戻れば、デバッガは動けるようになっているはずです。ACCEPT命令ならば、何か入力してから、画面接続コマンドでデバッガ画面に戻ります。
今回はOPTIONコマンドを使いませんでしたが、OPTIONコマンドを使うときは、デバッガが起動した後、一番最初に実行します。デバッグ途中でも使うことはできますが、何か別のコマンドを実行した後は、設定できる値がほとんどないので、あまり役に立ちません。
RUNコマンドでDEBUGパラメータを指定しなければ、会話型デバッガは動かず、普通にプログラムが実行されます。が、プログラムの実行速度が遅くなるそうですので、本番用のロードモジュールを作るときは、以下のいずれかの方法でデバッグ情報テーブルを削除します。
・#LBMの属性変更でデバッグ情報テーブルを削除する。
・DEBUG INFORMATION OUTPUTをNOにしてコンパイルしなおす。
- そのほか情報
-
COBOL74用のプログラムの場合も、COBOL85コンパイラのCOBOL74モードでコンパイルすることで、会話型デバッガが使用できます。
会話型デバッガを使用するには、COBOL85をインストールするときに「全て登録」または「COBOL85と会話型デバッガを登録」を選択しなければなりません。
「COBOL85のみを登録」(何も考えないでインストールするとこれが選択されてしまう)、「COBOL85とMFDコンパイラを登録」といったものを選択してインストールした場合は、会話型デバッガはインストールされません。
よくここで間違える人がいるようなので注意してください。