ABEND S0C4の調査
十中八九ミドルのバグです。
それでも原因を深く知りたいと思う人は、
まずはS0C4の意味を知ろうとするでしょう。
先頭のSはSYSTEM COMPLETION CODEの意味。
z/OS V1R12.0 MVS System Codes
これに載っている。
しかしこれだけ見てもちんぷんかんぷんだろう。
基本的な知識がかけている。
ざっくりいうと・・・
メモリは保護されている。
それに違反したからS04Cになった。
各4Kの先頭にそういうのを管理しているビットがある。
PSW Keyも関係している。
「おまえのPSW Keyじゃあ、おいらのビットに合わないから見させねーよ」
つまりはこんな感じだ。
ここにおいてあるPDFが非常に分かりやすいと思う
11794: z/OS Debugging: Everything You Need to Know to Shoot an 0C4
z/OS Basics: Virtual Storage Management (VSM) Overview
PSW Keyの意味はここに書いてある。
V=VとかV=Rが意味不明だろう。
Virtual=VirtualとVirtual=Realのことだと思うよ。
メモリの話で他にも見るべき資料はたくさんあるけど
かき集めるのがたいへんなので省略。
用語の整理として以下のことは頭にいれておいたほうがいい。
リアルなメモリの単位=フレーム
バーチャルなメモリの単位=ページ
補助記憶(ASM)のメモリの単位=スロット
メモリの保護に使用されるのは7ビット。
(末尾のReservedを含めて8ビット。)
これをストレージキー(Storage Key)という。
0-3 = access control bit これはPSW Keyと関係する部分
4 = fetch bit
5 = reference bit
6 = change bit
ストレージキーを見るためにこういうIPCSコマンドを使う
IP LIST address DISPLAY
もしくは
IP LIST address DISPLAY(MACHINE)
オプションなしのDISPLAYはこういうオプションと等価。
DISPLAY(MACHINE REMARK REQUEST STORAGE SYMBOL)
Storage Keyを見るのに必要なのはMACHINE。
だがしかし、どこのアドレスを見ればいいんだっけ?という話になる。
それはレジスタが関係してくる。
Failing Instructionが何で、そのInstructionはどこのレジスタを使っていたか。
まずはInstructionを特定せねばならない。
PSWにInstructionアドレスが載っている。
ここでREASON CODEに注意が必要。
あの資料だとICもしくはPICで説明している。
IC=4の時だけは、PSWはFailing Instructionを通り過ぎてるので、
すこし戻る必要がある。
そこで重要なのがInstructin Length。これは引数込みの長さです。
とは言ってもFailing Instruction textから問題のInstructionをさくっと特定できるなんてのはまずできない芸当。
IPCS LIST address I
もしくは
IPCS LIST address INSTRUCTION
を使うといい。
これでどのレジスタを使っているか分かる。
次にレジスタが指してるアドレスについて
IP LIST address DISPLAYを使えばいいわけだ。
PSW KeyとStorage Keyの両方を見比べる。
ついでにモジュールも特定しとく。
IP W address
アドレスはInstructionアドレスを使う。
これでモジュールとそのオフセットが分かったはず。
このコマンドで分からない場合もあるそうだ。
そんなことしなくてもモジュール分かってる場合もあるけど、
CIBHとか見ないといけない類はこんな感じで調べることになるんだと思う。
CIBHの話はこの資料をすこし齧るといい。
Language Environment presentations
このページの Diagnosing Application Problems Under Language Environment という資料。
ざっくりいうと例外ハンドリングのチェーンの根っこまで追いかける感じ。