RPG

487. RPGでDEBUGモードを検出するには

解析のためのリストなどを印刷出力するように
していいるが常に印刷出力するのではなく
デバッグ・モードで実行されたときだけに
印刷するようにしたい。
 _

通常はパフォーマンス改善のために
リリースモードで実行しているときは
出力したくない場合がある。
このような機能を作るためには実行時に
デバッグ・モードで実行されているのか
それともリリース・モードで実行されているのかを
調べる必要がある。
そこで現在実行中のジョブがデバッグ・モードであるのかを
RPGで検出できるようにする機能を製品に入れたので
読者でも使えるようにデバッグ・モードを検出する
プログラムを作ったのでここで紹介する。

[ TESTDBG : DEBUGモードを検出するプログラム ]

ソースはこちらから

0001.00 H DFTNAME(TESTDBG) DATEDIT(*YMD/) BNDDIR('QC2LE')                         
0002.00 F********** DEBUG モードを検出する ************************************   
0003.00 F*                                                                        
0004.00 F**********************************************************************   
0005.00                                                                           
0006.00  * CRTBNDRPG  OBJ(QRYLIB/TETSDBG  SRCFILE(R710SRC/QRPGLESRC)              
0007.00  * DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)                 
0008.00                                                                           
0009.00  *-------------------------------------------------------------------*    
0010.00  *  2024/04/20 : 作成                                                     
0011.00  *-------------------------------------------------------------------*    
0012.00  *( 作業変数 )                                                            
0013.00 D IsDebug         S              1N                                       
0014.00 D ATTR            S             10A                                       
0015.00                                                                           
0016.00 D RTVDBGATR       PR            10I 0 EXTPROC('QteRetrieveDebugAttribute')
0017.00 D  DBGJOB                         *   VALUE OPTIONS(*STRING)              
0018.00 D  ATTR                           *   VALUE OPTIONS(*STRING)              
0019.00 D  APIERR                             LIKEDS(QUSEC)                       
0020.00 D                                     OPTIONS(*VARSIZE)                   
0021.00                                                                           
0022.00 D APIERR          DS                                                      
0023.00 D  GETBYT                 1      4B 0 INZ(160)                            
0024.00 D  AVLBYT                 5      8B 0 INZ(0)                       
0025.00 D  MSGID                  9     15                                 
0026.00 D  MSGDTA                17    160                                 
0027.00                                                                    
0028.00 DQUSEC            DS                                               
0029.00 D QUSBPRV                 1      4B 0 INZ(8)                       
0030.00 D QUSBAVL                 5      8B 0 INZ(0)                       
0031.00                                                                    
0032.00 C                   IF        IsDebug = *ON                        
0033.00 C     'DEBUG is ON' DSPLY                   ANS               1    
0034.00 C                   ELSE                                           
0035.00 C     'DEBUG is OFF'DSPLY                   ANS               1    
0036.00 C                   ENDIF                                          
0037.00 C                   SETON                                        LR
0038.00 C******************************************************            
0039.00 C     *INZSR        BEGSR                                          
0040.00 C******************************************************            
0041.00 C*  初期 CYCLE のみの実行                                          
0042.00  /FREE                                                             
0043.00     RTVDBGATR('*DEBUGJOB ':ATTR:APIERR);                           
0044.00     IF AVLBYT > 0;                                                 
0045.00       IsDebug = *OFF;                                              
0046.00     ELSE;                                                          
0047.00       IsDebug = *ON;                                               
0048.00     ENDIF;                
0049.00 C                   ENDSR 


  

[解説]

デバッグ・モードで実行中のジョブには QTEDBGAG とう名前の
活動化グループが現れる。
活動化グループを検査するAPIはないので
活動化グループをRCLACTGRPで強制的に削除を試みる
手法があるがその方法は強引であると同時にスマートではない。
ここではデバッグ・モードの属性を取得するAPIを使って
属性の取得が失敗すれば現在はリリース・モードで実行されているものと
するという手法である。
C言語ではこの QteRetrieveDebugAttribute という長い名前のAPIを
使うのは簡単であるがRPGで使用している実例がないので
初めて紹介するような次第である。
 _

弊社の最近の製品ではこの手法を良く使用している。
開発中の場合はデバッグ・モードで実行すれば必要な情報が
印刷出力されるので解析することができる。
客先に製品をリリースした場合は不要なデバッグ・リストは
出力されなくてパフォーマンスも改善されるという具合である。