解析のためのリストなどを印刷出力するように
していいるが常に印刷出力するのではなく
デバッグ・モードで実行されたときだけに
印刷するようにしたい。
_
通常はパフォーマンス改善のために
リリースモードで実行しているときは
出力したくない場合がある。
このような機能を作るためには実行時に
デバッグ・モードで実行されているのか
それともリリース・モードで実行されているのかを
調べる必要がある。
そこで現在実行中のジョブがデバッグ・モードであるのかを
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で使用している実例がないので
初めて紹介するような次第である。
_
弊社の最近の製品ではこの手法を良く使用している。
開発中の場合はデバッグ・モードで実行すれば必要な情報が
印刷出力されるので解析することができる。
客先に製品をリリースした場合は不要なデバッグ・リストは
出力されなくてパフォーマンスも改善されるという具合である。