レジスター・セーブエリア・トレース
異常終了時の徴候ダンプにはエラーを起こしたモジュール名が表示されます。JCL EXECステートメントのPGMパラメーターで指定されたモジュールやLOADあるいはLINKなど、スーパーバイザー経由でローディングされたモジュールについてはOSがローディング・アドレスとモジュールの長さを管理しているからです。プログラムが1つのセクション(CSECT)しか持たない場合や、複数のセクションで構成されていても各々のセクションが独立したロード・モジュールになっている動的構造プログラム(*1)であれば、徴候ダンプに表示されたモジュールが示すセクションでABENDしたことがわかります。
しかし、単純構造プログラムで複数のセクション(CSECT)がバインダーで結合されている場合、OSは結合されたモジュール全体は認識できますが、その中の個々のセクション(CSECT)までは管理しないので、ABEND時の徴候ダンプに表示されるモジュール名は結合されたモジュール名(*2)になります。その中のどれかのモジュールでABENDしたけれど、それがどのモジュールなのかはOSにはわかりません。
このような場合、ABENDした具体的なセクション(CSECT名)を特定するには、バインダーのリストによってプログラムを構成する各々のセクションのモジュール内におけるオフセット位置と徴候ダンプが示すオフセット位置を照らし合わせます。バインダーのリストが保存されていない場合は、AMBLISTユーティリティーのLISTLOAD機能でCSECTマップを出力しそれを参照します。
*2 例えば、EXECステートメントのPGMパラメーターに指定した名前。
1 2 3 4 5 6 7 8 9 |
SYSTEM COMPLETION CODE=0C4 REASON CODE=00000010 TIME=11.44.20 SEQ=00018 CPU=0000 ASID=0016 PSW AT TIME OF ERROR 078D0000 80007B02 ILC 4 INTC 10 ACTIVE LOAD MODULE ADDRESS=000078D8 OFFSET=0000022A NAME=TEMPNAM0 ~~~~~~~~ DATA AT PSW 00007AFC - D00C0B0E 07005810 10004800 GR 0: FD000008 1: 11111111 2: 22222222 3: 33333333 : |
1 2 3 4 5 6 7 8 9 10 |
*** M O D U L E M A P *** --------------- CLASS B_TEXT LENGTH = 20728 ATTRIBUTES = CAT, LOAD, RMODE= 24 OFFSET = 0 IN SEGMENT 001 ALIGN = DBLWORD --------------- SECTION CLASS ------- SOURCE -------- OFFSET OFFSET NAME TYPE LENGTH DDNAME SEQ MEMBER 0 MAINENTR CSECT 194 SYSLIN 01 **NULL** 198 SUBPGM01 * CSECT 590 SYSLIB 01 SUBPGM01 : |
ダンプ・リストだけで調査する場合は、レジスター・セーブエリア・トレース(SAトレース)を参照する方法があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
SYSTEM COMPLETION CODE=0C4 REASON CODE=00000010 TIME=11.44.20 SEQ=00018 CPU=0000 ASID=0016 PSW AT TIME OF ERROR 078D0000 80007B02 ILC 4 INTC 10 ACTIVE LOAD MODULE ADDRESS=000078D8 OFFSET=0000022A NAME=TEMPNAM0 ~~~~~~~~ DATA AT PSW 00007AFC - D00C0B0E 07005810 10004800 GR 0: FD000008 1: 11111111 2: 22222222 3: 33333333 : ダンプリストのレジスターセーブエリア・トレース表示部 SAVE AREA TRACE PROCEEDING FORWARD FROM TCBFSA NAME=TEMPNAM0 WAS ENTERED VIA LINK SA 00006F60 WD1 00000000 HSA 00000000 LSA 800078E8 RET 80FC8308 … R1 00006FF8 R2 00000040 R3 009D29D4 R4 009D29B0 … R7 FD000000 R8 009EC610 R9 009ECAE8 R10 00000000 … NAME=TEMPNAM0 WAS ENTERED VIA CALL SA 000078E8 WD1 FFFFFFFF HSA 00006F60 LSA 00007A70 RET 80007972 … R1 11111111 R2 22222222 R3 33333333 R4 44444444 … R7 77777777 R8 88888888 R9 99999999 R10 AAAAAAAA … NAME=UNKNOWN WAS ENTERED VIA CALL SA 00007A70 WD1 47F0F052 HSA 800078E8 LSA FFFFFFFF RET FFFFFFFF … R1 FFFFFFFF R2 FFFFFFFF R3 FFFFFFFF R4 FFFFFFFF … R7 FFFFFFFF R8 FFFFFFFF R9 FFFFFFFF R10 FFFFFFFF … INTERRUPT AT 80007B02 <=== ABEND発生アドレス PROCEEDING BACK VIA REG 13 <=== ABEND時のGR13が示すレジスター退避領域の内容 SA 00007A70 WD1 47F0F052 HSA 800078E8-+ LSA FFFFFFFF RET FFFFFFFF … R1 FFFFFFFF R2 FFFFFFFF I R3 FFFFFFFF R4 FFFFFFFF … R7 FFFFFFFF R8 FFFFFFFF I R9 FFFFFFFF R10 FFFFFFFF … NAME=TEMPNAM0 I WAS ENTERED VIA CALL I +---------------------------------+ V SA 000078E8 WD1 FFFFFFFF HSA 00006F60 LSA 00007A70 RET 80007972 EPA 00007A70 … R1 11111111 R2 22222222 R3 33333333 R4 44444444 R5 55555555 … R7 77777777 R8 88888888 R9 99999999 R10 AAAAAAAA R11 BBBBBBBB … |
複数のモジュールを静的にリンクしたプログラム・モジュールでも、バインダーやAMBLISTのCSECTマップ、ダンプ・リストのSAVE AREA TRACEなどからABENDしたセクション(CSECT)やそれを呼び出したモジュールを特定することができます。ABENDしたセクションやモジュールがわかれば、後はレジスターとメモリーの内容から原因を調査していきます。