CL

189. OPMプログラムがソース・デバッグ可否を判定するには

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の使い方もあるということで紹介したような次第である。