「メモリダンプ解析ユーティリティ」を使用して、原因調査する。
- ●APのアボートダンプ
-
メモリダンプ解析ユーティリティを使用して、ダメなプログラムがエラーになった原因を調査してみましょう。
いろいろなファイルは以下の場所に入っているものとします。
- ・アボートダンプファイル
-
装置名:FDU000
ファイル名:ABORTDMP
- ・ダメなプログラム
-
装置名:MSD002
ファイル名:TESTAPLML
ロードモジュール名:ABORTT
メモリダンプ解析ユーティリティ(#ABANA)を起動します。
起動すると、最初に以下のような画面になります。
アボートダンプの自動解析とデータ部の自動解析の2段階になっています。まずはアボートダンプの自動解析のためのパラメータ入力です。
MDDにはアボートダンプファイルの入っている装置の名前、MDFにはアボートダンプの名前を入れます。
今回の例では、MDDに「FDU000」、MDFには「ABORTDMP」と入力します。
ユーティリティがアボートダンプの中身を調べて、画面下にファイルの中身の情報を出力します。以下の例では、平成17年3月18日17:03に取ったABORTTのアボートダンプだと出力されています。
ユーティリティがアボートダンプの中身を解析するためには、ダメプログラムを参照する必要があります。
そのために、ダメプログラムがどこにあるかを入力します。
LMDに「MSD002」、LMFに「TESTAPLML」、LMNに「ABORTT」と入力します。
作業用のファイルと出力先プリンタを指定します。この例では作業ファイルに一時ファイルを使用していますが、安全を考えると作業ファイルを作成して、それを使用するのが良いでしょう。
以上まで入力すると、アボートダンプの自動解析を行います。場合によっては、ちょっと時間がかかるかもしれません。
もし「デバッグ情報がありません」というエラーメッセージが画面に出たら、それはダメプログラム「ABORTT」をコンパイルする時にデバッグ用のオプションを指定していなかったからです。このときはコンパイルから作業やり直すか、LMDパラメータに「NO」を指定してアボートダンプの中身をそのまま出力するしかありません。
で、アボートダンプの自動解析が終了すると、引き続きデータ部の自動解析のためのパラメータの入力になります。
どのCUのデータ部を対象とするか、コンパイルした時のCU名を入力します。全部のCUを対象とするならば、CUNに「!」を入力します。
データ部の出力形式を指定します。今回はあえて「BOTH」にしてみました。「BOTH」は文字形式と16進形式の両方で表示されます。「BOTH」だと情報がたくさん出すぎで見難いかもしれません。普通はALPHAで問題ありません。
すると、下のような情報をプリントアウトしてくれます。
「*** LINE ANALYZE ***」がアボートダンプの自動解析部分、「*** DATA ANALYZE ***」がデータ部の自動解析部分です。
- ●自動解析結果の見方
-
・アボートダンプ解析部分
「ERROR STATUS:」にエラーの原因が出ます。なんとなく英語ですが、たぶん「添字/指標の限界を超えています」という意味です。
「CU NAME:」がエラーになったCU名です。それに対応するソースを探しましょう。
「GENERATE LINE NO.:」がエラーになった行番号です。
今回の例では、ABORTTのソースの32行目で添字/指標の値が変になっているということがわかります。
・データ部解析部分
使用している変数のアボート時の値が出力されます。
出力値をBOTHにしてしまったので見難いですが、例えばDATA2にはアボート時には「ABCD」という値が入っていたことがわかります。
DATA4には初期値も何も入れていないので、INVALID DECIMAL DATAという警告が出ています。
エラーになった行で使用している変数の値を調べて、変な値になっている変数を探し、ソースを遡ってどこで変な値になったか調べます。
A-VX4 REL. 5.51 #ABANA REV. I301 PROGRAM: ABORTT REV. 0004 DATE: 17/03/18 TIME: 19:42:04 PAGE: 0001 *** LINE ANALYZE *** ERROR STATUS: E C1302: (LIN=LLLLL) SUBSCRIPTING/INDEXING OUT OF RANGE CU NAME: ABORTT SECTION NO.: 0 GENERATE LINE NO.: 32 RELETIVE LINE NO.: 32 *** DATA ANALYZE *** CU NAME: ABORTT ANALYZE RANGE: ALL OUTPUT FORM: BOTH GLINE RLINE LEVEL NAME/OCC-NO. PIC/OCC-NO. USAGE CONTENTS * WORKING-STORAGE SECTION * 11 11 01 DATA1 9(02) DISPLAY 70 FF 70 12 12 01 DATA2 X(00008) DISPLAY ABCD CCCC4444 12340000 13 13 01 TAB 14 14 02 DATA3 ( 1) I 7 FFFFFC 000070 15 15 05 DATA4 9(02) DISPLAY 44 * INVALID DECIMAL DATA * 00 14 14 02 DATA3 ( 2) I 7 FFFFFC 000070 15 15 05 DATA4 9(02) DISPLAY 44 * INVALID DECIMAL DATA * 00 14 14 02 DATA3 ( 3) I 7 FFFFFC 000070 15 15 05 DATA4 9(02) DISPLAY 44 * INVALID DECIMAL DATA * 00 * SCREEN SECTION * 17 17 SD GAMEN 17 17 01 FILLER 18 18 02 ENDSTS X(00002) DISPLAY 00 FF 00 18 18 02 FILLER 9(02) DISPLAY 10 FF 10 18 18 02 FILLER 9(02) DISPLAY 15 FF 15 18 18 02 FILLER 9(04) DISPLAY 0 FFFF 0000 18 18 02 FILLER X(00025) DISPLAY 4444444444444444444444444 0000000000000000000000000 18 18 02 FILLER X(00002) DISPLAY 44 00 19 19 01 TEST1-ACT 20 20 05 SD.0001 21 21 10 SD.0002 9(02) DISPLAY 70 FF 70 22 22 01 TEST1-DSP 23 23 05 SD.0003 24 24 10 SD.0004 X(00010) DISPLAY DATA(9) CCEC4F5444 4131D9D000
自動解析といっても、基本的に20年ぐらい前の機能なので、過大な期待は持たないように。