第 6 章 FaultFinder

この章では、FaultFinder ユーティリティについて説明します。

6.1 概要

FaultFinder とは、プロダクションアプリケーションのデバッグを支援するユーティリティです。このユーティリティを使用すれば、アプリケーションが異常終了した場合の情報を、テキストベースの状態レポートとして取得できます。このレポートは、問題が発生したときのアプリケーションのスナップショットであり、開いていたファイルやファイルバッファ、ロードされていたプログラムなどの項目を特定することができます。

6.2 操作

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

6.2.1 FaultFinder のパフォーマンス

FaultFinder のイベントトレースを有効化する (faultfind_level 環境時調整変数に 1 以上の値を指定する) と、パフォーマンスへの影響が生じますが、この影響に気付くことはほとんどありません。トレースするイベント数の違いによるパフォーマンス差も大きくなく、イベントを 1 件だけトレースしても、1000 以上トレースする場合に比べ、格段にパフォーマンスが向上することはありません。イベントトレースを有効化した場合に、パフォーマンスに最も大きな影響を受けるのはファイル操作です。したがって、 FaultFinder では、ファイル操作のベンチマーク測定が最も注意すべき処理と言えます。ただし、その場合でも、パフォーマンスの低下率が 5% を超えることはありません。大部分のアプリケーションでは、ファイル操作は処理の一部にすぎないため、パフォーマンスへの影響も最小限に抑えられます。

6.2.2 コマンド行からの実行

ここでは 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 に設定されている場合は、操作履歴や開いているファイルの情報がレポートファイルに出力されません。

6.3 FaultFinder のレポート

FaultFinder のレポートには、次の各項目の情報が含まれています。

FaultFinder をコマンド行から実行する場合は、メモリの要約レポートも生成できます。これらの情報はレポート内で節を構成しており、それぞれの節にはタイトルが付けられています。レポート内の節は、このタイトルによって検索できます。

マルチスレッドプログラムのレポートには、上記以外の情報も含まれます。これらの情報については、以下の該当する項で説明します。



6.3.1 環境節

レポートの環境節には、次の情報が含まれています。

6.3.2 呼び出しスタック節

呼び出しスタック節には、問題発生時に実行されていたスレッドごとに、呼び出しスタックの履歴が示されます。それぞれの履歴には、呼び出された各プログラムの完全パス名の一覧が含まれています (拡張子付きのプログラムの場合は拡張子も含む)。入口点は含まれていません。履歴内の項目は、実際の呼び出しとは逆の順序で並んでいます。したがって、項目の順序は次のようになります。

ローカル記憶域節 (LOCAL-STORAGE SECTION) や連絡節 (LINKAGE SECTION) を含むプログラムの場合は、これらの節が対応する呼び出しスタックのインスタンスと共にダンプされます。このダンプには、次の情報が含まれます。

.int ファイルの場合は、現在のプログラムカウンタもダンプされます。

6.3.3 読み込まれたプログラム節

読み込まれたプログラム節には、現在ロードされている各プログラムと、それらのプログラムの再入可能データ域および再入不能データ域の情報が示されます。再入不能データ域は、作業場所節 (WORKING-STORAGE SECTION) のデータ項目用のデータ域と、ユーザが (CBL_ALLOC_MEM, flag=0 を使用して) 割り当てたデータの各インスタンス用のデータ域にわけられます。再入可能データ域は当該プログラムを実行している各スレッドごとに存在し、特定スレッド用のデータ域と、特定スレッドで (CBL_ALLOC_MEM, flag=8 を使用して) 割り当てられたデータ用のデータ域にわけられます。それぞれのデータ項目の情報は、その 16 進数アドレスとダンプから構成されます。ダンプは 16 進数と ASCII の両方の形式で示され、重複する行はアスタリスク (*) で置換されています。


: 作業場所節には、ファイル制御節 (FILE-CONTROL SECTION) やファイル節 (FILE SECTION) と同様、ユーザプログラムに固有でない全データ域と、システムに必要な再入不能データ域が含まれています。作業場所節の先頭で識別用のデータ項目を定義し、検索に適した値を割り当てれば、プログラム内で作業場所節が見つけやすくなります。


6.3.4 論理的にキャンセルされたプログラム節

論理的にキャンセルされたプログラム節には、論理的にキャンセルされたプログラムの、完全パス名 (および拡張子) の一覧が含まれます。

論理的にキャンセルされたファイルは、ランタイムシステム側では認識されているため、ディスクからロードせずに必要に応じて再実行できます。ファイルが物理的にキャンセルされると、メモリから解放され、ランタイムシステムでも認識されなくなります。

この節には、その他の情報はありません。

6.3.5 開いているファイル節

開いているファイル節には、開いている全ファイルの情報が含まれています。ローカルファイルだけでなく、開いている外部ファイルの情報も含まれます。これらの各ファイルごとに、次の情報が示されます。

