アセンブラー・プログラミングをする上で避けて通れないのがダンプ・リストの解析です。z/OS(MVS)には、プログラムが実行中に異常終了すると、その原因を判別するための診断資料としてプログラムに関連する仮想記憶域をダンプして出力する機能があります。出力されたダンプ・リストを解析することで、異常終了や誤動作の原因を知るための大きな手がかりを得ることができます。
とは言え、実際にダンプ・リストを解析するには単にリストの見方だけではなく、z/OSやプログラムが利用しているコンポーネントのプログラミング・サービスについての知識や経験も必要です。しかしながら、今日のz/OSシステムはある意味「枯れて」しまっているため、実務を通してダンプ解析のスキルや経験を積む機会にも恵まれません。「Fault Analyzer」は、ダンプ解析のスキルや経験を補完して異常終了時のプログラムの状態、どこでエラーが起きたのか、その際のレジスターやメモリーの内容がどうであったのかなどを具体的に示してくれます。ダンプ解析のアドバイザーとして活用できます。
Fault Analyzerのリアルタイム分析レポート
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
******************************************************************************** * IBM Fault Analyzer for z/OS V14R1M21 (UI94052 2023/10/17) * * * * Copyright IBM Corp. 2000, 2017. All rights reserved. * * Copyright HCL Technologies Ltd 2017, 2023. All rights reserved. * ******************************************************************************** JOBNAME: Zxxxxx@A SYSTEM ABEND: 0C7 S0W1 2024/04/07 00:04:10 <H1> S Y N O P S I S A system abend 0C7 reason code X'0' occurred in module GO CSECT MAINENTR at offset X'B4'. 【ABENDコードS0C7で異常終了したことを示すガイド・メッセージ】 A program-interruption code 0007 (Data Exception) is associated with this abend and indicates that: A decimal digit or sign was invalid. The cause of the failure was module GO CSECT MAINENTR. The Assembler source code that immediately preceded the failure was: List Stmt # ------ 000057 CVB R1,DWORD CONVERT IT TO PACKED-DECIMAL 【ABENDを引き起こした命令を示すガイド・メッセージ】 The Assembler source code for data fields involved in the failure: List Stmt # ------ 000106 DWORD DC D'0' X0000000000000000 【ABENDを引き起こした命令がアクセスしたデータ領域を示すガイド・メッセージ】 Data field values at time of abend: DWORD = X'0000303900001A85' (Address 00007E88 = R12 + X'110') 【ABENDした時のデータ領域内容を示すガイド・メッセージ】 : : : <H1> E V E N T D E T A I L S ================================================================================ <H2> EVENT 1 OF 1: ABEND S0C7 ******************************************************************************** *********************** P O I N T O F F A I L U R E ********************** ******************************************************************************** Abend Code. . . . . . . . . : S0C7-X'0' Program-Interruption Code . : 0007 (Data Exception) A decimal digit or sign was invalid. Assembler Source Code: List Stmt # ------ -5 L R0,FWORD1 LOAD FWORD1 -4 ST R0,DWORD STORE IT INTO DWORD -3 LH R1,HWORD1 LOAD HWORD1 -2 ST R1,DWORD+4 STORE IT INTO DWORD+4 -1 LH R1,HWORD2 LOAD HWORD2 000057 CVB R1,DWORD CONVERT IT TO PACKED-DECIMAL +1 MVC WORKAREA(10),CHAR2 MOVE CHAR2 TO WORKAREA +2 SLR R14,R14 CLEAR WORKREG +3 LA R15,5 LOAD LOOP COUNT +4 LOOP DS 0H +5 AHI R14,+1 INCREMENT R14 【ABENDを引き起こした命令のソースコード内の位置を示す部分】 Data Field Declarations: List Stmt # ------ 000106 DWORD DC D'0' X0000000000000000 Data Field Values: DWORD = X'0000303900001A85' (Address 00007E88 = R12 + X'110') : : : |
Fault Analyzerがアクティブであれば、プログラムが異常終了した際にリアルタイム分析が行われて分析結果がレポートとして出力されます。レポートのDD名はIDIREPRTです(JCLに定義されていなければSYSOUTが動的割り振りされる)。上記サンプル・レポート内で【】で囲んだ解説文の箇所が、エラー内容やエラー(ABEND)を引き起こした命令と関連データ領域を示します。
エラーを起こしたのは、アセンブリー・リスト上のステートメント番号57のCVB命令で、理由はDWORD領域の内容が正しい10進数でないからであることがわかります。X’0000303900001A85’と16進数が格納されてしまっています。Fault Analyzerが出来ることはここまでです。何故DWORD領域にX’0000303900001A85’が格納されてしまったか迄はわかりません。それについては、プログラマーがプログラム・コードを調べて原因を突き止める必要があります。
Fault Analyzerのリアルタイム分析機能は、ABEND発生時のダンプ出力をインターセプトしてプログラムのアセンブリー・リストと照らし合わせてエラーとなった命令や関連データ領域を示してくれます。プログラムのアセンブル時に、ロード・モジュールとは別にADATAと呼ばれるサイドファイルを生成して保管しておき、実行時にそのサイドファイル・ライブラリーをJCLで定義しておけばFault Analyzerによって読み込まれます。サイドファイルが無くてもリアルタイム分析は行われますが、サイドファイルを生成しておけばソース・コードによってエラー箇所や関連データが示されるので、アセンブラー・プログラミングやダンプ解析に慣れていなくてもデバッグ効率が上がります。なお、Fault Analyzerに相当する分析ツールは昔からありました。有名なものとしてAbend-AIDというベンダー製品があります。