CLPやRPG III は元々ソース・デバッグすることはできなかった。
しかしILEのソース・デバッグとともにこれらのOPMと
呼ばれる古いブログラムでもソース・デバッグ可能として
コンパイルしておけばデバッグのときにソース・デバッグが
可能になる。
例えばCLPのコンパイルでは
CL プログラム作成 (CRTCLPGM)
選択項目を入力して,実行キーを押してください。
プログラム . . . . . . . . . . > MYCLPGM 名前
[bボ[メー . . . . . . . . . . . > OBJLIB 名前 , *CURLIB
ソース・ファイル . . . . . . . QCLSRC 名前
[bボ[メー . . . . . . . . . . . > SRCLIB 名前 , *LIBL, *CURLIB
ソース・メンバー . . . . . . . *PGM 名前 , *PGM
テキスト ' 記述 ' . . . . . . . *SRCMBRTXT
出力 . . . . . . . . . . . . . *PRINT *PRINT, *NONE
ソース・リスト・オプション . . *SRCDBG *SOURCE, *NOSOURCE, *SRC...
値の続きは+
生成オプション . . . . . . . . *NOLIST, *LIST, *NOXREF...
値の続きは+
ユーザー・プロファイル . . . . *USER *USER, *OWNER
のようにして*SRCDBGを指定しておいてデバッグのときは
デバッグ開始 (STRDBG)
選択項目を入力して,実行キーを押してください。
プログラム . . . . . . . . . . MYCLPGM 名前 , *NONE
ライブラリー . . . . . . . . . . . OBJLIB 名前 , *LIBL, *CURLIB
省略時のプログラム . . . . . . *PGM 名前 , *PGM, *NONE
最大 トレース・ステートメント 数 . . . . . 200 数値
トレース・データ満杯時の処理 *STOPTRC *STOPTRC, *WRAP
実動ファイルの更新 . . . . . . *YES *NO, *YES
OPM ソース・レベル・デバッグ . *YES *NO, *YES
サービス・プログラム . . . . . *NONE 名前 , *NONE
ライブラリー . . . . . . . . . . . 名前 , *LIBL, *CURLIB
のようにしてOPM ソース・レベル・デバッグに*YESを指定すれば
ソースを表示してデバッグすることができる。
まだ知らない人はぜひ試して欲しい。
さてそれではOPMで *SRCDBG と指定してコンパイルされたプログラムであることを
どのようにして判定すればよいのだろうか>
AIに相談してみたがいろいろ誤った回答を繰り返した挙句に
OPMのソース・デバッグを判定できるAPIは存在しないと断言した。
しかしよく調べてみると実は QteRetrieveDebugAttribute : デバッグ属性の検索
というAPIが存在していて
パラメータは
1 Debug attribute Input Char(10) 2 Attribute value Output Char(10) 3 Error code I/O Char(*)
最初のパラメータに *OPMSRC と入力して問い合わせると
ソース・デバッグとしてコンパイルされていたOPMであれば
属性の結果として*YESという文字列がこのAPIから戻される。
ただしこのAPIはデバッグ・モードのときにのみ判定が可能なので
このAPIを使う前にデバッグを開始しなければならない。
判定のためだけにデバッグ・モードを開始するのであるから
ソースは表示されないように DSPMODSRC(*NO)を指定して
デバッグを開始する必要がある。
この処理をまとめると次のような簡単なプログラムで
OPMプログラムのソース・デバッグを判定することができる。
[ CLP: TESTSRC2 ]
ソースはこちらから
0001.00 PGM
0002.00 DCL VAR(&ATTR) TYPE(*CHAR) LEN(10)
0003.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0004.00 VALUE(X'0000007400000000') /* 2 進数 */
0005.00
0006.00 STRDBG PGM(CHAO.COM/QSYSOPRCL) UPDPROD(*YES) +
0007.00 OPMSRC(*YES) DSPMODSRC(*NO)
0008.00 CALLPRC PRC('QteRetrieveDebugAttribute') +
0009.00 PARM(('*OPMSRC ') (&ATTR) (&APIERR))
0010.00 ENDDBG
0011.00 SNDPGMMSG MSG('ATTR=' *CAT &ATTR) MSGTYPE(*DIAG)
0012.00 ENDPGM
CRTBNDCL PGM(OBJLIB/TESTSRC2) SRCFILE(SRCLIB/QCLSRC) OPTION(*SRCDBG) AUT(*ALL)
[解説]
内容は既に上記で解説したとおりである。
API: QteRetrieveDebugAttribute はサービス・プログラムのプロシージャーとして公開されているので
このCLPもソース・タイプはCLPではなくCLLEとして作成すること。
そしてコンパイルもCRTCLPGM ではなく CRTBNDCL によってコンパイルする。
結果をAIに教えてやるとAIもサンプル・ソースを一生懸命に作ってみせたが
デバッグ・モードを開始するのを忘れていたためにそれでは動作しないと
注意してやった。
このようにAIの能力はまだまだである。
AIというと神さまのように何でもできると思っている人が多いが
そのように信じている人はAIを使ったことがない人か
高度なことをAIに相談したことのない人である。
このサイトで紹介しているテクニックはまだまだAIでは解けない問題ばかりである。
OPMのデバッグ・モードを判定したいという要求は一般IBMユーザーではないだろうと
思われるがこのようなAPIの使い方もあるということで紹介したような次第である。
