「メインフレーム・コンピューター」で遊ぼうこんな時代に今さらメインフレーム・コンピューターに取り組むハメになったみんなが助けあうサイトです。RSSWordPress.orgコスパのいい社内システムの作り方メインフレームを扱っていると、軽い開発やメンテナンスにリソースを割けない、しかし、BPCも考えねば。解決策のひとつがクラウドにおくFileMakerです。Comment印刷用ページの表示ダンプリスト解析入門3: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コードは、システム・コードあるいはメッセージのマニュアルなどにコードの意味や対処方法が解説されています。S0CxS0Cxは、プログラム割込み(またはプログラム・チェック割込み)によるABENDです。プログラム割込みは、CPUの割込みの1つで、存在しない命令を実行しようとしたり、数値を0で割ろうとする(0除算)など演算不可能な計算をしたり、などといった場合に、CPUが命令の実行を抑止したことを通知するものです。MVS(MSP、VOS3)は、この割込みが発生すると、プログラム割込みルーチンによってエラー処理を行います。プログラム・エラーの原因は割込みコードによって通知されますが、これはS0CxABENDの理由を示します。0Cxのxと理由コード(プログラム割込みコード)は、ほとんどの場合同じですが、S0C4ABENDのように複数の理由で構成されるものもあります。同じS0C4ABENDでも、PSWキーと異なる領域にアクセスした記憶保護例外(理由コード4)と存在しないアドレスにアクセスした(理由コード10や11)では原因が異なります。:どちらもS0C4だが、上はINTC=4で記憶保護例外(仮想記憶として正しい領域であるがキーが異なるためアクセスできない)、下はINTC=11でページ変換例外(仮想アドレス自体が誤っている、存在しない仮想記憶域をアクセスしようとした)、とABENDの理由は異なっている。S0C4ABENDのように複数の理由を持つABENDコードでは、では割込みコードを確認することが正しいデバッグに繋がる。S0CxABENDは、ほとんどの場合プログラムのバグです。中には入力データが誤っていたため(例えば数値なのに文字列が入っていた)に、そのデータで演算命令を実行した結果、S0C7などを引き起こすこともあります。コーディング・ミスではありませんが、データの正当性をチェックしていれば防げる類のもので、プログラム・デザインの甘さに起因するもので、これらも広義のバグと言えるでしょう。S1xx、S2xx、S3xx、S4xx、S5xx、S6xx、S7xx、S8xx、S9xx、SAxx、SBxx...S100以上のコードの場合、システムABENDコードの下2桁は、エラーを検知したSVC処理のSVC番号を示します。S80AはSVC10でGETMAIN、S213はSVC19でOPENの各サービスでのエラーです。コードの下2桁がSVC番号ということは、覚えておくと便利です。ABENDコードを見れば、どのSVCがエラーになったかがわかるため、エラーの箇所や原因を特定しやすくなるからです。GETMAINやOPENなど、さまざまなマクロ命令がありますが、どのマクロが何番のSVCを出すかはアセンブル・リストを見ればわかります。1つのプログラム・モジュール内で何十ものマクロ命令を使うことなどほとんどありません。最初のうちは、アセンブルした後にリストを見て展開された命令列を確認したり、翻訳された命令コードを見ることで、自分がプログラムで書いたマクロがどのSVCを出すかなどはすぐに覚えるものです。発行したマクロの処理を行うSVC内でABENDするのは、ほとんどのケースが誤ったパラメーターでマクロを発行したことによります。いう意味でも多くはプログラムのバグ、ということになります。レジスターレジスター(ここでは汎用レジスターを指す)の内容は、ABEND原因を調べる上でとても重要です。S0C4やS0C7といったアドレスを指定してメモリーにアクセスしたり、演算を行ったりする命令でABENDした場合は、命令が指しているレジスターの内容は重要です。誤ったアドレスに分岐してしまったような場合も、レジスターの内容は、プログラムがABENDに至るまで処理がどこまで行われていたのかをトレースする重要な手がかりにもなります。ABEND時のレジスター内容は、徴候(SYMPTOM)ダンプに表示されます。VALUES」と表示されている)に出力されています。SVCルーチンの中でABENDしたような場合、徴候ダンプやダンプリストのレジスター表示部は、実際にABENDを起こした時点のレジスター内容なので、アプリケーション・プログラムがマクロ命令などを発行した後のOS側の処理で内容が変わってしまっています。PSWでABEND箇所を特定した時と同様に、ABEND時点ではなく最後に割込みを起こした時点のレジスター内容を求める必要が出てくることがあります。マクロ命令発行によるSVC呼び出しの場合、アプリケーション・プログラムが最後に起こした割込みはSVC割込みとなり、SVC命令を実行した時点(最後に割込みを起こした時点)のレジスター内容は、PSWが保管されているPRBの次に表示されているSVRB内に退避されています。00006F60PSWとレジスターは同じRB内に退避されるのではない。SVC命令実行(マクロ命令発行)の場合はPRBの次のSVRBにあるGPR表示部を見る。(xBF271001)が使用しているGR1の内容00500F78と酷似している。このことからSVC19発行時のGR1の値が、エラーを引き起こした要因と考えられる。自分のプログラム内でABENDしたのであれば、PSWもレジスター内容も徴候(SYMPTOM)ダンプに表示されているもので、アセンブル・リストとダンプリストのメモリー内容を照らし合わせればいいのですが、自分のプログラム外で(例えば発行したマクロの延長で呼ばれるSVCルーチンなど)のABENDであれば、単に徴候ダンプの内容だけではなく、ダンプリストのPRBとSVRBから自分のプログラムが最後に起こした割込み(SVCの発行)時点のPSWとレジスターを求めて、アセンブル・リストとダンプリストのメモリー内容を照らし合わせます。SVCルーチンの処理エラーなどABENDコードのマニュアルで原因が判明できるのであれば、対応するプログラム・コードを見直して正しく修正すればいいのです。