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