RPG

356. エラーの場所を特定するするには

それでは実際のデバッグを紹介する。
ちょうど折り良く開発中のプロジェクトで次のような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(=ダンプリスト)で応答すればエラーのときの
フィールド値がダンプリストとして出力される。