AS400 MCH3601の確認ポイント|RPGのポインター・配列・CALLパラメーターを疑う

MCH3601は、参照した場所に対するポインターが設定されていないことを示すメッセージです。直接使用したポインターや、データを参照する基底ポインターを確認します。RPG/CLのCALLでは、必要なパラメーターを渡していない場合も調査対象です。IBM公式のメッセージ説明も参照してください。

この記事では、MCH3601を見た時の初動確認を、AS400保守現場の目線で整理します。最後の異常終了だけでなく、直前のCALL、RPGソース、パラメーター、ジョブログの前後関係を確認します。

MCH3601で最初に見る場所

  • ジョブログでMCH3601の直前に出ているメッセージ
  • 異常終了したプログラム名とモジュール名
  • RPGの該当ステートメント、配列、データ構造、ポインター
  • CALLやCALLPのパラメーター数、桁数、型の不一致
  • 直近で変更したソース、コピー句、ファイル定義

RPG修正後に出た場合

RPG修正後にMCH3601が出た場合は、まず変更箇所だけでなく、呼び出し元と呼び出し先のパラメーター定義を比べます。桁数、符号、小数点、文字長、配列要素数、データ構造のサブフィールドがずれると、実行時に例外になることがあります。

固定形式RPGの場合は、見た目では桁位置のずれに気づきにくいことがあります。コンパイルリスト、ソース行、DSPPGMREF、DSPFFDを合わせて確認し、必要なら一つ前の正常版と差分を見ます。

Web化・API化で出た場合

5250画面では動いていた処理をWebやAPIから呼び出してMCH3601が出た場合も、最初は発生ステートメントが参照したポインターと、呼出先へ実際に渡されたパラメーターを確認します。API側の受渡し定義とRPG側の個数・型・長さ、未指定時の扱い、初期化順を照合し、対話実行との差を記録します。

対話ジョブとサーバージョブのライブラリリスト、ユーザー、QTEMP、初期化処理の違いは、実際に呼ばれたプログラムやデータ準備へ影響していないかを後から照合します。環境差があること自体をMCH3601の原因とは断定しません。Web化の入口は AS400連携とは にまとめています。

AIで調査メモを整理する時

MCH3601の調査にAIやCodexを使う場合は、利用するサービスへのソースやログの送信が契約・社内規程で許可されているかを先に確認します。許可された範囲でも機密情報を除き、最小限のジョブログ、該当ソース、CALL関係、パラメーター定義を分けて整理します。AIの回答は原因確定ではなく、確認観点の洗い出しとして扱います。

AI・Codexの安全な使い方は RPGソースをAIに渡す前の機密情報・利用条件確認、メッセージID全体の入口は AS400メッセージID・エラーコード索引、RPGの読み方は RPG固定形式・フリーフォーマットの読み方 を確認してください。

発生条件から確認先を絞る例

MCH3601では、実際に参照したポインターや渡されていないパラメーターを、発生ステートメントと対応付けて確認します。以下は原因候補を絞るための例です。配列添字や桁数の不一致は別の例外にもなるため、MCH3601という番号だけで原因を確定しません。

症状 疑うこと 確認するもの
修正後だけ落ちる CALLパラメーターの桁・型・個数違い 呼び出し元/先の定義、コンパイル日時
特定データだけ落ちる その分岐でだけ使う未設定ポインター、渡されていないパラメーター 発生ステートメント、入力条件、CALL元とCALL先の定義。ゼロ除算など別種の例外と混同しない
API経由だけ落ちる 未渡しパラメーターやポインター初期化の違い 発生行、APIとRPGの受渡し定義、実際の値・個数。必要に応じて実行環境差を照合する
原因行が追いにくい 直前メッセージを見落としている ジョブログを下から上へ戻って読む

ジョブログ全体の読み方は AS400ジョブログの読む順番、RPG/CLの影響確認は RPG/CL改修前の影響調査チェックリスト も合わせて確認してください。

参考:IBM公式ドキュメント(CALL)

本記事で扱った CALL の全パラメーターと指定できる値は、IBM公式ドキュメントで確認できます。指定できる値や既定値はOSリリースによって異なるため、本番環境では自社のリリースに合わせて確認してください。