トレーサによって取得するトレース情報の数を算出する計算機であって、前記計算機は、プログラムの流れを制御する要素を特定する制御部を有し、前記制御部は、前記プログラムの実行前に前記要素の数を特定し、前記特定した要素の数を基に、取得するトレース情報の数を算出することを特徴とする計算機。請求項1に記載の計算機であって、前記制御部は、前記取得するトレース情報の数に基づいて、トレース情報を格納するメモリ領域のサイズを決定することを特徴とする計算機。請求項2に記載の計算機であって、前記制御部は、前記特定した要素の数と、前記要素の一つ分のトレース情報を格納するために必要なメモリ領域のサイズとによって、前記実行するプログラムのトレース情報を格納するメモリ領域のサイズを決定することを特徴とする計算機。請求項3に記載の計算機であって、前記特定した要素が、処理の繰り返しを指示する要素である場合、前記制御部は、前記処理の繰り返しを指示する要素から取得するトレース情報を削除あるいは上書きしてメモリ領域に格納することを特徴とする計算機。請求項1に記載の計算機であって、前記制御部は、前記プログラムの流れを制御する要素で構成されたツリーを生成して前記要素の数を特定することを特徴とする計算機。請求項5に記載の計算機であって、前記制御部は、さらに前記ツリーを構成するノードを実行した記録である実行頻度をノード毎に管理し、前記実行頻度に応じて所定のプログラム実行経路を特定し、前記特定したプログラム実行経路に含まれるノードの数に基づいて取得するトレース情報の数を算出することを特徴とする計算機。請求項5に記載の計算機であって、前記制御部は、さらに前記ツリーを構成する各ノードを実行した記録である実行頻度をノード毎に管理し、前記実行頻度から実行頻度の高いプログラム実行経路を特定し、前記特定したプログラム実行経路に含まれるノードの数に基づいて取得するトレース情報の数を算出することを特徴とする計算機。請求項6又は7に記載の計算機であって、前記制御部は、前記取得するトレース情報の数に基づいて、トレース情報を格納するメモリ領域のサイズを決定することを特徴とする計算機。請求項8に記載の計算機であって、前記制御部は、前記プログラムを実行し、実行して取得したトレース情報を格納するためのメモリ領域のサイズが、前記決定したメモリ領域のサイズでは不足する場合、前記決定したメモリ領域のサイズから、前記ツリーに含まれる全てのノードの数に基づいて算出されるトレース情報を格納するメモリ領域のサイズまでの大きさのメモリ領域のサイズに変更することを特徴とする計算機。計算機がトレーサによって取得するトレース情報の数を算出する方法であって、前記計算機は、プログラムの流れを制御する要素を前記プログラムの実行前に特定し、前記特定した要素の数を基に、取得するトレース情報の数を算出することを特徴とする方法。請求項10に記載の方法であって、前記計算機は、前記取得した要素の数に基づいて、トレース情報を格納するメモリ領域のサイズを決定することを特徴とする方法。請求項11に記載の方法であって、前記計算機は、前記特定した要素の数と、前記要素の一つ分のトレース情報を格納するために必要なメモリ領域のサイズとによって、前記実行するプログラムのトレース情報を格納するメモリ領域のサイズを決定することを特徴とする方法。請求項12に記載の方法であって、前記特定した要素が、処理の繰り返しを指示する要素である場合、前記計算機は、前記繰り返しを指示する要素から取得するトレース情報を削除あるいは上書きしてメモリ領域に格納することを特徴とする方法。請求項10に記載の方法であって、前記計算機は、前記プログラムの流れを制御する要素で構成されたツリーを生成して前記要素の数を特定することを特徴とする方法。計算機にトレーサによって取得するトレース情報の数を算出させるプログラムであって、前記計算機に、プログラムの流れを制御する要素を前記プログラムの実行前に特定させ、前記特定された要素の数を基に、取得するトレース情報の数を算出させることを特徴とするプログラム。請求項15に記載のプログラムであって、前記計算機に、前記取得したトレース情報の数に基づいて、トレース情報を格納するメモリ領域のサイズを決定させることを特徴とするプログラム。請求項16に記載のプログラムであって、前記計算機に、前記特定された要素の数と、前記要素の一つ分のトレース情報を格納するために必要なメモリ領域のサイズとによって、前記実行するプログラムのトレース情報を格納するメモリ領域のサイズを決定させることを特徴とするプログラム。請求項17に記載のプログラムであって、前記特定された要素が、処理の繰り返しを指示する要素である場合、前記計算機に、前記繰り返しを指示する要素から取得するトレース情報を削除あるいは上書きしてメモリ領域に格納させることを特徴とするプログラム。請求項15に記載のプログラムであって、前記計算機に、前記プログラムの流れを制御する要素で構成されたツリーを生成させて前記要素の数を特定させることを特徴とするプログラム。特許文献2に開示された技術は、通常の運用時のようにプログラムの実行パターンが繰り返し現れる場合、そのプログラムを一度実行した後であれば、プログラム実行1回あたりに取得されるトレース情報の数を求めることができる。しかし、システム障害が発生した場合、通常とは異なるプログラムの実行パターンが現れるため、プログラム実行1回あたりに取得されるトレース情報の数は求めることはできない。また、取得されるトレース情報の数をプログラム実行前に求めることはできないため、トレース情報を格納するために必要なバッファのサイズを予め決定しておくことは困難である。本発明の代表的な一形態によれば、トレーサによって取得するトレース情報の数を算出する計算機であって、前記計算機は、プログラムの流れを制御する要素を特定する制御部を有し、前記制御部は、前記プログラムの実行前に前記要素の数を特定し、前記特定した要素の数を基に、取得するトレース情報の数を算出することを特徴とする。本発明によれば、トレーサによって取得するトレース情報の数を、プログラムを実行する前に算出することができる。[第1の実施形態]本発明を適用した計算機システムの第1の実施形態では、プログラムの障害解析に用いるトレーサにおいて、対象システム上のプログラム1回の実行で実行され得るプログラム構成要素の数をソースプログラム及びバイナリから求めるための方法を説明する。ここで、プログラム構成要素とは、プログラムの流れを制御する要素である。具体的には、メソッド、ループ、条件分岐、再帰、引数返り値及びローカル変数等の変数アクセスを指す。なお、本実施形態はJava登録商標で記述されたシステムを対象として説明するが、他の言語で記述されたシステムに対しても有効である。また、以下の記述において、単にプログラムという場合、Javaのバイトコードバイナリを指すこととする。ただし、プログラムの具体例を用いて説明する場合においては、説明の容易化のためプログラムをソースコードの形式で表現している。一般に、トレース対象のプログラム中にあるループ及び再帰内では、メソッドの呼出しをはじめとするプログラム構成要素の実行が著しく多くなってしまう。そのため、ループ及び再帰中の全てのプログラム構成要素に関する情報を取得するには、バッファサイズも取得数に比例して確保する必要があり、メモリを枯渇させる虞やメモリを計画的に使用することができない虞がある。本実施形態では、トレース対象のJavaプログラムからプログラム構成要素ツリーを生成する。そして、プログラム構成要素ツリーを元に、プログラム実行1回あたりのプログラム構成要素数を求め、トレース情報を格納するバッファのサイズを算出する。また、ループや再帰処理内部で障害が発生したとしても、障害を再現することなく障害発生原因を特定するために必要な、ループや再帰が実行された履歴、ループや再帰の繰り返し回数及び繰り返しを構成する要素群の最終実行履歴のみをバッファに格納する。これにより、プログラムにループや再帰の実行があったとしても、そのループや再帰の実行に伴う全てのトレース情報を取得する必要はないため、メモリの枯渇を生じさせることなく、メモリを計画的に使用することができる。以降では、図面を用いて本実施形態の構成及び処理の流れを詳細に説明する。図1は、本発明を適用した第1の実施形態である計算機101の全体構成を示す。計算機101は、CPU102とメモリ103とを有する。CPU102はJava仮想マシン104を実行する。Java仮想マシン104は、プログラム読込部105、静的解析データ生成部106、静的解析データ読込部107、バッファサイズ計算部108、プログラム書換部109、プログラム実行部110、トレース情報取得部111及びトレース情報出力部112を含む。上記の機能部は、CPU102と、プログラム113とが協働することにより実現される。メモリ103は、プログラム113、拡張プログラム114、静的解析データ115及びトレース情報117を保持するバッファ116を有する。なお、プログラム113、拡張プログラム114、静的解析データ115はメモリ103上ではなく、外部記憶装置118に格納されていることもある。また、本実施形態では、メモリ103内にバッファ116を設けることとして説明するが、バッファ116をCPU102に設ける構成でもよい。プログラム読込部105は、メモリ103に格納されたプログラム113を読込む。静的解析データ生成部106は、読込んだプログラム113の静的解析データ115を生成する。なお、静的解析データ115は、プログラム構成要素の実行順序を示す情報である。本実施形態では、プログラム構成要素をノードとしたツリー以下、プログラム構成要素ツリーという。で、静的解析データ115を構成するものとする。静的解析データ読込部107は、静的解析データ生成部106で生成された静的解析データ115をメモリ103上から読込む。バッファサイズ計算部108は、読込んだ静的解析データ115からバッファサイズを計算し、計算したバッファサイズのバッファ116をメモリ103上に生成する。プログラム書換部109は、プログラム113にトレース情報117を取得するためのプローブを挿入し、プローブを挿入した拡張プログラム114をメモリ103に配置する。プログラム実行部110は、拡張プログラム114をメモリ103から読込み、実行する。トレース情報取得部111は、実行した拡張プログラム114からトレース情報117を取得し、取得したトレース情報117をバッファ116に格納する。トレース情報出力部112は、バッファ116に格納したトレース情報117を外部記憶装置118に出力する。トレース情報117は、プログラム113を実行する度に取得されるため、取得済みのトレース情報117を外部記憶装置118に出力することで、バッファ116の使用量やメモリ103の負荷を低減することができる。図2は、本実施形態の計算機101で実行する処理全体の流れを示すフローチャートである。はじめに、S201で、プログラム読込部105が、メモリ103上に格納されているプログラム113を読込む。次に、S202で、静的解析データ生成部106が、静的解析データ115が未生成であるか否かを確認する。静的解析データ115が未生成である場合S202:Yes、S203で、静的解析データ生成部106が、メモリ103上にあるプログラム113から静的解析データ115を生成し、メモリ103に配置する静的解析データ生成処理。静的解析データ115が生成済みである場合S202:No、S204で、静的解析データ読込部107が、メモリ103上から静的解析データ115を読込む静的解析データ読込処理。次に、S205で、バッファサイズ計算部108が、静的解析データ115を基にバッファサイズを計算し、メモリ103上に計算したバッファサイズのバッファ116を生成するバッファサイズ計算処理。次に、S206で、プログラム書換部109が、読込んだプログラム113にトレース情報117を取得するためのプローブを挿入し、プローブ挿入済みのプログラムを拡張プログラム114としてメモリ103に配置するプログラム書換処理。次に、S207で、プログラム実行部110が、拡張プログラム114をメモリ103から読込み、読込んだ拡張プログラム114を実行しながらトレース情報117を取得するプログラム実行処理。このとき、取得したトレース情報117に障害発生しているか否かを確認する。なお、障害発生とは、Java仮想マシン104やJava仮想マシン104上で動作しているスレッドJavaスレッドが不正終了するような障害、任意もしくは特定の例外が発生する障害及び結果的に不正が発生する障害のことを指す。次に、S208で、トレース情報取得部111が、取得したトレース情報117を、バッファ116に格納するトレース情報取得処理。最後に、S209で、トレース情報出力部112が、システムの障害発生等を契機に、バッファ116に格納したトレース情報117を画面や外部出力デバイス不図示に出力するトレース情報出力処理。以下、図2に示した各処理について、より詳細に説明する。図3は、静的解析データ生成部106が行う静的解析データ生成処理図2のS203の処理の流れを示すフローチャートを示す。静的解析データ生成処理は、プログラム113を元にプログラム構成要素ツリーを生成する。なお、プログラム構成要素ツリーでは、プログラム構成要素をノードとして扱う。また、ループや条件分岐等のボディ部ループや条件分岐内における実処理部分に存在する構成要素は、それらを内包する構成要素ループノード、条件分岐ノード、再帰ノードを親ノードとする子ノードとして扱う。はじめに、S301で、トレース対象のプログラム113に対して制御フロー解析を実行する。制御フロー解析とは、プログラム113を実行したときのプログラムの流れを、プログラム構成要素単位で抽出することをいう。次に、S302で、プログラム113から始点メソッドを探索し、探索した始点メソッドに対応するノードを生成する。始点メソッドはJavaでいうmainメソッド、スレッドプログラミングのrunメソッド、サーブレットのdoGetメソッド等の処理の始点となるメソッドとする。なお、始点メソッドはユーザが任意で指定することもできる。次に、S303で、生成したノードをカレントノードに設定する。カレントノードとは、プログラム構成要素ツリーに子ノードを追加する際の親ノードを意味する。次に、S304で、設定したカレントノードに属するプログラム内から子ノードとなる次のプログラム構成要素を探す。次に、S305で、探索したプログラム構成要素が、カレントノードに対応するプログラム構成要素の最後かどうかを確認する。すなわち、親ノードがメソッドノードなら、メソッドを構成する最終要素、ループノードならループボディを構成する最終要素であるかを確認する。ここで、設定したカレントノードに対応するプログラム構成要素の最後でない場合S305:No、S306で、S301で抽出したプログラム構成要素を制御フロー順に読込む。そして、S307で、読込んだプログラム構成要素が、ノード生成対象であるかを確認する。ここで、ノード生成対象である場合S307:Yes、S308で、ノード生成処理を行う。ノード生成対象でない場合S307:No、S305に戻るノード生成処理。次に、S309で、現在のカレントノードから生成した新しいノードにカレントノードの変更を行うカレントノード変更処理。そして、S305に戻りカレントノードに対応するプログラム構成要素の最後かどうかを確認する。一方、設定したカレントノードがプログラム構成要素の最後である場合S305:Yes、S310で、そのカレントノードが始点メソッドのプログラム構成要素の最後であるかを確認する。カレントノードが、始点メソッドのプログラム構成要素の最後でない場合S310:No、S311で、現在カレントノードとして設定されているカレントノードを親ノードに設定するカレントノード復元処理。他方、カレントノードが、始点メソッドのプログラム構成要素の最後である場合S310:Yes、S312で、生成したプログラム構成要素ツリーを静的解析データ115として、メモリ103に出力しノード生成処理を終了する。以上の静的解析データ生成処理について、具体例を用いてさらに詳細に説明する。図4Aに、計算機で実行されるプログラム113の一例として、プログラム401を示す。また、図4Bに、図4Aで示したプログラム401にノード生成処理を実行した場合のプログラム構成要素ツリーを示す。まず、プログラム401について、制御フロー解析を行う図3のS301。そして、プログラム401からプログラムの始点メソッドであるmainメソッド402を探索し、mainメソッド402のノード405を生成するS302。次いで、ノード405をカレントノードに設定しS303、mainメソッド402内の次のプログラム構成要素を探すS304。その結果、mainメソッド402内のmethodA403のプログラム構成要素を抽出し、methodA403はプログラム構成要素の最後ではなくS305:No、さらにノード生成対象のプログラムであるためS307:Yes、methodA403のノード406を生成するS308。そして、カレントノード変更処理を行いS309、methodA403内の次のプログラム構成要素としてmethodB404を抽出し、methodB404のノード408を生成する。図5は、静的解析データ生成部106が行うノード生成処理図3のS308の処理の流れを示すフローチャートを示す。ノード生成処理は、図3のS308でノード生成対象と判断されたノードメソッドノード、再帰ノード、ループノード及び条件分岐ノード等を生成する。なお、プログラム構成要素の判定には、図3のS301で得た制御フロー解析の結果を用いる。はじめに、S501で、ノード生成対象のプログラム構成要素がメソッドを呼出すプログラム構成要素であるか否かを確認する。メソッドを呼出すプログラム構成要素である場合S501:Yes、S502で、そのプログラム構成要素が再帰メソッドであるか否かを判断する。そして、再帰メソッドである場合S502:Yes、S503で、再帰メソッドノードを生成する。再帰メソッドでない場合S502:No、S504で、メソッドノードを生成する。例えば、図6Aは、再帰メソッド602を含むプログラム601を示す。プログラム601のプログラム構成要素ツリーは、図6Bの603あるいは608のように表現される。methodBは602のように自分自身のメソッドを呼び出す再帰メソッドであり、プログラム構成要素ツリー603のノード606として表現される。また、ノード606内に示す数字は再帰ノードに一意に割り当てられる再帰IDである。また、再帰メソッドは、プログラム構成要素ツリー608の再帰ノード611のように1つのノードとして扱ってもよい。なお、図7Aに示すプログラム701のように、複数メソッドにまたがる再帰呼出しの場合、プログラム構成要素ツリーは図7Bで表現される。次に、ノード生成対象のプログラム構成要素がメソッドを呼出すプログラム構成要素でない場合S501:No、S505で、そのプログラム構成要素がループを示すプログラム構成要素であるか否かを判断する。そして、ループを示すプログラム構成要素である場合S505:Yes、S506で、ループノードを生成する。例えば、図8Aに示すループを含むプログラム801に対するプログラム構成要素ツリーは、図8Bで示される。ループを示す802部分は、ループノードとして図8Bのforループノード807として示される。なお、forループノード807内の数字はループIDを表す。また、803及び804で示すループ内のメソッド呼出し群は、forループノード807の子ノード808及び809として示される。なお、図8は、forループのみの記載について例示しているが、whileループ、dowhileループにおいても、forループと同様に、それぞれwhileループノード、dowhileループノードと示しても良い。次に、ノード生成対象のプログラム構成要素がループを示すプログラム構成要素でない場合S505:No、S507で、そのプログラム構成要素が条件分岐を示すプログラム構成要素であるか否かを判断する。条件分岐を示すプログラム構成要素である場合S507:Yes、S508で、条件分岐ノードを生成する。条件分岐を示すプログラム構成要素でない場合S507:No、ノード生成処理を終了する。例えば、図9Aに示す条件分岐を含むプログラム901のプログラム構成要素ツリーは、図9Bで示される。なお、902及び903の条件分岐を示す部分は、プログラム構成要素ツリー上では条件分岐ノード906及び909で表現される。なお、903のelseif文は902のif文で生成した条件分岐ノード906の子ノードとして表現され、904のelse文は903のelseif文で生成した条件分岐ノード909の子ノードとして表現される。また、906及び909の条件分岐ノード内の数字は条件分岐IDを表す。図10は、静的解析データ生成部106が行うカレントノード変更処理図3のS309の処理の流れを示すフローチャートを示す。カレントノード変更処理は、ノード生成処理図3のS308で生成した各ノードを、順にカレントノードに設定する。はじめに、S1001で、ノード生成処理図3のS308で生成したノードがメソッドノードであるか否かを確認する。生成したノードが、メソッドノードである場合S1001:Yes、S1002で、次に読み込む構成要素の位置を呼出し先メソッドの先頭とする。そして、S1003で、ノード生成処理で生成したノードをカレントノードに設定し、カレントノード変更処理を終了する。また、生成したノードが、メソッドノードでない場合S1001:No、S1003を実行し、カレントノード変更処理を終了する。図11は、静的解析データ生成部106が行うカレントノード復元処理図3のS312の処理の流れを示すフローチャートを示す。カレントノード復元処理は、カレントノードをカレントノードの親ノードに設定する。はじめに、S1101で、プログラム構成要素の最後がメソッドであるか否かを確認する。プログラム構成要素の最後がメソッドである場合S1101:Yes、S1102で、プログラム113中のメソッドの呼出し元がある箇所に移動し、カレントノード復元処理を再開する。そして、S1103で、現在カレントノードとして設定しているノードをカレントノードの親ノードに設定し、カレントノード復元処理を終了する。また、プログラム構成要素の最後がメソッドでない場合、S1103を実行しカレントノード復元処理を終了する。以上が、静的解析データ生成処理の流れである。次いで、図12にバッファサイズ計算処理の流れを示すフローチャートを示す。バッファサイズ計算処理は、静的解析データ115中のプログラム構成要素ツリーのノード数に基づいてバッファサイズを算出し、求めたバッファサイズのバッファ116を確保する。はじめに、S1201で、静的解析データ115からプログラム構成要素ツリーの総ノード数を取得する。例えば、図9Bに示すプログラム構成要素ツリーの総ノード数は905~912の8である。次に、S1202で、総ノード数をもとにバッファサイズを算出する。なお、本実施形態では、バッファサイズを、バッファサイズ=プログラム構成要素ツリーの総ノード数×1プログラム構成要素分のトレース情報を取得するのに必要なバッファサイズより求めるものとする。次に、S1203で、メモリ103に算出したバッファサイズのバッファ領域をバッファ116として確保する。なお、本実施形態では、メソッドの階層的な呼出し関係を把握するために、メソッドの開始時と終了時にトレース情報117を取得するものとするが、どのタイミングでトレース情報117を取得するかは、ユーザが指定することができる。また、本実施形態では、条件分岐、ループ及び再帰に関しても、メソッドの場合と同様に各要素の開始及び終了時にトレース情報117を取得するものとする。そして、本実施形態では、1プログラム構成要素分の情報を取得するのに必要なバッファサイズを2とする。例えば、図9Bで示されるプログラム構成要素ツリーの総ノード数は、前述のように8であるため、図9Aのプログラム901の実行により取得するトレース情報117を格納するために必要なバッファサイズは、8×2=16と算出される。また、このバッファサイズはトレーサが保持する配列の長さであり、プログラム901の場合、メモリ103上のバッファ116は配列長16の配列となる。なお、本実施形態では、1プログラム構成要素分のトレース情報117を取得するために必要なバッファサイズを2としているが、バッファサイズはトレース情報117を格納するバッファ116の仕様によってユーザが適宜指定することができる。図13は、プログラム書換部109が行うプログラム書換処理図2のS206の処理の流れを示すフローチャートを示す。プログラム書換処理は、プログラム読込処理図2のS201で読込んだプログラム113のトレース情報117を取得するために、プログラム113にプローブを挿入する。なお、本実施形態では、Javaが持つBytecodeInstrumentation機能を用いて、トレーサで取得する各イベントに該当するバイトコードの前後にイベントを取得するためのプローブを挿入する。はじめに、S1301で、メモリ103上のプログラム113に読込むクラスがあるか否かを確認する。ここでいうクラスとは、Javaソースコードから生成したバイトコード群バイナリとする。読込むクラスがある場合S1301:Yes、S1302で、メモリ103上のプログラム113からクラスを読込む。次に、S1303で、読込んだクラスがプログラム書換え対象のクラスか否かを確認する。読込んだクラスが書換え対象である場合S1303:Yes、S1304に進む。書換え対象のメソッドがない場合S1303:No、S1301に戻る。次に、S1304で、書換え対象のメソッドがあるか否かを確認する。書換え対象のメソッドがある場合S1304:Yes、S1305で、再帰関連、メソッド関連、ループ関連及び条件分岐関連の各ノードに対応するイベント取得用プローブを挿入する。書換え対象のメソッドがない場合S1304:No、S1301に戻る。そして、S1301で読込むクラスがない場合S1301:No、S1306で、書換えたプログラムを拡張プログラム114としてメモリ103に出力し、プログラム書換処理を終了する。なお、本実施形態で取得するイベントは、メソッドの開始終了、再帰の開始終了、ループの開始終了及び条件分岐の開始終了であるとする。図14に、プログラム1401に、メソッドの開始終了、再帰の開始終了、ループの開始終了のプローブを挿入したイメージを示し、図15に条件分岐の開始終了のプローブを挿入したイメージを示す。代表して、図15に示すプローブ挿入後のイメージについて詳細に説明する。methodEntry1502は、メソッドの開始イベントを取得するためのプローブである。methodEntry1502を用いることで、メソッド固有のIDを取得し、どのメソッドが開始したかを把握することができる。なお、methodEntry1502はメソッドの処理の先頭に挿入する。ifEntry1503は、条件分岐の開始イベントを取得するためのプローブである。ifEntry1503を用いることで、条件分岐固有のIDと条件分岐が保持する条件とを取得し、どの条件分岐が開始したかを把握することができる。なお、ifEntry1503は条件分岐の処理の先頭に挿入する。recursiveEntry1504は、再帰の開始イベントを取得するためのプローブである。recursiveEntry1504を用いることで、再帰固有のIDと再帰の繰り返し回数とを取得し、どの再帰が何回繰り返し実行されたのかを把握することができる。なお、recursiveEntry1504は、再帰メソッドの処理の先頭に挿入する。recursiveExit1505は、再帰の終了イベントを取得するためのプローブである。recursiveExit1505を用いることで、再帰固有のIDを取得し、どの再帰が実行終了したかを把握することができる。なお、recursiveExit1505は、再帰処理終了直後に挿入する。forLoopEntry1506は、ループforループの開始イベントを取得するためのプローブである。forLoopEntry1506を用いることで、ループ固有のIDとループの繰り返し回数とを取得し、どのループが何回繰り返し実行されたかを把握することができる。なお、forLoopEntry1506はループ内の繰り返し処理の先頭に挿入する。また、このforLoopEntry1506は何度も実行される。これは、forLoopEntry1506の実行により、繰り返し回数を把握するためである。forLoopExit1507は、forループの終了イベントを取得するためのプローブである。forLoopExit1507を用いることで、ループ固有のIDを取得し、どのループが実行終了したかを把握することができる。なお、forLoopExit1507は、ループ処理終了直後に挿入する。methodExit1508は、メソッドの終了イベントを取得するためのプローブである。methodExit1508を用いることで、メソッド固有のIDを取得し、どのメソッドが終了したかを把握することができる。なお、methodExit1508は、メソッド内の処理の最後に挿入する。ifExit1509は、条件分岐の終了イベントを取得するためのプローブである。ifExit1509を用いることで、条件分岐固有のIDを取得し、どの条件分岐が終了したかを把握することができる。なお、ifExit1509は条件分岐の最後に挿入する。また、1504及び1506にプローブの引数として記載されているcount1及びcount2は、ループあるいは再帰の繰り返し回数を表している変数であり、ループあるいは再帰の開始イベントを検出する度に1ずつ増加する。なお、上記のcount1及びcount2の繰り返し回数は、ループID及び再帰IDにつき一つ割り当てられる。また、本実施形態では、1506及び1507のループに関するプローブをforループに限定して記述しているが、whileループあるいはdowhileループに対してwhileLoopEntryあるいはdoWhileLoopEntryのプローブといったforループ同様のプローブを設定しても良い。そして、本実施形態では、各プローブの取得項目に関しても、取得項目を限定した記載となっているが、イベントの発生時間などの付加情報を取得してもよい。また、取得するイベントについても、上記したメソッドの開始終了、再帰の開始終了、ループの開始終了及び条件分岐の開始終了の8つのイベントに限定しているが、引数返り値などの変数の取得変更イベントなどのイベントを対象としても良い。以上で説明したプログラム書換処理により、プローブを挿入したプログラム113を拡張プログラム114に書換える。また、拡張プログラム114は、生成後メモリ103に格納される。なお、このプログラム書換処理は、パッケージ名やクラス名などのユーザ指定がある場合、プログラム113全てに対して実施する必要はなく、指定されたメソッドに対してのみ実施してもよい。図16は、トレース情報取得部111が行うトレース情報取得処理図2のS208の処理の流れを示すフローチャートである。トレース情報取得処理では、拡張プログラム114を実行することで得たトレース情報117をメモリ103上のバッファ116に格納する。はじめに、S1601で、プローブを埋め込んだ拡張プログラム114を実行し、トレース情報117を取得する。つぎに、S1602で、取得したトレース情報117が、ループの開始あるいは再帰の開始であるか否かを確認する。トレース情報117がループの開始あるいは再帰の開始である場合S1602:Yes、S1603で、ループあるいは再帰による繰り返し処理を初期化するために、ループあるいは再帰開始以降のトレース情報117をバッファ116から削除する。なお、初期化オーバヘッドが大きい場合、次のトレース情報117の格納位置を示すポインタを、ループノードもしくは再帰ノードの位置に戻してデータを上書きするようにしてもよい。次に、S1604で、ループあるいは再帰による繰り返し処理を行った回数を記録する繰り返しカウンタの値を1増加させる。そして、S1605で、トレース情報117を繰り返しカウンタの値とともにバッファ116に格納し、トレース情報117の取得処理を終了する。繰り返しカウンタは、ループ開始及び再帰開始の各イベントに対応するトレース情報117とともにバッファ116に格納する。また、S1601で取得したトレース情報117が、ループあるいは再帰開始でない場合S1602:No、S1606で、取得したトレース情報117をバッファ116に格納する。このように、本実施形態では、バッファ116内に格納したループや再帰などの繰り返し部分に該当するトレース情報117に対しては、トレース情報117の削除あるいは上書きを行う。そのため、ループや再帰が実行されたという履歴と、ループや再帰の繰り返し回数、その繰り返しの最終実行履歴のみがバッファ116上に残ることになる。これにより、プログラム113中に含まれる繰り返し処理によって、ループや再帰のプログラムを実行した際に発生するトレース情報117を全てバッファ116上に残すことは不要となり、必要以上に大きいサイズのバッファ116を確保しておく必要や、確保しておいたバッファ116が不足してしまうことはなく、メモリ103を計画的に効率よく使用することができる。次に、図17を用いて、ループが含まれるプログラム113及びバッファ116の格納例について説明する。図17Aに、ループが含まれるプログラムの一例としてプログラム1701を示し、図17Bに、バッファ116上での格納例を示す図17Bにおいて、Cはメソッドの開始イベント、Leはループの開始イベント、Rはメソッドの終了イベント又Lxはループの終了イベントをそれぞれ示す。矢印1723~1727は、トレース情報117の次の格納先を指すポインタを示す。1707~1712は、バッファ116上に格納されるトレース情報の第1状態から第6状態までの状態遷移図を示す。なお、1707~1712で示す各状態遷移図は、バッファ116条にトレース情報117を格納する様の一部を模式的に示したものである。まず、図17Aに示すプログラム1701を実行すると、mainメソッド1702の開始イベント及びその内部のmethodA1703の開始イベントが発生するため、第1状態1707のように、mainメソッドの開始イベント1713及びmethodAメソッドの開始イベント1714の2つの開始イベント示すトレース情報117が格納される。次に、methodA1703内のループ1704が1回実行されると、第2状態1708のように、ループの開始イベント1715、methodB1705の開始イベント1716、methodB1705の終了イベント1717、methodC1706の開始イベント1718、methodC1706の終了イベント1719を示すトレース情報117が格納される。そして、1719の次の格納位置を示すポインタ1724をループ開始イベントLe1715の位置に戻すことで、第3状態1709のようにループ開始イベントLe1715から最後のメソッド終了イベントR1719までのトレース情報117を削除する。あるいは、ポインタ1724をループ開始イベントLe1715の位置に戻して、次回以降はトレース情報117を上書きして格納していく。これは、ループ開始イベントが再度発生するため、過去に取得した繰り返しデータの削除あるいは上書きによって繰り返し部分のトレース情報117を同じ格納先に格納するためである。次に、繰り返し部分のトレース情報117の初期化後、第4状態1710のように、再度ループの開始イベント1715に対応するトレース情報117を格納する。このとき繰り返しカウンタをトレース情報117の付随情報として格納する。次に、ループ処理が終了するとき、第5状態1711のように、バッファ116の最後にループ終了イベント1720を示すトレース情報117を格納する。最後に、第6状態1712のように、methodAメソッドの終了イベント1721及びmainメソッドの終了イベント1722を示すトレース情報117を格納する。また、バッファサイズに関しても、図17Aのプログラム1701において、ループ内にあるメソッドの数の合計が2、1メソッド分の呼出し情報を取得するのに必要なバッファサイズが2、ループの開始終了情報が2であることから、バッファサイズは2×22=6となる。従って、1712のようにmain1702の開始イベント1713並びに1722及びmethodA1703の開始イベント1714並びに終了イベント1721を除いたバッファ使用量6と一致する。なお、上記の例はループの例のみを例示しているが、再帰がある場合でも、ループの例と同様に取得するトレース情報117の数を算出することができる。このように、従来では、ループや再帰等の繰り返しを指示する要素がプログラムに含まれている場合、取得するトレース情報の数がループや再帰の繰り返し回数に依存するため、取得するトレース情報の数を算出することはできなかった。それに伴い、そのトレース情報を格納するために必要なバッファサイズを予め把握することができなかった。しかし、本実施形態では、上記のようにループや再帰等の繰り返しを指示する要素が含まれるプログラムから取得するトレース情報の数を算出することができるため、予めトレース情報を格納するためのバッファサイズを算出することもできる。図18に、トレース情報117の出力例を示す。本実施形態では、図1のトレース情報出力部112が、トレース情報117をファイルとして外部記憶装置118に出力する。なお、図18は、図17Aに示すプログラム1701を実行したトレース情報117の出力結果であり、1~10の各行がトレース情報117を示している。トレース情報1801は、mainメソッドの開始を表している。method_entry1805はメソッドの開始イベント、main1806はmethod_entry1805の対象メソッドをそれぞれ表している。トレース情報1802は、ループIDが1のループが開始されたこと及びそのループが100回繰り返し実行されたことを表している。for_loop_entry1807はループの開始イベント、1808はループID、1809は繰り返しカウンタをそれぞれ表している。トレース情報1803は、methodBが終了したことを表しており、method_exit1810はメソッドの終了イベント、methodB1811はmethod_exit1810の対象メソッドをそれぞれ表している。トレース情報1804は、ループIDが1のループが終了したことを表している。for_loop_exit1812はループの終了イベント、1813はループIDをそれぞれ表している。最後に、本実施形態によって取得できるトレース情報の利用態様の一例について説明する。計算機101のプログラム実行において、ループ実行中に障害が発生した場合を想定して説明する。図19Aに、計算機101が実行するプログラム113の一例としてプログラム1901を示す。図19Bに、ループ実行中に障害が発生した場合のトレース情報117の出力例を示す。トレース情報1903より、forループの10回目の繰り返しを実施していたことがわかる。また、トレース情報1904より、methodCが開始されたことがわかる。従って、トレース情報1902の出力例から、forループの10回目の繰り返し中のmethodCで、何らかの障害が発生したことがわかる。なお、図19Aはループが含まれるプログラム1901を実行した場合のトレース情報117の出力例を示しているが、再帰の場合も同様のトレース情報117の出力が可能である。従って、本実施形態では、ループ再帰に対してトレース情報117の格納の省略を行っても、障害解析に十分なトレース情報117を残すことが可能である。[第2の実施形態]次に、本発明を適用した計算機の第2の実施形態について説明する。第2の実施形態は、ユーザの実行頻度が高いプログラム実行経路を構成するプログラム構成要素を選択し、それを基にバッファサイズを算出する実施形態である。図20に、第2の実施形態における計算機の全体構成を示す。第1の実施形態の全体構成図を示す図1と異なる構成について、以降では説明する。まず、本実施形態では、Java仮想マシン104上に、拡張バッファサイズ計算部2001、バッファ再割当部2002及びユーザ実行データ集計部2003の機能部を新たに設ける。また、メモリ103上に、実行履歴データ2004及びユーザ実行データ2005を保持する。拡張バッファサイズ計算部2001は、プログラム構成要素ツリーから、実行確率の高いプログラム実行経路を抽出し、抽出されたプログラム実行経路に属するノード数からバッファサイズを計算するバッファ再割当部2002は、割当てたバッファサイズのバッファが不足する場合に、バッファの再割当をする。ユーザ実行データ集計部2003は、プログラムの実行履歴データ2004をユーザ毎に集計し、ユーザ実行データ2005を生成する。実行履歴データ2004は、全ユーザのプログラム構成要素ツリーの各ノードプログラム構成要素の実行履歴を示すデータである。ユーザ実行データ2005は、実行履歴データ2004をユーザ毎にプログラム構成要素の各ノードを実行した回数を集計したデータである。なお、実行履歴データ2004及びユーザ実行データ2005は、メモリ103上ではなく、外部記憶装置118に格納されることもある。図21Bは、図21Aのプログラム2101を実行して得られる実行履歴データ2004の一例である。実行履歴データ2004は、ユーザID2102、ノード名2103及びタイムスタンプ2104から構成される。図22は、図21Bの実行履歴データ2004から生成したユーザ実行データ2005の一例である。図22は、ユーザIDが1及び2であるユーザのユーザ実行データ2005を示しており、ユーザ実行データ2005は、ノード名2201と各ノードの実行回数の集計値を示す実行回数2202とから構成される。図23に、本発明を適用した第2の実施形態における処理の概要を示す。なお、S2301からS2304までの処理は、図2に示すS201からS204までの処理と同様の処理であるため説明を省略する。まず、S2305で、拡張バッファサイズ計算部2001が、メモリ103上の実行履歴データ2004を読込み、読込んだ実行履歴データ2004と静的解析データ115からバッファサイズを算出する。そして、算出したサイズのバッファ116をメモリ103上に確保する拡張バッファサイズ計算処理。次に、S2306で、プログラム書換部109が、プログラム書換処理を実行するプログラム書換処理。次に、S2307で、プログラム書換部109が、プログラム実行処理を実行するプログラム実行処理。なお、このとき取得したトレース情報に障害が発生しているか否かを確認する。次に、S2308で、プログラム書換部109が、トレース取得処理を実行するトレース情報取得処理。なお、S2306~S2308は、第1の実施形態と同様の処理である。次に、S2309で、バッファ再割当部2002が、割り当てたバッファ116が不足しているかを確認する。割り当てたバッファ116が不足している場合S2309:Yes、S2310で、バッファ再割当部2002が、バッファ再割当処理を行うバッファ再割当処理。バッファ再割当処理は、バッファ再割当部2002が、メモリ103上にあるバッファ116を、プログラム構成要素ツリーのノード数に基づいて計算したバッファサイズのバッファ116に置き換える処理である。そして、バッファ再割当処理の実行後、S2307に戻る。また、割り当てたバッファ116が不足していない場合S2309:No、S2311でトレース情報117を出力し、一連の処理を終了するトレース情報出力処理。以降では、プログラム構成要素のツリーから、実行頻度の高いプログラム実行経路を抽出する方法について説明する。本実施形態では、プログラム構成要素ツリーの各ノードにノードの実行回数を割り当て、割り当てた実行回数から実行確率を求める。そして、求めた実行確率を元に実行頻度が高いノードから構成されるプログラム実行経路を抽出する。なお、実行確率の差は、条件分岐での分岐方向の偏りに起因することが多いため、本実施形態では条件分岐における実行確率を評価する。実行確率は、条件分岐ノードの子ノードの実行回数÷条件分岐ノードの実行回数から求めるものとする。図24は、拡張バッファサイズ計算部2001が行う拡張バッファサイズ計算処理の流れを示すフローチャートである。拡張バッファサイズ計算処理は、プログラム構成要素ツリーのノード数に基づくバッファサイズと、実行履歴データ2004とから算出したユーザごとに必要とされる効率的なバッファサイズとを求め、求めたバッファサイズのバッファ116をメモリ103上に確保する。はじめに、S2401で、実行履歴データ2004をメモリ103から読込む。次に、S2402で、静的解析データ115から総ノード数を取得する。そして、S2403で、総ノード数に基づいて最大バッファサイズを算出する。次に、S2404で、実行確率によるバッファサイズを算出する。バッファサイズを算出するため、ユーザ実行データ2005に基づき、静的解析データ115から各条件分岐ノード及びその子ノードの実行確率を計算し、実行確率が高いプログラム実行経路を抽出する実行確率によるバッファサイズ算出処理。そして、そのプログラム実行経路に属するノード数から、バッファサイズを算出する。なお、S2404では、実行履歴データ2004をユーザごとに集計した上で、現在実行中のユーザに該当するデータを用いて、プログラム構成要素の実行確率を求めるものとする。次に、S2405で、算出したバッファサイズのバッファ領域をメモリ103上に確保し、処理を終了する。このように、本実施形態では、プログラムの実行経路について実行確率を評価することで、ユーザ毎に最適なバッファサイズを決定することができる。従って、各ユーザが、実行するプログラムに応じてメモリを使用することができる。図25は、拡張バッファサイズ計算部2001が行う実行確率によるバッファサイズ算出処理図24のS2404の処理の流れを示すフローチャートである。実行確率によるバッファサイズ算出処理は、プログラム構成要素の始点メソッドのメソッドノードから順次、最近傍の条件分岐ノードをたどってプログラム実行経路を抽出し、抽出したプログラム実行経路に属するノード数からバッファサイズを算出する。はじめに、S2501で、静的解析データ115中のプログラム構成要素ツリーの各ノードに実行回数データを付与する。なお、ここで付与される実行回数データは、ユーザ実行データ2005の付与対象のノードに対する実行回数である。次に、S2502で、プログラム構成要素ツリーの始点ノードをカレントノードに設定する。そして、S2503で、未評価の条件分岐ノードがあるかを確認する。未評価の条件分岐ノードとは、実行確率を評価していない子ノードを持つ条件分岐ノードのことをいう。未評価の条件分岐ノードがある場合S2503:Yes、S2504で、カレントノードからたどれる最近傍の条件分岐ノードをカレントノードに設定する。また、未評価の条件分岐ノードがない場合S2503:No、S2506に進む。ただし、評価対象のノードはカレントノードから見てプログラム構成要素ツリーの末端方向にあるノードとする。次に、S2505で、条件分岐ノードの子ノードの実行確率を算出する。なお、本実施形態では、子ノードの実行確率は条件分岐ノードの子ノードの実行回数÷条件分岐ノードの実行回数により算出するものとする。次に、S2506で、条件分岐ノードの子ノード間で実行確率を比較し、実行確率が低いノードをバッファサイズの算出対象から除外する。ただし、子ノード間で実行確率を比較するとき、実行確率の差が閾値以下の場合、子ノードを除外対象としなくても良い。なお、この閾値は予め所定の値に設定するのでも、ユーザが指定するのでもよい。そして、S2506終了後、S2503に戻る。ただし、S2506で除外されたノードは、S2503の評価対象とはならないものとする。最後に、S2507で、プログラム構成要素ツリー中の除外されなかったノードの数を求め、そのノード数からバッファサイズを算出して処理を終了する。なお、プログラム実行経路が複数存在する場合は、ノード数が最大となるプログラム実行経路を元にバッファサイズを算出する。また、バッファサイズの算出方法は、第1の実施形態と同様の方法で行う。図26Aに、図21Aに示すプログラム2101の各ノードの実行確率表と、ノードを選択する際に用いる実行確率の差の閾値設定を行う表示画面の一例を示す。各ノードの実行確率表は、ノード名2601、ノードの実行回数2602及びノードの実行確率2603からなる。また、実行確率の差の閾値は2604でユーザが指定できる。ここでは、実行確率の差の閾値を10に設定した例を示している。これは、条件分岐ノードの実行確率の差が10以上である場合、その条件分岐に属する子ノードをバッファサイズの算出対象から除外することを意味する。図26Bは、図26Aに示す各ノードの実行確率を基に選択されたプログラム構成要素ツリーを示す。はじめに、プログラム構成要素ツリーの最初の条件分岐ノードであるif_12606について、子ノードの実行確率を評価する。図26Aの各ノードの実行確率表より、子ノードであるmethodB2607の実行確率は30、if_22609の条件分岐ノードの実行確率は70であることがわかる。従って、実行確率の差は、70-30=40であるため、methodB2607以下のノードである、methodB2607及びmethodC2608がバッファサイズの算出対象から除外される。なお、図26Aでは、除外されたノードを点線で描いている。図27は、バッファ再割当部2002が行うバッファ再割当処理図23のS2310の処理の概要をフローチャートで示す。バッファ再割当処理は、拡張バッファサイズ計算部2001が確保したバッファ116を、最大バッファサイズまでのバッファ116に割り当て直す。なお、本実施形態では、バッファ再割当処理を行うのは、プログラム113を実行して取得したトレース情報117を格納するために必要なバッファサイズが、確保したバッファサイズでは不足する場合を想定しているが、これに限られず、ユーザが指定した場合等、任意の条件で処理を実行できる。はじめに、S2701で、拡張バッファサイズ計算部2001で算出した最大バッファサイズのバッファ116をメモリ103上に確保する。次に、S2702で、既存のバッファ116実行履歴データ2004に基づいて計算したバッファサイズのバッファ内に格納してあるトレース情報117を確保したバッファ116にコピーする。そして、S2703で、既存のバッファ116の領域を解放し、バッファ再割当処理を終了する。本処理により、プログラム中の実行確率の低い経路を実行したことで、トレース取得量がバッファサイズよりも多くなったとしても、トレース情報117の取得漏れを生じさせることなく、トレースを行うことができる。本実施形態では、実行履歴データ2004からシステムのユーザごとに、おおよそ必要なバッファサイズを算出することを考える。そして、バッファ116が不足したとき等、任意の条件で第1の実施形態に示すプログラム構成要素ツリーのノード数に基づいて計算したバッファサイズのバッファ116に割り当て直すことを想定している。従って、実行履歴データ2004に基づいて計算したバッファサイズのバッファ116と、プログラム構成要素ツリーのノード数に基づいて計算したバッファサイズのバッファ116とを併用することにより、トレース情報117を格納するバッファ116をさらに効率的に利用することができる。