【入門編】CEE3DMPによるランタイムダンプの構造解析 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの世界へようこそ。JavaやCOBOLという素晴らしい言語を知っている皆さんが、この少しばかり「古風で頑固な」PL/Iという言語に触れることになったのは、何かの縁かもしれません。

今日は、PL/Iエンジニアにとっての「最後の砦」、CEE3DMPによるランタイムダンプの読み解き方についてお話しします。システムが異常終了したとき、真っ黒なログの中に吐き出される膨大なダンプ……。初めて見ると「呪文か何かかな?」と思うかもしれませんが、実はこれ、システムが「どこで、なぜ倒れたのか」を懸命に訴えているラブレターのようなものなんです。

1. そもそも、PL/Iの「基本の形」を知る

ダンプを読む前に、まずはPL/Iがどういう顔をしているか確認しましょう。

1
/ メインプログラムの基本構造 /
MYPROG: PACKAGE OPTIONS(MAIN);

/ 外部から見える手続きの宣言 /
CALC_PROCESS: PROCEDURE OPTIONS(MAIN);

/ 変数宣言:ここがPL/Iの面白いところ /
DCL TOTAL_AMT FIXED DEC(15, 2) INIT(0); / 金額計算用の固定小数点数 /
DCL ERR_FLG BIT(1) INIT(‘0’B); / 0か1のみ保持するビット型 /

/ 処理開始 /
TOTAL_AMT = 1000.50;

/ 万が一の異常終了時、ここでCEE3DMPを呼ぶ準備をしておく /

END CALC_PROCESS;

END MYPROG;

PL/Iの変数宣言(DCL: Declare)は、COBOLのように「PICTURE」と書く代わりに、`FIXED DEC`(固定小数点)や`CHAR(n)`(文字列)など、数学的かつ直感的な型指定をします。`BIT(1)`などは、いかにもハードウェアに近い言語らしくて格好いいですよね。

2. 恐怖のランタイムダンプ:CEE3DMPの構造

プログラムが異常終了すると、Language Environment (LE) が気を利かせて「CEE3DMP」というダンプファイルを生成してくれます。これが「何が起きたか」を記したカルテです。

ダンプを読み解く際、見るべきポイントは大きく分けて3つだけです。

① スタックトレース(どこで迷子になったか)

ダンプの冒頭にある「Traceback」セクションを見てください。ここには、プログラムが終了した瞬間の「呼び出し履歴」が時系列で並んでいます。

  • 一番上の行: 今まさにエラーが発生した場所。
  • 2行目以降: その関数を呼んだ親関数、さらにその親……という風に遡れます。

「どこで止まったか」ではなく「どこから来た道が間違っていたか」を追うのが、トラブルシュートのコツです。

② レジスタ情報(CPUの脳内)

「Registers at time of interrupt」と書かれた箇所です。ここには、CPUが最後に保持していたメモリアドレスが羅列されています。
Javaエンジニアの方には「ポインタの亡霊」のように見えるかもしれませんが、メインフレームでは、このアドレスが指す先に「どんなデータが入っていたか」を確認するために使います。ここが壊れていると、計算結果が予期せぬ値になるのです。

③ 変数ダンプ(犯人の特定)

「Storage」セクションを探してください。ここでは、あなたの書いた変数がメモリ上でどう並んでいるかが見えます。
PL/Iの変数は、宣言した順番通りにメモリに配置されることがほとんどです。もし計算結果がおかしいなら、その変数の直前にある変数がメモリ破壊(オーバーフロー)を起こしていないか確認しましょう。

3. 実践!ダンプを読み解くための「現場の知恵」

ダンプを恐れる必要はありません。現場でよく使う「お守り」のようなテクニックを一つご紹介します。

1
/ ダンプを意図的に出力させるヒント /
CALL CEE3DMP(‘DEBUG_DUMP’, ‘BLOCKS,VARIABLES’, FC);

プログラムの中で、怪しい処理の直後にこのコードを仕込んでみてください。`’BLOCKS,VARIABLES’`というオプションを渡すと、LEはメモリの状態と変数の値を丁寧に書き出してくれます。

初学者が陥りやすい「罠」

PL/Iでよくあるのが、`FIXED BIN`と`FIXED DEC`の混同です。

  • FIXED BIN: コンピュータが計算しやすい「2進数」。高速だけど桁数管理に注意が必要。
  • FIXED DEC: 人間が読みやすい「10進数」。金額計算の定番。

ダンプを見て「値が全然違う!」と思ったら、この型の定義と、実際にメモリに入っている値のズレを確認してみてください。メインフレームのメモリは、人間が見ている「10進数の世界」と、コンピュータが計算する「2進数の世界」の架け橋を、PL/Iという言語が必死に繋いでいる場所なのです。

最後に:怖がらなくて大丈夫です

PL/Iのダンプを読む作業は、まるで考古学者が土の中から破片を掘り出して、元の壺の形を想像する作業に似ています。

最初は真っ黒な文字の羅列に見えるかもしれませんが、一つひとつ「これはあの変数だな」「これはこの処理のスタックだな」と紐解いていけば、必ず犯人は見つかります。システムは決して嘘をつきません。

もしダンプを見て「これはどうしても分からない!」と行き詰まったら、いつでも戻ってきてください。私たちはこうして、何十年も前からこの古いけれど頼もしい言語と対話してきたのですから。

それでは、良いメインフレームライフを!

タイトルとURLをコピーしました