Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


RPG,COBOLでエラー発生時にプログラムダンプを取得する方法

SmartPad4iのアプリケーションにて、IBMiプログラム側でエラーが発生した場合には、ジョブログが出力されます。
ジョブログからもエラー原因を突き止めることができますが、より詳細なプログラムの情報を得るために、プログラムダンプを取得することもできます。
Tipsでは、IBMi側プログラムでエラーが発生した際に、プログラムダンプを出力する方法についてご紹介します。

プログラムダンプについて

QPPGMDMP

ダンプ命令によってモジュールのダンプを行うと、プログラム内のフィールド、ファイル、標識、データ構造、配列の詳細情報を出力できます。
そのため、エラー発生時にプログラムのダンプを出力すると、エラーに至った詳細な情報を取得できます。 
ダンプファイルは待ち行列QEZDEBUGにQPPGMDMPとして出力されます。

QPPGMDMP

ダンプには、プログラムでエラーが発生した際の詳細な情報が出力されています。
例えば、上記ダンプファイルの場合、「プログラムの状況」で「呼び出し側プログラムがエラー。」が表示されていて、エラーのステートメントは14300(143行目)であることが分かります。

プログラムの14300でエラー

エラーが発生したRPGプログラムの143行目を確認すると、CALL ‘ERRAPP’を呼び出し時に「メッセージ・タイプ」では、「オブジェクトを分析解決することができない。…」が表示されているため、ERRAPPのオブジェクトが存在しないことがエラーの原因であると特定できます。
このように、ダンプを出力するとエラー原因を簡単に見つけることができます。

SmartPad4iでの設定方法

通常のIBMiプログラムでエラーが発生した場合、「ダンプを出力する」「終了する」等のメッセージ応答を行うことができます。
しかし、SmartPad4iでは、IBMiプログラム(RPG,COBOL)はSP4Iサブシステム下でバッチジョブとして動作します。
IBMiプログラム側でエラーが発生した場合、ジョブが終了してしまうため、エラーが発生してからダンプを取得することはできません。
バッチジョブのエラー発生時にプログラムダンプを出力するため、「システム応答リスト」を利用して自動応答を設定します。

システム応答リストの追加

システム応答リストは、ADDRPYLE コマンドで追加できます。

◆ADDRPYLE
https://www.ibm.com/docs/ja/i/7.4?topic=ssw_ibm_i_74/cl/addrpyle.html

システム応答リストの設定例は以下になります。

・RPG

ADDRPYLE SEQNBR(9700) MSGID(RPG0000) RPY('D')

・RPGLE

ADDRPYLE SEQNBR(9800) MSGID(RNQ0000) RPY('D')

・COBOL

ADDRPYLE SEQNBR(9900) MSGID(LBE0000) RPY('D')

自動応答を実行するための処理

自動応答リストに設定を追加後、SmartPad4iの環境設定用のCLプログラムでCHGJOBコマンドを実行して自動応答を有効に変更します。

CHGJOB INQMSGRPY(*SYSRPYL)
CHGJOB INQMSGRPY(*SYSRPYL)

この設定を行うことで、IBMiプログラム側でエラーが発生した際に、ダンプファイルが出力されるようになります。
ダンプファイルを出力することが可能となりますが、エラー発生時にはSmartPad4iアプリケーションでエラー画面が表示されず、アプリケーションが終了します。
そのため、原因不明なアプリケーションエラーが発生した際にのみ、組込みを行い、調査終了後には
CHGJOB INQMSGRPY(*SYSRPYL) をコメントに変更して元の設定に戻してください。