RSE:プログラムのデバッグ

リモートシステムエクスプローラからプログラムのデバッグを行います。

デバッグのやりかたは、
1.サービスエントリーポイントを使用する方法
2.対話式プログラムを利用する方法
3.実行ジョブを指定する方法

どの方法でもデバッグの仕方は変わりません。プログラムの起動方法が変わる位です。
まずは「メニュー」⇒「ウインドウ」⇒「設定」を選択しデバッグの設定を確認します。

5250でSTRDBGのオプションにUPDPRODがありますが、それと同じものです。
(WDSCOBJライブラリのライブラリー・タイプは*TESTなので、このオプションはチェックを付けていません。)


デバッグサーバーを起動します。
5250よりSTRDBGSVRを実行しても同じです。WDSCでデバッグを行う際は必須です。


1.サービスエントリーポイントを使用する方法

入り口となるプログラムにエントリーポイントを設定し、そのプログラムがCALLされると デバッグが起動するようになります。

一般的なプログラムの作り「メニュー」⇒「CL」⇒「RPG」だとすれば、 CLにエントリーポイントを設定するイメージです。

ここではTEST11C⇒TEST11Rが呼び出される作りなので、TEST11Cにエントリーポイントを設定します。 (ソースでは無く、オブジェクトを右クリック)

正しく設定されると下記ダイアログが表示されます。


エントリーポイントが設定されているプログラムが表示されています。


5250より対象のプログラムをCALLします。


WDSCに制御が移ります。
が、失敗しました。コンパイルする際のオプションがデバッグ用ではなかったようです。


ということで、リコンパイル。


サービスエントリーポイントはリコンパイルするとうまく機能しません。
右クリック⇒「更新」を選択します。


5250より再度プログラムをCALLします。


今度は上手く行きました。
注)WDSCと5250は同じサインオンユーザーを使用してください。


WDSCから表示されているプログラムスタックです。


5250と比較してみましたが、当然内容は同じでした。


9行目までステップ実行しています。CL内の変数を見てみましょう。
内容を見たい編集をダブルクリックして反転させて


右クリック⇒式のモニター


変数の内容が表示されました。
(ちなみにWS名の8Byte分をSUBSTRしてセットしているだけです。)


ステップ実行していき、5250側に制御が移るとWDSC側が待ちになって5250側の画面が変わります。
(下図はSNDRCVFのステートメントを実行した後です。)


実際にデバッグをしたいのはTEST11Rなので、28行目にブレークポイントを設定します。
画面右側の青丸がそれです。


下図は、CL内フラグの内容をモニターしているところです。


ステップ実行でRPGをCALLしている箇所まで来ました。

ここでRPG内に入るにはステップイン(F5)を押します。
ステップオーバー(F6)はRPGを実行して次の行(RETURN)まで行きます。
(この場合、RPG内でブレークポイントを設定していても止まりません。)

注意点としては、ステップインでRPG内に入らないとRPGのデバッグが出来ない事です。

ステップインとステップオーバーの違いは、RPG内に入るか・入らないかだけで、
RPG内のサブルーチンの箇所でステップオーバーを行ってもサブルーチン内に入ります。

javaの場合はメソッド呼び出しでステップインとステップオーバーで動きが変わりますが、 WDSCの場合はCALLだけの制御のようです。

また、試した限りステップリターン(F7)はステップオーバー(F6)と同じでした。


ステップイン(F5)でRPG内に入りました。


5250は実行中の状態のままです。


パラメータの確認をしてみましょう。
画面の値がパラメータとしてRPGに渡って来ていることが分かります。


RPG内の変数のモニターの取り方はCLと同じです。
この例では、59行目にブレークポイントを設定していて、


再開(F8)を押して


モニターしている変数が変わっていることが分かります。


ブレークする条件を設定する

ここでは、以下3つの条件でブレークさせてみます。

a.ループの回数を指定してブレークさせる方法。
b.データの条件式によってブレークさせる方法。
c.変数の値をモニタさせ変わったタイミングでブレークさせる方法。

EMPLOYEEテーブルは下図のような内容になっています。


a.ループの回数を指定してブレークさせる方法。

プログラムはパラメータの値でSETLLして、53行目〜70行目をループしています。

今回はパラメータにEMPNO「000200」を渡し、
5回目のループEMPNO「000240」)でストップさせます。

まずは、59行目にブレークポイントを設定します。


編集します。


次へを押します。

頻度の「開始」に5「終了」に5を設定します。

「終了」は「無限大」のままにしておくと、5回以降のループすべてブレークします。
「終了」⇒5だと一度しかブレークしません。


プログラムを実行します。社員コード(EMPNO)に「000200」を入力して、


止まりました。


EMPNOが「000240」なのが確認できました。


(ちょっと寄り道して)変数の内容を変えてみます。


ステップ実行して#FILD2の内容を読み込みます。


右クリックして「値の変更」


変えてみました。#FILD2は長さ12Byteなので漢字5文字までしか入力できません。
(それより大きい文字を入力するとプログラムが強制終了します。)


値が変わっているのが分かります。


b.データの条件式によってブレークさせる方法。

やり方は頻度と同じで、今度は式を以下のようにします。


止まりました。


c.変数の値をモニタさせ変わったタイミングでブレークさせる方法。

オーバーフロー標識が変わったタイミングでブレークさせてみます。
*INOFを探してダブルクリックで反転、右クリックで「監視ブレークポイントの追加」


監視するバイト数を0にすると、その変数に定義済みのバイト数を監視することを意味します。
この場合、フラグなので1Byteを監視するという事です。


監視が追加されました。


プログラムを実行して、監視している変数の値が変化するとブレークします。


2.対話式プログラムを利用する方法

下図の方法で指定します。


5250側でSTRRSESVRを実行していないので、ダイアログが出ます。
この状態にしておきます。


5250でSTRRSESVRを実行します。

ダイアログが消えて、デバッグできる状態になります。後は同じです。

プログラムにパラメータがある場合は、デバッグ(プロンプト)を指定します。


下図画面が表示されます。


開始方法にパラメータを追加します。後は同じです。


3.実行ジョブを指定する方法

「iSeriesジョブ」⇒「ユーザー・アクティブ・ジョブ」からプログラムを実行する5250のジョブを見つけて右クリック。


ダイアログが表示されます。


再開(F8)を押します。


5250側でプログラムを実行すると、ブレークします。後は同じです。
なお、プログラムを実行する前に再開(F8)しておかないとブレークしませんでした。


5250のデバッグ機能より感覚的にデバッグできるのではないでしょうか。
デバッグだけでも導入する価値はあるように思いました。

以上で終了です。

(記事を書いた日:2014/06/12)