それでは実際のデバッグを紹介する。
ちょうど折り良く開発中のプロジェクトで次のようなRPGのエラーが発生した。
この障害の追跡と解決のプロセスを紹介するる。
(この現在も原因はまだ特定できていない。)
(1)エラーの発生場所を探す
最初にこのエラーが発生しているプログラムと発生している場所
(ステートメント)を探すことから始める。
エラー・ッセージにすぐ応答してはいけない。
エラー・ッセージに応答すると実行スタックが変わってしまうからである。
エラーの発生場所を探すには次の二つの方法がある。
(1)-1.エラー・ッセージの発生元を探す
最も簡単にエラーの発生場所を探す方法はこのメッセージが
どこから出ているのかを探すことである。
それには
1.エラー・ッセージにカーソルを合わせて
2.F1キーを押す。
….メッセージの詳細が表示されるのでエラーの内容を確認する。
3.F9キーを押す
….送信元プログラムがエラーの発生源である。
今回は残念ながら適用業務は示されていないが
ユーザー・プログラムのエラーの発生箇所が次のように示されることが多い。
(今回は発生源が表示されなかったのでこの画面は参考例を示している)
(1)-2.実行スタックを探す
5250エミュレータではマウスの右ボタンを押して次のようなフローティング・メニューを
表示させる。
「システム要求」を選択して | | | ……| の画面でオプション3を入力する。
————–
実行キーを押してからオプション3を選択してもよい。
WRKACTJOBによるこのジョブの表示が表示されるのでオプション11を選択して
スタック状況を表示させる。
最も下のほうに表示されているのが最後に実行されたスタックである。
これを見るとエラーの発生箇所は
プログラム ステートメント プロシージャー
ADDHLPEXT V.PANELWKR 225 ADDHLPEXT
であることがわかる。
ADDHLPEXT というRPGプログラムのコンパイル・リストでステートメント225とは
219 C MOVEA SELECT_ AR
220 C MOVEA(P) AR(M) WHERE_
221 C ENDIF
222 C 'ON ' SCAN SELECT_:1 M
223 C *IN50 IFEQ *ON
224 C EVAL LEN = M - N
225 C LEN SUBST SELECT_:N FROM_
226 C MOVEA SELECT_ AR
227 C MOVEA(P) AR(M) ON_
228 C ENDIF
229 C ENDIF
230 C ENDSR
というように示されていて
225 C LEN SUBST SELECT_:N FROM_
の部分でエラーが発生していることがわかる。
エラーは長さまたは開始桁が誤りであるということだったので
長さ: LEN または 開始位置: N が不正な値であるこということが
想像できる。
そこでエラー・メッセージの表示にここで初めて戻って D (=ダンプ・リスト)で
エラー・メッセージに応答して終了する。
WRKOUTQ QEZDEBUG でダンプ・リストを探すと
のようにエラー・メッセージを伴うダンプ・リストが出力されていることがわかる。
そこで LEN と N の現在の値を調べてみると
LEN ZONED(4,0) -0024. 'F0F0F2D4'X : N ZONED(4,0) 0326. 'F0F3F2F6'X :
のように LENの値は -24となっておりこれがエラーの原因であることがわかる。
そこで初めてプログラム ADDHLPEXT を調査する。
SEU を開始する前に
プログラム表示 (DSPPGM) 選択項目を入力して,実行キーを押してください。 プログラム . . . . . . . . . . > ADDHLPEXT 名前 ライブラリー . . . . . . . . . . . > V.PANELWKR 名前 , *LIBL, *CURLIB 出力 . . . . . . . . . . . . . * *, *PRINT 詳細 . . . . . . . . . . . . . *ALL *ALL, *BASIC, *SIZE... 値の続きは+
でプログラム表示をさせて
プログラム情報の表示 画面 7 の 3 プログラム . . . . . . : ADDHLPEXT ライブラリー . . . . . : V.PANELWKR 所有者 . . . . . . . . : QTR プログラム属性 . . . . : RPGLE 詳細 . . . . . . . . . : *MODULE オプションを入力して,実行キーを押してください。 5= 記述の表示 6= 記述の印刷 デバッグ・ OPT モジュール ライブラリー 属性 作成日 最適化レベル データ ADDHLPEXT QTEMP RPGLE 20/05/22 *NONE *YES
ここでオプション5を選択するとソース情報が次のように表示される。
プログラム情報の表示 プログラム . . . . . . : ADDHLPEXT ライブラリー . . . . . : V.PANELWKR モジュール属性 : モジュール . . . . . . . . . . . . . . . . . . : ADDHLPEXT ライブラリー . . . . . . . . . . . . . . . . : QTEMP ソース・ファイル . . . . . . . . . . . . . . . : QRPGLESRC ライブラリー . . . . . . . . . . . . . . . . : R610SRC ソース・メンバー . . . . . . . . . . . . . . . : ADDHLPEXT モジュール属性 . . . . . . . . . . . . . . . . : RPGLE モジュール作成日/時刻 . . . . . . . . . . . . : 20/05/22 17:55:09 ソース・ファイル変更日/時刻 . . . . . . . . . : 20/05/22 17:55:06 コード化文字セット ID . . . . . . . . . . . . : 65535 作成データ . . . . . . . . . . . . . . . . . . : *YES ソート順序テーブル . . . . . . . . . . . . . . : *HEX 言語 ID . . . . . . . . . . . . . . . . . . . : *JOBRUN 最適化レベル . . . . . . . . . . . . . . . . . : *NONE 最大最適化レベル . . . . . . . . . . . . . . . : *FULL 続く ... 続行するには,実行キーを押してください。 F3= 終了 F12= 取り消し
これでソース: R610SRC/QRPGLESRC.ADDHLPEXT を初めてSEUまたはPDMで
オープンすることができる。
あえてソース情報を検索する方法を紹介したのは一般のユーザーでは
数多くのソースを保有しているはずだが実際のソースがどれであるかを
確かめずにソースをオープンしている事例が多い。
このオブジェクトのソースはどれであるかをきちんと確認することが
重要であるので日常からソースを確認する癖を習慣として欲しい。
…今回の方法で障害エラーが発生したときにどのプログラムのどこで
どのようなエラーが発生したのかを知ることができ、
しかもそのときのフィールドの値まで取得できた。
エラーの場所と状況は確認できたので次回はそのエラーが
起こった原因と解決のためのデバッグを紹介する。
[今回のまとめ]
障害エラーが起こっても直ちにエラー・メッセージには応答しない。
メッセージをF1-F9でエラーの発生場所を探すかまたは
実行スタックで発生場所を探る。
障害エラーには D(=ダンプリスト)で応答すればエラーのときの
フィールド値がダンプリストとして出力される。