ダンプリスト解析入門③

By 神居 - Posted: 2012/09/08 Last updated: 2012/09/08 - Leave a Comment

ダンプリスト解析入門③:ABENDの原因を調べる&#9312

モジュール内のどこでプログラムがABENDしたのかが特定できたら、エラーの原因を究明していきます。まずはABENDコードによってABENDさせられた直接の理由を確認します。その後で、どうしてそのようなエラーを引き起こしたのか、という原因を調べていきます。


ABENDコード

ABENDコードは、プログラムの異常終了の理由を示しますもので、大きくシステムABENDコードとユーザーABENDコードに大別されます。ユーザーABENDコードは「Unnnn(nnnnは0から4095の10進数)」の形式で、ABENDマクロを発行したユーザー・プログラムで指定した値です。ユーザーABENDは、入力データなどに誤りがあった場合、想定していないデータが渡されたような場合、そのまま処理しては正しい結果を出すことができないことをユーザー・プログラム自らが検知して、プログラムの処理をキャンセルするような場合に使用されます。
ユーザーABENDの場合のABENDコードは、ユーザー・プログラムの仕様によって決まるので、エラーの原因や対処方法などは、ユーザー・プログラムのマニュアルなどで明記されます。ユーザー自らが作ったアプリケーション・プログラムではなく、メーカーのPP製品やベンダーのISV製品などでは、それらの製品のマニュアルにABENDコードの意味や対処方法が記載されています。

システムABENDコードは「Sxxx(xxxは001からFFFの16進数)」の形式で、OSが割り当てたコードです。システムABENDは、プログラムのエラーを検知したOSによって強制的にABENDさせられるものです。その原因には、プログラムのバグもありますが、入出力エラーやハードウェア・エラーなど、アプリケーション・プログラムのせいではないものもあります。
システムABENDの場合のABENDコードは、システム・コードあるいはメッセージのマニュアルなどにコードの意味や対処方法が解説されています。



レジスター

レジスター(ここでは汎用レジスターを指す)の内容は、ABEND原因を調べる上でとても重要です。特にS0C4やS0C7といったアドレスを指定してメモリーにアクセスしたり、演算を行ったりする命令でABENDした場合は、命令が指しているレジスターの内容は重要です。また、誤ったアドレスに分岐してしまったような場合も、レジスターの内容は、プログラムがABENDに至るまで処理がどこまで行われていたのかをトレースする重要な手がかりにもなります。

ABEND時のレジスター内容は、徴候(SYMPTOM)ダンプに表示されます。あるいは、ダンプリストのレジスター表示部「REGS AT ENTRY TO ABEND」(MVSのダンプでは、「REGS AT ENTRY TO ABEND」または「GPR VALUES」と表示されている)に出力されています。しかしSVCルーチンの中でABENDしたような場合、徴候ダンプやダンプリストのレジスター表示部は、実際にABENDを起こした時点のレジスター内容なので、アプリケーション・プログラムがマクロ命令などを発行した後のOS側の処理で内容が変わってしまっています。PSWでABEND箇所を特定した時と同様に、ABEND時点ではなく最後に割込みを起こした時点のレジスター内容を求める必要が出てくることがあります。
マクロ命令発行によるSVC呼び出しの場合、アプリケーション・プログラムが最後に起こした割込みはSVC割込みとなり、SVC命令を実行した時点(最後に割込みを起こした時点)のレジスター内容は、PSWが保管されているPRBの次に表示されているSVRB内に退避されています。

自分のプログラム内でABENDしたのであれば、PSWもレジスター内容も徴候(SYMPTOM)ダンプに表示されているもので、アセンブル・リストとダンプリストのメモリー内容を照らし合わせればいいのですが、自分のプログラム外で(例えば発行したマクロの延長で呼ばれるSVCルーチンなど)のABENDであれば、単に徴候ダンプの内容だけではなく、ダンプリストのPRBとSVRBから自分のプログラムが最後に起こした割込み(SVCの発行)時点のPSWとレジスターを求めて、アセンブル・リストとダンプリストのメモリー内容を照らし合わせます。もちろん、SVCルーチンの処理エラーなどABENDコードのマニュアルで原因が判明できるのであれば、対応するプログラム・コードを見直して正しく修正すればいいのです。

Posted in ダンプ解析入門 • • Top Of Page