この章では、FaultFinder ユーティリティについて説明します。
FaultFinder とは、プロダクションアプリケーションのデバッグを支援するユーティリティです。このユーティリティを使用すれば、アプリケーションが異常終了した場合の情報を、テキストベースの状態レポートとして取得できます。このレポートは、問題が発生したときのアプリケーションのスナップショットであり、開いていたファイルやファイルバッファ、ロードされていたプログラムなどの項目を特定することができます。
FaultFinder の動作は、実行時調整変数によって制御されます。FaultFinder を有効化するには、faultfind_level
実行時調整変数を正の整数に設定します。この変数の設定後にアプリケーションが異常終了すると、FaultFinder がランタイムシステムを介して自動的に起動し、レポートを生成します。レポートの詳細については、『FaultFinder のレポート』 の項を参照してください。
プログラム内で CBL_FFND_REPORT ライブラリルーチンを使用すれば、プログラム実行の任意のポイントで FaultFinder を起動することが可能です。このルーチンの詳細については、『ライブラリルーチン』 の章を参照してください。
FaultFinder はコマンド行からも起動できます。詳細については、『コマンド行からの起動』 の項を参照してください。
FaultFinder の動作と出力は、次に挙げる実行時調整変数で制御されます。
faultfind_level=n |
FaultFinder を有効化し、イベントのトレースを可能にします。n に指定できる値は 1024 以下の正の整数です。最新の n 件のイベントがトレースされます。デフォルト値は 0 です。 |
faultfind_outfile="[>>]filename" |
分析結果の出力先ファイルを指定します。filename に文字列、 %p を含めると、 FaultFinder
を起動したプログラムのプロセス ID に置き換えられます。デフォルトのファイル名は、現在の作業ディレクトリ内の ffnd_out.%p
です。>> を使用すると、出力内容が filename ファイルの末尾に追加されます。filename
ファイルが存在しない場合は、その名前で新しいファイルが作成されます。 |
faultfind_recsize="record_size " |
操作履歴ログの読み書きを記録する内部キャッシュのサイズを指定します。読み取りと書き出しは、すべて記録され、レポートに出力されます。この調整変数によってパフォーマンスを改善できる場合もあります。デフォルト値は 64 で、最大値は 1024 です。 |
この表で実行時調整変数の名前をクリックすると、該当する変数について詳しく説明している部分に移動できます。実行時調整変数の設定方法については、『Server Express ユーザガイド』 の 『実行時の構成』 の章を参照してください。
set faultfind_level=5 set faultfind_outfile="applflt.log" set faultfind_recsize=1024
FaultFinder のイベントトレースを有効化する (faultfind_level
環境時調整変数に 1 以上の値を指定する)
と、パフォーマンスへの影響が生じますが、この影響に気付くことはほとんどありません。トレースするイベント数の違いによるパフォーマンス差も大きくなく、イベントを
1 件だけトレースしても、1000 以上トレースする場合に比べ、格段にパフォーマンスが向上することはありません。イベントトレースを有効化した場合に、パフォーマンスに最も大きな影響を受けるのはファイル操作です。したがって、
FaultFinder では、ファイル操作のベンチマーク測定が最も注意すべき処理と言えます。ただし、その場合でも、パフォーマンスの低下率が 5% を超えることはありません。大部分のアプリケーションでは、ファイル操作は処理の一部にすぎないため、パフォーマンスへの影響も最小限に抑えられます。
ここでは FaultFinder をコマンド行から実行し、Server Express で開発した COBOL プログラムのレポートを生成する方法について説明します。なお、6.2 で説明されている実行時調整変数が設定され、プログラムが異常終了した場合は、faultfind_outifle で指定されたファイルに自動的に出力されるため、以下の操作を行う必要はありません。
コマンドの構文は次のとおりです。
cobffnd[_t] [options] pid1 [pid2 ]
パラメータの内容は、次のとおりです。
_t |
マルチスレッド版の FaultFinder を起動する。レポート対象がマルチスレッドプログラムの場合に使用します。 |
options |
FaultFinder のレポート生成を制御するオプション |
pid1 [pid2
] |
レポート対象プログラムのプロセス ID |
options には、次の各オプションを単独または組み合わせて指定できます。
-m |
COBOL メモリの要約レポートを生成する。 |
-f fname |
出力先を fname ファイルに指定する (fname ファイルがすでに存在する場合は上書き)。 |
-F fname |
出力先を fname ファイルに指定する (fname ファイルがすでに存在する場合は出力内容を追加)。 |
fname にハイフン (-
) を指定すると、標準出力が使用されます。fname に文字列 %p を含めると、その部分が現在のプロセス ID に置き換えられます。
レポート対象の COBOL プロセスで faultfind_level
実行時調整変数が 0 に設定されている場合は、操作履歴や開いているファイルの情報がレポートファイルに出力されません。
FaultFinder のレポートには、次の各項目の情報が含まれています。
FaultFinder をコマンド行から実行する場合は、メモリの要約レポートも生成できます。これらの情報はレポート内で節を構成しており、それぞれの節にはタイトルが付けられています。レポート内の節は、このタイトルによって検索できます。
マルチスレッドプログラムのレポートには、上記以外の情報も含まれます。これらの情報については、以下の該当する項で説明します。
注
faultfind_level
調整変数を設定してランタイムシステムから呼び出す場合も同様です。)レポートの環境節には、次の情報が含まれています。
呼び出しスタック節には、問題発生時に実行されていたスレッドごとに、呼び出しスタックの履歴が示されます。それぞれの履歴には、呼び出された各プログラムの完全パス名の一覧が含まれています (拡張子付きのプログラムの場合は拡張子も含む)。入口点は含まれていません。履歴内の項目は、実際の呼び出しとは逆の順序で並んでいます。したがって、項目の順序は次のようになります。
ローカル記憶域節 (LOCAL-STORAGE SECTION
) や連絡節 (LINKAGE SECTION
)
を含むプログラムの場合は、これらの節が対応する呼び出しスタックのインスタンスと共にダンプされます。このダンプには、次の情報が含まれます。
.int ファイルの場合は、現在のプログラムカウンタもダンプされます。
読み込まれたプログラム節には、現在ロードされている各プログラムと、それらのプログラムの再入可能データ域および再入不能データ域の情報が示されます。再入不能データ域は、作業場所節
(WORKING-STORAGE SECTION) のデータ項目用のデータ域と、ユーザが (CBL_ALLOC_MEM, flag=0
を使用して) 割り当てたデータの各インスタンス用のデータ域にわけられます。再入可能データ域は当該プログラムを実行している各スレッドごとに存在し、特定スレッド用のデータ域と、特定スレッドで
(CBL_ALLOC_MEM, flag=8
を使用して) 割り当てられたデータ用のデータ域にわけられます。それぞれのデータ項目の情報は、その
16 進数アドレスとダンプから構成されます。ダンプは 16 進数と ASCII の両方の形式で示され、重複する行はアスタリスク (*) で置換されています。
注 : 作業場所節には、ファイル制御節 (FILE-CONTROL SECTION) やファイル節 (FILE SECTION) と同様、ユーザプログラムに固有でない全データ域と、システムに必要な再入不能データ域が含まれています。作業場所節の先頭で識別用のデータ項目を定義し、検索に適した値を割り当てれば、プログラム内で作業場所節が見つけやすくなります。
論理的にキャンセルされたプログラム節には、論理的にキャンセルされたプログラムの、完全パス名 (および拡張子) の一覧が含まれます。
論理的にキャンセルされたファイルは、ランタイムシステム側では認識されているため、ディスクからロードせずに必要に応じて再実行できます。ファイルが物理的にキャンセルされると、メモリから解放され、ランタイムシステムでも認識されなくなります。
この節には、その他の情報はありません。
開いているファイル節には、開いている全ファイルの情報が含まれています。ローカルファイルだけでなく、開いている外部ファイルの情報も含まれます。これらの各ファイルごとに、次の情報が示されます。
最終レコード全体とファイル制御記述子 (FCD) は、アドレスと共に 16 進数および ASCII 形式でダンプされます。
操作履歴には、READ、WRITE、OPEN などの基本的な処理のほか、次の情報が記録されます。
3〜4 番目の情報は、該当する場合にのみ記録されます。
操作履歴節には、発生したイベントが新しいものから n 件、スレッドごとに一覧されます (n は faultfind_level
実行時調整変数の設定値)。スレッドごとにトレースされる処理は次のとおり。
この節の内容はスレッドごとにわけられており、最初の集団には 1 番目のスレッドの全イベント、次の集団には 2 番目のスレッドの全イベントという順で並んでいます。通常、1 つの処理には 2 つのイベントが伴います。すなわち、処理の開始イベントと終了イベントです。この節では、開始イベントには <、終了イベントには > がそれぞれ先頭に付けられています。イベントは発生した順序とは逆に並べられており、最後に発生したイベントが先頭に位置します。
メモリ要約レポートは、メモリを使用している COBOL プログラムの特定に役立つ集約型のレポートです。
注 : 作業場所節など、COBOL レベルでのメモリ割り当てがレポートの対象です。プロセスレベルやランタイムシステムレベルでのメモリの使用状況が詳しく報告されるわけではありません。
メモリ要約レポートは、以下の手順でコマンドラインより取得することができます。
Program Name WKS THR DYN =============================================================================== ADISKEY2 2.73KB 0b 74b ADISKEY 4.89KB 0b 73b bsio 10.38KB 0b 2.44KB ESDSSUB 16.68KB 0b 192b mfini 3.32KB 0b 12.78KB mFFH 27.79KB 0b 49.5KB ADISINIT 7.3KB 0b 74b ADIS 4.35KB 0b 70b /home/test/tictac.gnt 2.24KB 0b 129b ------------------------------------------------------------------------------- Total 79.36KB 0b 65.29KB Local Storage for thread 1308: No local storage found. Total COBOL memory usage: 144.65KB
ランタイムシステム内で検出された各 COBOL プログラムが、割り当てられているメモリ容量とともに一覧表示されます。
注 : この一覧には、ランタイムシステムが認識する全 COBOL プログラムが含まれます。キャンセル済みのプログラムも、メモリ割り当てが解除されていなければ対象になります。
列のタイトルとして使用されている略語の意味は次のとおりです。
WKS | 作業場所節 (Working-Storage) |
THR | Thread-Local Storage 節 |
DYN | CBL_ALLOC_MEM やランタイムシステムによって動的に割り当てられた領域 |
CALL/PERFORM スタックの内容もチェックされます。その結果、ローカル記憶域節 (LOCAL-STORAGE SECTION) を使用しているアクティブなプログラムが見つかると、その旨がレポートに出力されます。
一覧の末尾には、使用されているメモリの合計容量が示されます。
ソースコードのスナップショットやコンパイル属性を得ることができれば、FaultFinder が生成したレポートをより確実に分析し、プログラムの品質を高めることができます。FaultFinder Listing Generator は、ソースコードのスナップショットを生成するユーティリティです。FaultFinder Listing Generator は、詳細情報を一覧したリストファイルを生成します。
リストファイルを生成する手順の概要は次のとおりです。
FaultFinder Listing Generator は、次のコマンドで起動します。
cobfflst options filename [listfile]
パラメータの内容は、次のとおりです。
options |
リストとして生成する情報の項目を、次のオプションを単独または組み合わせて指定する。
options を省略すると、ソースコード、データマップ、手続きマップ、および相互参照の各リストがすべて出力されます。これらのリストの詳細については、後述の説明を参照してください。 |
||||||||||||
filename |
処理対象の .idy ファイルの基本名。標準で .idy ファイルが使用されるため、拡張子を指定する必要はありません。 | ||||||||||||
listfile |
リストの出力先ファイルの名前。このパラメータを省略すると、リストは画面に出力されます。 |
注 : FaultFinder Listing Generator は常に .idy ファイルを使用します。COBOL のソースファイルは使用されません。
たとえば、appfile.cbl プログラムを対象として、相互参照情報を除く全リストを appfile.ffl ファイルに出力するには、次のコマンドを実行します。
cob -a appfile.cbl -C "int(appint.int)" cobfflst -x appint.idy appfile.ffl
生成コードファイルを使用する場合には、次のコマンドを実行します。
cob -xg appfile.cbl cobfflst -x appfile.idy appfile.ffl
この項で使用する出力例は、次のプログラムを対象として生成されたものです。
program-id. 'funbar'. working-storage section. 01 ws-var-1 pic x(255). thread-local-storage section. 01 tls-var-1 pic x(1021). local-storage section. 01 ls-var-1 pic x(511). linkage section. 01 lnks-var-1 pic x(2011). 01 lnks-var-1r pic a(1024) redefines lnks-var-1. 01 lnks-var-2 pic x(3096). procedure division using lnks-var-1 lnks-var-2. move tls-var-1 to ws-var-1 if ws-var-1 = lnks-var-1 display ls-var-1 end-if stop run.
このプログラムを次のコマンドで生成コードにコンパイルし、FaultFinder Listing Generator でリストファイルを生成した場合を想定しています。
cob -xg fun.cbl cobfflst -l19 fun.idy fun.lst
リストの見出し部には、プログラムのコンパイルに関する情報が含まれています。ここでは、まず見出し部の例を次に示し、続いてその内容について説明します。
* * * * * * * * * * * * * COMPILATION SUMMARY * * * * * * * * * * * Micro Focus Server Express V1.1 revision 000 Product ID : HXCTG/AA0/00000 Compiler ref : GNR-071060000AD Date compiled: 05-Oct-99 Time Compiled: 18:20 Source File: fun.cbl .idy File : fun.id y Program ID : funbar Compiled to: Gnt/object with xref information - - - - - - - - - - - - - - - - Sizes - - - - - - - - - - - - - - - INT Code Proc: 000059 Data: 0001C4 Local: 000200 Thread: 0003FE GNT Code User: 000178 Full: 0002C8 - - - - - - - - - - - - - 02 Linkage Item(s) - - - - - - - - - - - - LNKS-VAR-1 : 2011 bytes (h"000007DB") LNKS-VAR-1R : 1024 bytes (h"00000400") (redef) LNKS-VAR-2 : 3096 bytes (h"00000C18") - - - - - - - - - - - - Key Compilation Directives - - - - - - - - - noP64 INTLEVEL(3) noREENTRANT CHARSET(ASCII) MF noOSVS noVSC2 CHECKDIV PERFORM-TYPE(MF) noBOUND TRUNC(ANSI) noSPZERO noIBMCOMP * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
見出し部の冒頭には、コンパイラとコンパイル対象のソースコードに関する情報が示されています。コンパイラに関する情報には、製品名、製品のバージョン、製品 ID、およびコンパイラの参照番号が含まれます。これらの情報は、Micro Focus アンサーラインで利用される場合があります。 ソースコード関連の情報には、コンパイルしたファイルの名前、生成された .idy ファイルの名前、プログラムの主要入口点、およびコンパイルのモードが含まれます。
Sizes 節には、プログラム内で定義されている各種の区分のサイズが示されています。具体的には次の区分のサイズが示されます。
上の例では、これらの各区分について次のことがわかります。
Linkage Item(s) 節には、プログラムの連絡節で定義されている各データ項目とそのサイズが一覧されます。連絡節の項目が独立した節に一覧されるのは、これらの項目のサイズがプログラム間通信で重要な意味を持つためです。上の例では、LNKS-VAR-1R が LNKS-VAR-1 の再定義であることがわかります。したがって、連絡節の項目は事実上 2 つです。
Key Compilation Directives 節には、実行時の動作に影響を与えるコンパイラ指令が一覧されています。
FaultFinder Listing Generator は 2 種類のソースリストを生成します。1 つはデータ部のリスト、もう 1 つは手続き部のリストです。
データ部のリストの例を次に示します。
fun.cbl, line 1 Line Loc :Size ----+-*A-1-B--+----2----+----3----+----4----+---...-8 000001 program-id. 'funbar'. 000002 working-storage section. 000003 000050:0000FF 01 ws-var-1 pic x(255). 000004 000005 thread-local-storage section. 000006 000000:0003FD 01 tls-var-1 pic x(1021). 000007 000008 local-storage section. 000009 000000:0001FF 01 ls-var-1 pic x(511). 000010 000011 linkage section. 000012 000000:0007DB 01 lnks-var-1 pic x(2011). 000013 000000:000400 01 lnks-var-1r pic a(1024) redefines lnks-var-1. 000014 000000:000C18 01 lnks-var-2 pic x(3096). 000015 000016 procedure division using lnks-var-1 lnks-var-2.
データ部のリストの冒頭には、製品とコンパイルの情報を示すページ見出しがあります (この例では省略されています)。続いて、当該ページに示されているソースモジュールの名前と、ページの先頭行に対応するモジュール内の行番号が示されます。たとえば、上のページは fun.cbl モジュールの情報を示しており、ページの 1 行目は同モジュール内の 1 行目に対応しています。
モジュール名の下には目盛りを含む行があります。この目盛りは、該当する原始行の COBOL エリア (エリア A、エリア B など) を示しています。上の例では、マニュアルのフォーマットに合わせて目盛りが短縮されています。この行には目盛りのほか、表示されている原始行の列の見出しも含まれています。
この行に続いて、データ部のコードが一覧されます。コンパイルされた原始行の先頭から 80 字までが表示されます。行の文字数が 80 字を超える場合は、超過部分の文字が表示されません。
原始行の直前には、その行で定義されているデータ項目の位置 (Loc
) とサイズ (Size
) が
16 進数形式で示されています。たとえば上の例では、ソースの 3 行目で ws-var-1
が定義されており、この項目の位置は静的に割り当てられたデータ領域の先頭から
h"50" の相対番地、サイズは h"ff" (10 進数では 255) であることがわかります。同様に、6 行目で定義されている変数、
tls-var-1
の相対番地は h"00"、サイズは h"3FD" (10 進数で
1021) です。
手続き部のリストの例を次に示します。
fun.cbl, line 17 IntAddr:GntAddr----+-*A-1-B--+----2----+----3----+----4----+--- -8 Xref 000017 00002e sec1 section. =000017 000018 000030 par1. =000018 000019 000031:00000CC move tls-var-1 to ws-var-1 000006 >000003 000020 000039:00000F4 if ws-var-1 = lnks-var-1 ?000003 ?000012 000021 000042:0000160 display ls-var-1 000009 000022 000049 end-if 000023 00004B:000016C stop run. 000024
手続き部のリストの冒頭には、製品とコンパイルの情報を示すページ見出しがあります (この例では省略されています)。続いて、当該ページに示されているソースモジュールの名前と、ページの先頭行に対応するモジュール内の行の番号が示されます。たとえば、上のページは fun.cbl モジュールの情報を示しており、2 ページ目の 1 行目は fun.cbl モジュール内の 17 行目に対応しています。
モジュール名の下には目盛りを含む行があります。この目盛りは、該当する原始行の COBOL エリア (エリア A、エリア B など) を示しています。上の例では、マニュアルのフォーマットに合わせて目盛りが短縮されています。この行には目盛りのほか、表示されている原始行の列の見出しも含まれています。
IntAddr
の列には、表示されている原始行に対応する中間コードのアドレス、GntAddr
の列には生成コード (またはオブジェクトコード) のアドレスが示されています。どちらもモジュール先頭からの相対番地です。たとえば、上のリストでは、原始行の 19 行目に対応する中間コードのアドレスは "31"、生成コード (オブジェクトコード) のアドレスは h"CC" であることがわかります。Xref
列には、該当する原始行の文で操作されるデータ項目の定義行と、そのデータ項目に実行される処理の種類が示されています。処理の種類は、次の文字によって識別されます。
= | 定義 |
> | 変更 |
? | テスト |
たとえば上のリストでは、ソースの 18 行目で par1
を定義しており、19 行目では 6 行目で定義された tls-var-1
の参照と、3 行目で定義された ws-var-1
の変更を行っていることがわかります。さらに、20 行目では、3 行目で定義された ws-var-1
と 12 行目で定義された lnks-var-1
をテストしています。
FaultFinder Listing Generator は 2 種類のマップリストを生成します。1 つはデータ項目用、もう 1 つは手続き項目用です。
データ項目マップリストの例を次に示します。
* Data Map Listing * Line Name Addr Size Sec Usage Picture string 000003 WS-VAR-1 000050 0000FF WS Alnum PIC X(255) 000006 TLS-VAR-1. 000000 0003FD TS Alnum PIC X(1021) 000009 LS-VAR-1 000000 0001FF Lcl Alnum PIC X(511) 000012 LNKS-VAR-1 000000 0007DB Lnk Alnum PIC X(2011) 000013 LNKS-VAR-1R. 000000 000400 Lnk Alpha PIC A(1024) 000014 LNKS-VAR-2 000000 000C18 Lnk Alnum PIC X(3096) 000000 RETURN-CODE 000150 000002 WS Comp PIC S9(4) COMP 000000 SORT-RETURN 000154 000002 WS Comp PIC S9(4) COMP
このリストは次の情報を示します。
WS | 作業場所節 |
FS | ファイル節 |
TS | Thread-Local Storage 節 |
Lcl | ローカル記憶域節 |
Lnk | 連絡節 |
Obj | オブジェクト記憶節 |
SRg | コンパイラ専用レジスタ |
手続き項目マップリストの例を次に示します。
* Procedure Map Listing * Line Name Seg IntAddr GntAddr Sec/Par 000017 SEC1 000002E Sec 000018 PAR1 0000030 00000CC Par
このリストは次の情報を示します。
Xref リストには、データ項目が整列されて一覧表示されます。次に例を示します。
* Xref Map Listing * Def'd Name References, ?Tests, >Modifications 000012 LNKS-VAR-1 0000013 0000016 ?0000020 000013 LNKS-VAR-1R. 000014 LNKS-VAR-2 0000016 000009 LS-VAR-1 0000021 000018 PAR1 000017 SEC1 000006 TLS-VAR-1 0000019 000003 WS-VAR-1 >0000019 ?0000020 000016 funbar* 000001 funbar@
各データ項目ごとに、次の情報が示されます。
3 番目の列のタイトル (References, ?Tests, >Modifications
) は、認識される処理の種類と、これらの処理を表す記号を示しています。したがって、lnks-var-1
は 12 行目で定義された後、13 行目と 16 行目で参照され、20 行目でテストされたことがわかります。同様に、ws-var-1
は 3 行目で定義された後、19 行目で変更され、20 行目でテストされています。
末尾にアスタリスク (*) が付けられた項目は、その行がプログラムの手続き部の開始行であることを示しています。末尾に @ 記号が付けられた項目は、その行でプログラムの ID が定義されていることを示します。
Copyright © 2006 Micro Focus International Limited. All rights reserved.