最終レコード全体とファイル制御記述子 (FCD) は、アドレスと共に 16 進数および ASCII 形式でダンプされます。

操作履歴には、READ、WRITE、OPEN などの基本的な処理のほか、次の情報が記録されます。

3〜4 番目の情報は、該当する場合にのみ記録されます。

6.3.6 操作履歴節

操作履歴節には、発生したイベントが新しいものから n 件、スレッドごとに一覧されます (nfaultfind_level 実行時調整変数の設定値)。スレッドごとにトレースされる処理は次のとおり。

この節の内容はスレッドごとにわけられており、最初の集団には 1 番目のスレッドの全イベント、次の集団には 2 番目のスレッドの全イベントという順で並んでいます。通常、1 つの処理には 2 つのイベントが伴います。すなわち、処理の開始イベントと終了イベントです。この節では、開始イベントには <、終了イベントには > がそれぞれ先頭に付けられています。イベントは発生した順序とは逆に並べられており、最後に発生したイベントが先頭に位置します。

6.3.7 メモリ要約レポート

メモリ要約レポートは、メモリを使用している COBOL プログラムの特定に役立つ集約型のレポートです。


: 作業場所節など、COBOL レベルでのメモリ割り当てがレポートの対象です。プロセスレベルやランタイムシステムレベルでのメモリの使用状況が詳しく報告されるわけではありません。


メモリ要約レポートは、以下の手順でコマンドラインより取得することができます。

  1. 以下の例のように、プログラムのコンパイルを実行します。

    $cob -v tictac.cbl
    $cobrun tictac.int

    プログラムが起動して、プロンプトが表示されます。

  2. プロンプトには何も入力せず、別のコンソールまたは新しい X ウィンドウに移ります。

  3. 次のコマンドを入力します。

    ps -fumyid | grep tictac.int

    ここで、myid には自分のユーザ ID を入力します。このコマンドにより、Tictac を実行しているプロセスが表示されます。ここでは、tictac.int への記述項を含むプロセスと、grep コマンドのプロセスの ID が表示されます。必要なプロセスは通常、最初に表示され、これには rts32 が含まれます。以下にその例を示します。

    myid 36712 38665 0 10:47:53 pts/34 0:00 /home/myid/..../rts32 tictac.int
    myid 67264 40892 3 10:54:43 pts/20 0:00 grep tictac.int

    各行の最初の数字がプロセス ID です。rts32 tictac.int を含む行が、tictac.int を実行しているプロセスです。上記の例では、このプロセスの ID は 36712 です。

  4. 次のコマンドを実行します。

    $cobffnd -m 36712

    メモリ要約レポートファイル、fltfnd_out.36712 が出力されます。以下は、その内容の例です。
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) を使用しているアクティブなプログラムが見つかると、その旨がレポートに出力されます。

一覧の末尾には、使用されているメモリの合計容量が示されます。

6.4 FaultFinder Listing Generator

ソースコードのスナップショットやコンパイル属性を得ることができれば、FaultFinder が生成したレポートをより確実に分析し、プログラムの品質を高めることができます。FaultFinder Listing Generator は、ソースコードのスナップショットを生成するユーティリティです。FaultFinder Listing Generator は、詳細情報を一覧したリストファイルを生成します。

リストファイルを生成する手順の概要は次のとおりです。

  1. プログラムをアニメート処理用にコンパイルする。

  2. cobfflst コマンドを実行する。

6.4.1 cobfflst の起動

FaultFinder Listing Generator は、次のコマンドで起動します。

cobfflst options filename [listfile]

パラメータの内容は、次のとおりです。

options リストとして生成する情報の項目を、次のオプションを単独または組み合わせて指定する。
-s ソースリストを出力しない。
-d データマップリストを出力しない。
-p 手続きマップリストを出力しない。
-x 相互参照リストを出力しない。
-ln ページサイズを n 行に指定する。デフォルトは 66 行。
-v バージョン情報などの詳細を出力する。
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

6.4.2 FaultFinder Listing Generator の出力内容

この項で使用する出力例は、次のプログラムを対象として生成されたものです。

 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

6.4.2.1 見出し部

リストの見出し部には、プログラムのコンパイルに関する情報が含まれています。ここでは、まず見出し部の例を次に示し、続いてその内容について説明します。

* * * * * * * * * * * * * 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 節には、実行時の動作に影響を与えるコンパイラ指令が一覧されています。

6.4.2.2 ソースリスト

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 をテストしています。

6.4.2.3 マップリスト

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

このリストは次の情報を示します。

手続き項目マップリスト

手続き項目マップリストの例を次に示します。

*  Procedure Map Listing 
*  Line   Name                           Seg IntAddr  GntAddr  Sec/Par
   000017 SEC1                               000002E           Sec
   000018 PAR1                           
   0000030                                   00000CC           Par

このリストは次の情報を示します。

6.4.2.4 Xref リスト

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.