RPG

73. CGI のディバッグ

「72. ILE-RPG の対話式ソース・ディバッグ」ではILE-RPG の対話式ディバッグの方法について

紹介した。それでは CGI のディバッグはどのようにすればよいのであろうか?

CGI のディバッグは一般のPGM のようにはいかない。

CGI は STRDBGコマンドを実行するユーザーのエミュレータ画面内で実行されるのではなく

別のJOB で実行されるからである。

これはバッチJOBのディバッグと同じである。

CGI はHTTPサーバーの配下のスレッドで実行されるので別のJOBをディバッグする方法を

考案しなければならない。

■ 一般のCGI のディバッグ

別のJOBをあたかも自分のJOBとしてディバッグするにはサービス・ジョブという手法が

必要になる。

しかしサービス・ジョブを使用するには実行されるJOBのJOB番号などの識別がわかって

いなければならない。

バッチJOBであれば投入して暫く待機させるようにしてからJOB番号などを調べることが

できるが CGI ではそうはいかない。HTTPサーバー配下のどのスレッドを使用するかを

決定するのはHTTPサーバーのみぞ知るということになるので、一般的に複数のスレッド

を抱えているHTTPサーバーでは、どのスレッドで実行されるのかを予め予測することが

できない。

そこで IBM HTTPサーバーであれば

  1. CHGHTTPA (HTTP属性の変更) で「サーバー・ジョブの最大数」を 1 に絞ってから

    HTTPサーバーを再起動する。

  2. WRKACTJOB によってサブ・システム QHTTPSVRのDEFAULTインスタンスの

    PGM-QZHBHTTP (これがHTTPサーバー) 以外のもうひとつのJOB番号などを控えておく。

  3. サービス・ジョブを開始する。(STRSRVJOB)

    STRSRVJOB JOB(xxxxx/xxxxx/xxxxxx) によって今、控えたJOBのサービス・ジョブを開始する。

  4. ディバッグを開始する。

    STRDBG MYLIB/MYPGM UPDPROD(*YES)

  5. ブラウザを起動して CGI を呼び出す URL を打鍵する。
  6. 対話式ソース・ディバッグが開始される。

■ EnterpriseServer による対話式ソース・ディバッグ

先のCGIディバッグの方法について、もう一度考慮してみよう。

先のディバッグの方法では HTTPサーバーの最大スレッド数を 1にしなければならないことが

最大の問題である。

容易に想像がつくようにこの方法は本番稼動後には行えない。

既にWebシステムが本稼動している場合ではスレッド数を1に絞るということは業務を停止

させるのと同じである。

またCGIはHTTPサーバーのひとつのスレッド内で同時に複数が併行して実行することは

できないので、これまた複数の開発者が同時にディバッグを行うことはできない。

誰かがディバッグ中であれば、別の開発者は前の人のディバッグが終了するまでは

待たされることになる。

従ってご紹介はしたものの、一般のCGI のディバッグは

  • 本稼動が開始されていないこと
  • ディバッグする開発担当は一人だけであること

という極めて現実的でない条件がついてしまう。

EnterpriseServer では各開発担当が各人のエミュレータ内でHTTPサーバーを

使わずに、PCOMM 上だけでディバッグ可能な「STRCGIDBG」というディバッグ用の

コマンドが既に Ver1.0 から提供されているが Ver3.0 ではILE-RPGの利点を生かした

対話式ソース・ディバッグ機能としてコマンド WTRWEBDBG が追加された。

これは

  • HTTPSVR 「ALASKA」の配下でディバッグJOB が本番と同じように実行される。
  • 本稼動中であっても本番用とは別のインスタンス PGMR を起動してその中で実行させることができる。
  • 複数スレッド、複数開発者が同時並行してディバッグが可能
  • ディバッグ処理が極めて簡単

というスグレモノである。

操作は至ってカンタンであり、HTTPサーバー ALASKAが起動されている状態で

STRWEBDBG MYLIB/MYPGM + [実行]

とするだけで上記の2〜6の処理が実行される。下記はその様子である。