03.Fault Analyzerによるダンプ解析:リアルタイム分析レポート②

EVENT DETAILSセクション

SUMMARYセクションで示されたABENDに関連するイベントの詳細情報が出力されます。セクション内ではイベントに対応して<H2>見出しで示され、イベントに関連するソース・コード、データ領域、機械命令コード、PSWと汎用レジスターなどが出力されます(出力項目はイベント内容に応じて変わる)。また、関連する記憶域内容があれば<H3> Associated Storage Areas見出しで出力されます。

EVENT DETAILSでABEND関連イベントのより詳細な具体的な問題判別情報を参照することができます。プログラム内でエラーを起こしている【ABENDS0C4の例】では、イベントは1つしかないので見るところも「<H2> EVENT 1 OF 1: ABEND S0C4」の部分だけです。「Assembler Source Code:」の部分に、エラーを起こした命令と前後5命令のソースコードが出ています。エラーになった命令はSYNOPSISセクションで判明していますが、EVENT DETAILSでは前後の命令も含まれるのでロジックの流れも確認できます。加えて、エラー起こした命令の機械コードとオペランド・アドレスや内容、PSW内容及び汎用レジスターの内容も出力されています。何故そのようなエラーを起こしたのかを追求するには、命令を実行した際の汎用レジスターと記憶域内容の確認は必須です。レジスターやメモリーの内容は正しいのか?意図した通りなのか?、そうでなければ何故そうなってしまっているのか?どこで誤った値を設定しているのかといった事などをエラー起こした命令から遡って調べて行きます。

【ABENDSD23の例】ではABENDに関連するイベントは2つですが、着目すべきは1つ目の「<H2> EVENT 1 OF 2: SUPERVISOR CALL (SVC 35)」の部分です。エラーにされたSVC命令は「Assembler Source Code:」の部分、アセンブリー・リストの120行目にあるWTOマクロの中で展開されています。エラーはこのWTOマクロの延長で起きたことがわかります。WTOマクロのパラメーターとしてTEXT=(6)とMF=(E,WTOPARM)が指定されていますが、レジスター6番とWTOPARM領域のアドレスや内容が正しいかを確認します。
最初のSYNOPSISセクションには、ABENDコードSD23に加え理由コードX’5010003’が示されています。システム・コード(ABENDコード)のマニュアルでこの理由コードの意味と対処を調べます(*1)。マニュアルには、理由コードの下位バイトx0003は「呼び出し側が渡したパラメーター・リストは、呼び出し側がアクセスできるストレージに置かれていない」ということが記されています。従って、レジスター6番が示すメッセージ・テキスト領域かWTOPARM領域のどちらかが誤っていることがわかります。
WTOマクロの展開内容を見ると、SVC 35命令を出す前にWTOPARM領域のアドレスをレジスター1に入れた後に、いくつかの命令でWTOPARM領域をアクセスしています。アクセス出来ていたのですからWTOPARM領域のアドレスは正しかったと考えられます。「General Purpose Registers:」の部分に出ている、レジスター1について見てみると、16進のアドレス値と共に (Module GO CSECT MAINRTN + X’30C’, statement # 216) という説明が出ています。アセンブリー・リスト上のステートメント番号216で定義されたプログラム内の領域なので、WTOPARM領域のアドレスには問題が無いことがわかります。そうなれば残りはレジスター6番だけです。レジスター6については、16進の値と共に (Storage invalid) の説明が出ています。ABEND SD23になった原因は、レジスター6番に格納したメッセージ・テキスト領域のアドレスが誤っていたからであることがわかります。この後は、何故レジスター6にそのような誤ったアドレス値を設定してしまっているのかをプログラム・コードを読んで調べて行きます。ここまで来ればダンプをどのように見ればよいのかではなく、プログラム・ロジックの調査です。


*1 分析リストの後方、「<H2> EVENT 2 OF 2: ABEND SD23」の「<H3> Abend Code SD23-X’5010003′ Explanation」にも英文でのABENDコードと理由コードの解説が出ている。

EVENT DETAILSセクションでは、エラーイベントに関連する変数や定数領域の内容は「<H3> Associated Storage Areas」として出力されます。命令が参照している記憶域の位置や内容がソース・コードのように参照できます。

「<H3> Associated Storage Areas」に「See “System-Wide Information” – “Storage Areas” – “Hex-Dumped Storage” for unformatted storage areas related to this event.」と出ていることがあります。その場合は、次の「<H1> S Y S T E M – W I D E I N F O R M A T I O N」セクションの「<H2> STORAGE AREAS」を参照します。記憶域内容が特定のイベントに関連付けられなかった場合などは、「<H2> STORAGE AREAS」の部分に汎用レジスターの内容に基づいた記憶域ダンプが出力されます。

たいていのケースであれば、最初の「SYNOPSISセクション」からここ迄の「EVENT DETAILSセクション」のレポート内容で異常終了を引き起こした命令の場所やエラーの理由はわかるでしょう。しかしながら、Fault Analyzerであれ自らのダンプ解析であれ、機械的に答えが出るのはここ迄です。デバッグに於いて重要なのはここから先に行うことになる、プログラム・ロジック、アプリケーション論理の解読や追跡に関してはプログラマー自らが行うことになります。