(57)【要約】【課題】オーバヘッドを軽減するために命令を採取する頻度を下げた場合でも正確な命令トレースを生成すること。【解決手段】分割部１１２は、プロセッサが実行する命令を所定間隔でサンプリングして得られたサンプリングデータ１２１を、命令トレースの取得対象の命令列が１回実行される間に取得された単位の部分命令列１２２へ分割する。そして、部分命令列１２２は、合成制御部１１３の制御によって、類似度と尤度に基づいて１つに合成され、命令トレース出力部１１４によって出力される。【選択図】        図８
2010009282.tif 000002
【特許請求の範囲】
【請求項１】
複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成プログラムであって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割手順と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出手順と、
前記類似度算出手順によって算出された類似度に基づいて部分命令列の組合せを選択する選択手順と、
前記選択手順によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成手順と、
前記組合せパターン生成手順によって生成された組合せパターン毎に尤度を算出する尤度算出手順と、
前記尤度算出手順によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換手順と
をコンピュータに実行させることを特徴とする命令トレース生成プログラム。
【請求項２】
合成制御手順をコンピュータにさらに実行させ、
前記選択手順は、前記類似度算出手順によって算出された類似度が最も高い部分命令列の組合せを選択し、
前記部分命令列置換手順は、前記尤度算出手順によって算出された尤度が最も高い組合せパターンを、前記選択手順によって選択された部分文字列に代えて、部分文字列として前記記憶手段に記憶させ、
前記合成制御手順は、前記記憶手段に記憶される部分命令列が１つになるまで、前記類似度算出手順と、前記選択手順と、前記組合せパターン生成手順と、前記部分命令列置換手順とを制御することを特徴とする請求項１に記載の命令トレース生成プログラム。
【請求項３】
前記類似度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする請求項１または２に記載の命令トレース生成プログラム。
【請求項４】
前記尤度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする請求項１から３のいずれか１つに記載の命令トレース生成プログラム。
【請求項５】
複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成装置であって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割手段と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出手段と、
前記類似度算出手段によって算出された類似度に基づいて部分命令列の組合せを選択する選択手段と、
前記選択手段によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成手段と、
前記組合せパターン生成手段によって生成された組合せパターン毎に尤度を算出する尤度算出手段と、
前記尤度算出手段によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換手段と
を備えることを特徴とする命令トレース生成装置。
【請求項６】
複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成方法であって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割工程と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出工程と、
前記類似度算出工程によって算出された類似度に基づいて部分命令列の組合せを選択する選択工程と、
前記選択工程によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成工程と、
前記組合せパターン生成工程によって生成された組合せパターン毎に尤度を算出する尤度算出工程と、
前記尤度算出工程によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換工程と
を含むことを特徴とする命令トレース生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、命令トレースを生成する命令トレース生成プログラム、命令トレース生成装置および命令トレース生成方法に関する。
【背景技術】
【０００２】
従来より、動作するプログラムの性能最適化やデバッグ等を目的として、命令トレースを取得する技術が知られている。命令トレースとは、プロセッサによって実行された個々の命令を時系列に記録したデータである。命令トレースを参照することにより、プロセッサが、プログラムを動作させるために、どの命令をどの順序で実行しているかを詳細に把握することができ、性能最適化等のための適切な対策を講じることが可能になる。
【０００３】
このように命令トレースを取得することは、プログラムの性能最適化等において非常に有効な手法であるが、命令トレースを取得するためにオーバヘッドが生じてしまうという弊害がある。例えば、１命令毎に割込みをかけて命令トレースを取得することとした場合、このオーバヘッドのためにプログラムの実行時間が数百〜数千倍になることがある。命令トレースの取得時のプログラムの実行時間が通常時とこれだけ異なってしまうと、取得された命令トレースは、プログラムの通常時の挙動を正しく反映しているとは言えず、プログラムの挙動を把握する情報として不適切なものとなる。
【０００４】
命令トレースの取得時のプログラムのオーバヘッドを軽減するための技術として、全ての命令のトレースを取得するのではなく、分岐命令のみのトレースを取得する技術が知られている。プログラムの命令列における分岐命令の出現頻度が１０命令に１つ程度であるとすると、分岐命令のみのトレースを取得することにより、オーバヘッドを１／１０程度に減らすことができる。また、分岐命令のトレースを取得しておけば、分岐命令が実行される間にどの命令がどの順序で実行されたかについては、分岐命令のトレースとプログラム中の命令列を比較することによりある程度推定することができる。
【０００５】
【特許文献１】特開２００２−３４２１１４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、分岐命令のみのトレースを取得することによって、オーバヘッドを１／１０程度に減らすことができたとしても、プログラムによっては、トレース取得時の挙動が通常時と異なってしまうことがあった。そこで、トレースを取得する頻度をさらに下げてオーバヘッドを軽減することが考えられるが、その場合、採取された命令間でどのような命令がどの順序で実行されたかを推定することが困難になるという問題があった。
【０００７】
開示の技術は、上述した従来技術による問題点を解消するためになされたものであり、オーバヘッドを軽減するために命令を採取する頻度を下げた場合でも正確な命令トレースを生成することができる命令トレース生成プログラム、命令トレース生成装置および命令トレース生成方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、本願の開示する命令トレース生成装置は、一つの態様において、複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成装置であって、前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割手段と、前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出手段と、前記類似度算出手段によって算出された類似度に基づいて部分命令列の組合せを選択する選択手段と、前記選択手段によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成手段と、前記組合せパターン生成手段によって生成された組合せパターン毎に尤度を算出する尤度算出手段と、前記尤度算出手段によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換手段とを備える。
【０００９】
この命令トレース生成装置の態様によれば、プロセッサによって実行された命令を、所定の間隔でサンプリングして得られたサンプリングデータを部分命令列に分割し、類似度と尤度に基づいて合成して命令トレースを生成することとしたので、実行中のプログラムの挙動に影響がない程度に情報を取得する頻度を下げつつ、所望する命令トレースを正確に取得することができる。
【発明の効果】
【００１０】
本願の開示する命令トレース生成プログラム、命令トレース生成装置および命令トレース生成方法の一つの態様によれば、オーバヘッドを軽減するために命令を採取する頻度を下げた場合でも正確な命令トレースを生成することができるという効果を奏する。
【発明を実施するための最良の形態】
【００１１】
以下に添付図面を参照して、本願の開示する命令トレース生成プログラム、命令トレース生成装置および命令トレース生成方法の好適な実施の形態を詳細に説明する。
【実施例１】
【００１２】
まず、本実施例に係る命令トレース生成方法の概要について説明する。本実施例に係る命令トレース生成方法は、オーバヘッドを軽減するためにトレース頻度を下げた場合であっても、どの命令がどの順序で実行されたかを高い精度で再現した命令トレースを取得することを実現する。
【００１３】
具体的には、本実施例に係る命令トレース生成方法は、プロセッサによって実行される命令を所定の間隔で取得して得られたサンプリングデータに基づいて、命令トレースを生成する。プロセッサによって実行される命令を取得する間隔を十分に大きくすることにより、オーバヘッドを軽減し、実行時間の変化によるプログラムの挙動の変化を抑制することができる。
【００１４】
上記のようにサンプリングデータに基づいて命令トレースを生成するため、本実施例に係る命令トレース生成方法は、命令トレースの取得対象の命令列が再現性を有することを前提とする。ここでいう再現性とは、トレースの取得対象の命令列を複数回実行した場合に、それぞれの回において、命令列中の命令が同じ順序で実行されることを意味する。
【００１５】
なお、トレースの取得対象のプログラムは、再現性を有するように予めプログラミングされている必要は必ずしもない。すなわち、再現性は、例えば、プログラムに入力するデータを毎回同じものにするというように、プログラムの動作条件を毎回同じにすることによって実現されてもよい。また、命令トレースの取得対象の命令列は、プログラムに含まれる命令列全体でもよいし、その一部であってもよい。
【００１６】
以下に、具体例を示しながら、本実施例に係る命令トレース生成方法について説明する。図１は、プログラムの一例を示す図である。図１に示したプログラムは、ｍａｉｎ（）という関数と、ｆｕｎｃ＿Ｍ（）という関数を含んでいる。ｍａｉｎ（）は、プログラムが起動されると最初に実行される関数であり、ｆｕｎｃ＿Ｍ（）を無限回数呼び出す。ｆｕｎｃ＿Ｍ（）は、ｆｕｎｃ＿Ａ（）を１回呼び出した後、ｆｕｎｃ＿Ｂ（）を３回呼び出し、その後、ｆｕｎｃ＿Ｃ（）を１回呼び出す。
【００１７】
ここでは、図１に示したプログラムにおけるｆｕｎｃ＿Ｍ（）の部分をトレースの取得対象とし、この部分が再現性を有しているものとする。また、ｆｕｎｃ＿Ｍ（）において実行されるｆｕｎｃ＿Ａ（）、ｆｕｎｃ＿Ｂ（）およびｆｕｎｃ＿Ｃ（）は、それぞれ１０個の命令を有するものとする。また、これらの関数には分岐命令が存在しないものとする。
【００１８】
図２は、命令のサンプリングの一例を示す図である。本実施例において各命令に付与されている文字列の「：」よりも前の部分は、その命令が属している関数の名称を表し、「：」よりも後ろの部分は、関数の先頭を基準とした場合のその命令のオフセット（以下「関数内オフセット」という）を表す。例えば、「ｆｕｎｃ＿Ａ：０」は、ｆｕｎｃ＿Ａ（）という名前の関数における先頭の命令であることを示す。
【００１９】
図１に示したプログラムを動作させると、ｆｕｎｃ＿Ｍ（）が複数回呼び出され、図２に示した命令列１１がプロセッサによって実行される。すなわち、ｆｕｎｃ＿Ｍ（）が１回目に呼び出されたときに、ｆｕｎｃ＿Ａ（）に相当する１０個の命令が１回実行され、ｆｕｎｃ＿Ｂ（）に相当する１０個の命令が３回実行され、ｆｕｎｃ＿Ｃ（）に相当する１０個の命令が１回実行される。そして、ｆｕｎｃ＿Ｍ（）が２回目の以降に呼び出された場合も、１回目と同じ命令が同じ順序でプロセッサによって実行される。なお、説明を簡単にするため、ｆｕｎｃ＿Ｂ（）を３回実行するためのループ処理や、関数の呼び出しや復帰のための命令は無視することとする。
【００２０】
命令列１１は、命令トレースに相当する命令列であるが、プロセッサが命令を１つ実行する毎に情報を取得したのではオーバヘッドが大きくなり、プログラムの挙動に影響を与える。そこで、ここでは、プロセッサによって実行される命令を７個毎にサンプリングすることとする。なお、サンプリング間隔を７とするのは一例であり、サンプリング間隔は、オーバヘッドが十分に小さくなる任意の値とすることができる。
【００２１】
ｆｕｎｃ＿Ｍ（）を何度も呼び出しながら、命令を７個毎にサンプリングすることにより、図２および図３に示すようなサンプリングデータ２１が得られる。サンプリングデータ２１は、命令トレースの取得対象であるｆｕｎｃ＿Ｍ（）が１回呼び出された場合にプロセッサによって実行される命令数分の命令を含んでいる。具体的には、ｆｕｎｃ＿Ｍ（）が１回呼び出された場合、上記の通り５０個の命令がプロセッサによって実行されるが、サンプリングデータ２１は、５０個の命令を含んでいる。こうしてサンプリングデータ２１が取得された時点で、図１に示したプログラムの実行を停止して構わない。
【００２２】
こうしてサンプリングデータ２１が得られた後、サンプリングデータ２１が部分命令列に分割される。具体的には、本実施例に係る命令トレース生成方法では、サンプリングデータ２１が、命令トレースの取得対象であるｆｕｎｃ＿Ｍ（）が１回呼び出された間に取得された単位でサンプリングデータ２１が部分命令列に分割される。
【００２３】
図４は、分割命令列の一例を示す図である。図４に示すように、サンプリングデータ２１は、Ｐ−１〜Ｐ−７という７つの部分命令列に分割される。Ｐ−１は、ｆｕｎｃ＿Ｍ（）が１回目に呼び出されたときにサンプリングによって得られた命令列であり、Ｐ−２は、ｆｕｎｃ＿Ｍ（）が２回目に呼び出されたときにサンプリングによって得られた命令列である。
【００２４】
続いて、部分命令列の組合せ毎に類似度が算出される。なお、ここでいう類似度は、最終的に得られる命令トレースにおいて隣り合う関係にある可能性が高い部分命令列の組合せほど高く評価され、完全一致の場合に最も高くなるわけではない。
【００２５】
例えば、
「ｆｕｎｃ＿Ａ：０」と「ｆｕｎｃ＿Ａ：７」
という２つの命令を含む部分命令列Ａと、
「ｆｕｎｃ＿Ａ：０」と「ｆｕｎｃ＿Ａ：７」
という２つの命令を含む部分命令列Ｂと、
「ｆｕｎｃ＿Ａ：１」と「ｆｕｎｃ＿Ａ：８」
という２つの命令を含む部分命令列Ｃとがあったものとする。
【００２６】
この場合、最終的に得られる命令トレースにおいて、命令が、
「ｆｕｎｃ＿Ａ：０」、「ｆｕｎｃ＿Ａ：０」
という順序で隣り合って並び、その後方で、
「ｆｕｎｃ＿Ａ：７」、「ｆｕｎｃ＿Ａ：７」
という順序で隣り合って並ぶ可能性よりも、命令が、
「ｆｕｎｃ＿Ａ：０」、「ｆｕｎｃ＿Ａ：１」
という順序で隣り合って並び、その後方で、
「ｆｕｎｃ＿Ａ：７」、「ｆｕｎｃ＿Ａ：８」
という順序で隣り合って並ぶ可能性が高い。このため、上記の例の場合、部分命令列Ａと部分命令列Ｂの組合せよりも、部分命令列Ａと部分命令列Ｃの組合せの方が類似度が高いと評価される。
【００２７】
部分命令列の組合せの類似度は、各部分命令列に含まれる命令を先頭から順に比較して得られた命令単位の類似度を合計することにより算出される。そして、命令単位の類似度は、命令の関数名が一致し、関数内オフセットの差分の絶対値が１に近いほど高く評価される。一方、命令の関数名が一致しない場合や、命令の関数名が一致しても関数内オフセットの差分が大きい場合には、命令単位の類似度は、低く評価される。図５は、類似度の算出結果の一例を示す図である。図５に示すように、類似度は、全ての部分命令列の組合せについて算出される。
【００２８】
続いて、算出された類似度が最も高い部分命令列の組合せが選択される。例えば、類似度の算出結果が図５に示した通りであるとすると、Ｐ−４とＰ−５の組合せが、類似度が最も高い部分命令列の組合せとして選択される。
【００２９】
そして、選択された組合せに含まれる２つの部分命令列が１つに合成される。部分命令列の合成は、それぞれの部分命令列に含まれる命令を交互に組み合わせた複数の組合せパターンを生成し、その中から最も尤度が高いものを選択することにより行われる。そして、合成前の２つの部分命令列は、合成後の部分命令列に置き換えられる。なお、ここでいう尤度は、命令の並びの尤もらしさを意味する。
【００３０】
なお、類似度が最も高い部分命令列の組合せのみを合成して尤度を算出するのではなく、類似度が高い順に部分命令列の組合せを所定の個数だけ選択し、組合せ毎に組合せパターンを生成し、最も高い尤度が得られた組合せを置き換えることとしてもよい。例えば、複数の組合せのうち、部分文字列ＡとＢの組合せを合成した組合せパターンＣが最も尤度が高ければ、部分文字列ＡとＢを組合せパターンＣに置き換えることとしてもよい。
【００３１】
図６は、部分命令列の合成の一例を示す図である。図６に示すように、まず、選択されたＰ−４とＰ−５という２つの部分命令列に基づいて、Ｐ−４に含まれる命令が先になるように命令を交互に組み合わせたＰ−４−５と、Ｐ−５に含まれる命令が先になるように命令を交互に組み合わせたＰ−５−４とが生成される。そして、生成されたＰ−４−５とＰ−５−４の尤度がそれぞれ算出される。
【００３２】
尤度は、部分命令列の先頭から前後する命令を比較して命令単位の尤度を算出していき、命令単位の尤度を合計することにより算出される。そして、命令単位の尤度は、命令の関数名が一致し、関数内オフセットの値が昇順に並んでいてその差分が１に近いほど高く評価される。一方、命令の関数名が一致しない場合、命令の関数名が一致しても関数内オフセットの値が降順の場合、命令の関数名が一致して関数内オフセットの値が昇順であってもその差分が大きい場合には、命令単位の尤度は、低く評価される。命令列の順序が実行順序の通りであれば、前後の命令の関数名が一致し、オフセットの値が昇順になることが多いはずだからである。
【００３３】
図６に示した例では、関数内オフセットの値が昇順に並んでいるものが多いＰ−５−４が選択され、Ｐ−４およびＰ−５と置き換えられる。その後、再び、部分命令列の組合せの類似度が算出され、最も類似度の高い組合せが合成され、合成前の２つの部分命令列が、合成後の部分命令列に置き換えられる。この処理を繰り返し実行することにより、最終的に部分命令列は１つに合成されることになる。このようにして合成された命令列は、図２に示した命令列１１の１回目の部分、すなわち、取得すべき命令トレースと同じものとなることが期待できる。
【００３４】
ここで、部分命令列の合成についてさらに詳しく説明しておく。合成対象の部分命令列の一方、もしくは、双方が部分命令列を合成して得られたものである場合、合成して得られた部分命令列は、いったん分割当初の部分命令列に分割され、その後、組合せパターンが生成される。このとき、組合せパターンは、既に合成された部分命令列の順序が変化しないように生成される。例えば、図７に示すように、まだ合成されていないＰ−７と、Ｐ−５が先頭になるようにＰ−４とＰ−５を合成して得られたＰ−５−４とを合成する場合、Ｐ−４がＰ−５よりも前にならないように組合せパターンが生成される。
【００３５】
すなわち、図７の例の場合、Ｐ−７、Ｐ−５、Ｐ−４の順に命令を交互に組み合わせたＰ−７−５−４や、Ｐ−５、Ｐ−７、Ｐ−４の順に命令を交互に組み合わせたＰ−５−７−４や、Ｐ−５、Ｐ−４、Ｐ−７の順に命令を交互に組み合わせたＰ−５−４−７が組合せパターンとして生成される。一方、Ｐ−４、Ｐ−５、Ｐ−７の順に命令を交互に組み合わせるといったように、Ｐ−４がＰ−５よりも前に位置する組合せパターンは生成されない。
【００３６】
次に、本実施例に係る命令トレース生成方法を実行する命令トレース生成装置の構成について説明する。図８は、本実施例に係る命令トレース生成装置１００の構成を示す機能ブロック図である。図８に示すように、命令トレース生成装置１００は、制御部１１０と、記憶部１２０とを有する。
【００３７】
制御部１１０は、命令トレース生成装置１００を全体制御する制御部であり、命令情報設定部１１１と、分割部１１２と、合成制御部１１３と、類似度算出部１１３ａと、選択部１１３ｂと、組合せパターン生成部１１３ｃと、尤度算出部１１３ｄと、部分命令列置換部１１３ｅと、命令トレース出力部１１４とを有する。
【００３８】
命令情報設定部１１１は、記憶部１２０に記憶されているサンプリングデータ１２１に対して命令情報を設定する。サンプリングデータ１２１は、命令トレースの取得対象の命令列を複数回実行している間にプロセッサによって実行された命令を所定間隔でサンプリングして得られたデータであり、命令トレースを生成するために十分な数の命令を含んでいる。
【００３９】
具体的には、命令情報設定部１１１は、サンプリングデータ１２１に含まれる命令毎にその命令が属する関数の関数名とその命令の関数内オフセットを取得し、取得された関数名と関数内オフセットをその命令に対応付けて命令情報として設定する。なお、関数名と関数内オフセットは、例えば、命令のアドレスをプログラム中のシンボルテーブルと照合することによって取得することができる。
【００４０】
分割部１１２は、命令トレースの取得対象の命令列が１回実行される間にサンプリングされた単位で、サンプリングデータ１２１を複数の部分命令列１２２に分割して記憶部１２０に格納する。例えば、命令トレースの取得対象の命令列の命令数をＴとし、サンプリング間隔をＰとした場合、Ｔ／Ｐ個毎にサンプリングデータ１２１を分割していくことにより、上記の単位での分割を容易に行うことができる。なお、命令トレースの取得対象の命令列における先頭付近の関数がわかっていれば、その関数を基準として、サンプリングデータ１２１を上記の単位で分割することもできる。また、分割の基準とするための関数もしくは命令列をプログラムに含めておき、それらを基準としてサンプリングデータ１２１を分割することもできる。また、これらの方式を任意に組み合わせることもできる。
【００４１】
合成制御部１１３は、分割部１１２によって分割された部分命令列１２２が適切な順序で１つに合成されるまで、類似度算出部１１３ａ、選択部１１３ｂ、組合せパターン生成部１１３ｃ、尤度算出部１１３ｄおよび部分命令列置換部１１３ｅを制御する。
【００４２】
類似度算出部１１３ａは、部分命令列１２２の組合せの全てについて類似度を算出する。類似度は、各部分命令列１２２に含まれる命令を先頭から順に比較し、比較結果を類似度得点データ１２４と照合して得られた得点（命令単位の類似度）を合計することにより算出される。
【００４３】
類似度得点データ１２４の一例を図９に示す。図９に示すように、類似度得点データ１２４には、関数名が一致した場合の得点として「１０」が設定され、関数名が不一致であった場合の得点として、それよりも低い「０」が設定されている。また、関数名が一致した場合に関数内オフセットの差分に基づいて与えられる得点として、差分の絶対値が「１」に近いほど高い値が設定されている。差分の絶対値が「１」に近いほど、前後して実行された命令である可能性が高いからである。
【００４４】
選択部１１３ｂは、類似度算出部１１３ａによって算出された類似度に基づいて、最も類似度の高い部分命令列１２２の組合せを選択する。組合せパターン生成部１１３ｃは、選択部１１３ｂによって選択された組合せに含まれる分割当初の部分命令列１２２を組み合わせて複数の組合せパターン１２３を生成する。組合せパターン１２３の具体的な生成方法は、既に図６や図７を用いて説明した通りであり、組合せパターン１２３は、図６に示したＰ−４−５およびＰ−５−４や、図７に示したＰ−７−５−４、Ｐ−５−７−４およびＰ−５−４−７に相当する。
【００４５】
尤度算出部１１３ｄは、組合せパターン生成部１１３ｃによって生成された各組合せパターン１２３の尤度を算出する。尤度は、組合せパターン１２３に含まれる命令を先頭から順に前後で比較し、比較結果を尤度得点データ１２５と照合して得られた得点（命令単位の尤度）を合計することにより算出される。
【００４６】
尤度得点データ１２５の一例を図１０に示す。図１０に示すように、尤度得点データ１２５には、関数名が一致した場合の得点として「１０」が設定され、関数名が不一致であった場合の得点として、それよりも低い「０」が設定されている。また、関数名が一致した場合に関数内オフセットの差分に基づいて与えられる得点として、差分が正であり、かつ、差分の大きさが「１」に近いほど高い値が設定されている。なお、ここでは、後の命令の関数内オフセットから前の命令の関数内オフセットを減算することによって関数内オフセットの差分を算出することを前提としており、差分が正であるということは、関数内オフセットが昇順に並んでいることを意味する。
【００４７】
部分命令列置換部１１３ｅは、尤度算出部１１３ｄによって算出された尤度に基づいて、複数の組合せパターン１２３の中から尤度が最も高いものを選択する。そして、部分命令列置換部１１３ｅは、選択した組合せパターン１２３を、選択部１１３ｂによって選択された組合せに含まれる部分命令列１２２に代えて、部分命令列１２２として記憶部１２０に記憶させる。なお、部分命令列置換部１１３ｅによって選択された組合せパターン１２３が部分命令列１２２として記憶部１２０に記憶された後、他の組合せパターン１２３は削除される。
【００４８】
なお、ここでは、部分命令列置換部１１３ｅが選択した組合せパターン１２３を、選択部１１３ｂによって選択された組合せに含まれる部分命令列１２２に代えて、部分命令列１２２として記憶部１２０に記憶させることとしたが、この通りである必要はない。具体的には、以降の処理において、選択部１１３ｂによって選択された組合せに含まれる部分命令列１２２の代わりに、尤度が最も高い組合せパターン１２３が使用されるようになればよい。
【００４９】
命令トレース出力部１１４は、合成制御部１１３の制御によって部分命令列１２２が１つの命令列に合成された後に、合成後の命令列を命令トレースとして出力する。
【００５０】
記憶部１２０は、各種情報を記憶する記憶デバイスであり、サンプリングデータ１２１と、部分命令列１２２と、組合せパターン１２３と、類似度得点データ１２４と、尤度得点データ１２５とを記憶する。なお、記憶部１２０が記憶する各種データについては、既に説明済みであるため、ここでは説明を省略する。
【００５１】
次に、図８に示した命令トレース生成装置１００の動作について説明する。図１１は、命令トレース生成装置１００による命令トレース生成処理の処理手順を示すフローチャートである。
【００５２】
命令トレース生成処理においては、まず、命令情報設定部１１１が、予め採取されたサンプリングデータ１２１に含まれる各命令に、関数名と関数内オフセットを命令情報として設定する（ステップＳ１０１）。そして、分割部１１２が、サンプリングデータ１２１を部分命令列１２２に分割し、部分命令列１２２を記憶部１２０に記憶させる（ステップＳ１０２）。
【００５３】
ここで、記憶部１２０に記憶されている部分命令列１２２が１つでなければ（ステップＳ１０３否定）、類似度算出部１１３ａが、部分命令列１２２の組合せを全て生成する（ステップＳ１０４）。そして、類似度算出部１１３ａは、生成された組合せのうち、未選択のものを１つ選択し（ステップＳ１０５）、選択できた場合は（ステップＳ１０６否定）、選択した組合せに対して後述する類似度算出処理を実行して類似度を算出する（ステップＳ１０７）。
【００５４】
そして、類似度算出処理が完了した後、類似度算出部１１３ａは、ステップＳ１０５に戻って、次の未選択の組合せの取得を試みる。こうして、全ての組合せが選択済みとなり、全ての組合せの類似度の算出が完了すると（ステップＳ１０６肯定）、選択部１１３ｂが、類似度の最も高い部分命令列１２２の組合せを選択する（ステップＳ１０８）。
【００５５】
続いて、組合せパターン生成部１１３ｃが、選択された部分命令列１２２の組合せから複数の組合せパターン１２３を生成する（ステップＳ１０９）。そして、尤度算出部１１３ｄが、生成された組合せパターン１２３のうち、未選択のものを１つ選択し（ステップＳ１１０）、選択できた場合は（ステップＳ１１１否定）、選択した組合せパターン１２３に対して後述する尤度算出処理を実行して尤度を算出する（ステップＳ１１２）。
【００５６】
そして、尤度算出処理が完了した後、尤度算出部１１３ｄは、ステップＳ１１０に戻って、次の未選択の組合せパターン１２３の取得を試みる。こうして、全ての組合せパターン１２３選択済みとなり、全ての組合せパターン１２３の尤度の算出が完了する。すると（ステップＳ１１１肯定）、部分命令列置換部１１３ｅが、尤度の最も高い組合せパターン１２３を、合成前の部分命令列１２２に代えて、部分命令列１２２として記憶部１２０に記憶させる（ステップＳ１１３）。そして、部分命令列置換部１１３ｅの処理が完了した後、ステップＳ１０３以降が再実行される。
【００５７】
こうして、ステップＳ１０３〜ステップＳ１１３が繰り返し実行されて、部分命令列１２２が１つに合成される。すると（ステップＳ１０３肯定）、命令トレース出力部１１４が、１つに合成された部分命令列１２２からステップＳ１０１で設定された命令情報を削除する等の加工を行って、命令トレースを生成する（ステップＳ１１４）。そして、命令トレース出力部１１４は、生成された命令トレースを出力する（ステップＳ１１５）。
【００５８】
図１２は、ステップＳ１０７の類似度算出処理の処理手順を示すフローチャートである。類似度算出処理において、類似度算出部１１３ａは、まず、類似度を０に設定する（ステップＳ２０１）。そして、類似度算出部１１３ａは、類似度の算出対象の一方の部分命令列１２２から未取得の命令情報のうち先頭のものを取得する（ステップＳ２０２）。ここで、その部分命令列１２２の全ての命令情報を既に取得済であった場合（ステップＳ２０３肯定）、類似度算出部１１３ａは、類似度算出処理を終了する。
【００５９】
一方、命令情報を取得できた場合（ステップＳ２０３否定）、類似度算出部１１３ａは、類似度の算出対象のもう一方の部分命令列１２２から未取得の命令情報のうち先頭のものを取得する（ステップＳ２０４）。ここで、その部分命令列１２２の全ての命令情報を既に取得済であった場合（ステップＳ２０５肯定）、類似度算出部１１３ａは、類似度算出処理を終了する。
【００６０】
もう一方の部分命令列１２２からも命令情報を取得できた場合（ステップＳ２０５否定）、類似度算出部１１３ａは、取得された命令情報に含まれる関数名を比較する（ステップＳ２０６）。そして、関数名が一致しなかった場合（ステップＳ２０７否定）、類似度算出部１１３ａは、類似度得点データ１２４から、関数名不一致時の点数を取得して類似度に加算し（ステップＳ２０８）、ステップＳ２０２から処理を再開する。
【００６１】
関数名が一致した場合（ステップＳ２０７肯定）、類似度算出部１１３ａは、類似度得点データ１２４から、関数名一致時の点数を取得して類似度に加算する（ステップＳ２０９）。さらに、類似度算出部１１３ａは、取得された命令情報に含まれる関数内オフセットの差分を算出する（ステップＳ２１０）。そして、類似度算出部１１３ａは、類似度得点データ１２４から、算出された差分に対応する点数を取得して類似度に加算し（ステップＳ２１１）、ステップＳ２０２から処理を再開する。
【００６２】
図１３は、尤度算出処理の処理手順を示すフローチャートである。尤度算出処理において、尤度算出部１１３ｄは、まず、尤度を０に設定する（ステップＳ３０１）。そして、尤度算出部１１３ｄは、尤度の算出対象の組合せパターン１２３から先頭の命令情報を取得する（ステップＳ３０２）。
【００６３】
そして、尤度算出部１１３ｄは、尤度の算出対象の組合せパターン１２３から次の命令情報を取得する（ステップＳ３０３）。ここで、その組合せパターン１２３の全ての命令情報を既に取得済であった場合（ステップＳ３０４肯定）、尤度算出部１１３ｄは、尤度算出処理を終了する。
【００６４】
組合せパターン１２３から次の命令情報を取得できた場合（ステップＳ３０４否定）、尤度算出部１１３ｄは、今回取得された命令情報に含まれる関数名を直前に取得された命令情報に含まれる関数名と比較する（ステップＳ３０５）。そして、関数名が一致しなかった場合（ステップＳ３０６否定）、尤度算出部１１３ｄは、尤度得点データ１２５から、関数名不一致時の点数を取得して尤度に加算し（ステップＳ３０７）、ステップＳ３０３から処理を再開する。
【００６５】
関数名が一致した場合（ステップＳ３０６肯定）、尤度算出部１１３ｄは、尤度得点データ１２５から、関数名一致時の点数を取得して尤度に加算する（ステップＳ３０８）。さらに、尤度算出部１１３ｄは、今回取得された命令情報に含まれる関数内オフセットから直前に取得された命令情報に含まれる関数内オフセットを減算して差分を算出する（ステップＳ３０９）。そして、尤度算出部１１３ｄは、尤度得点データ１２５から、算出された差分に対応する点数を取得して尤度に加算し（ステップＳ３１０）、ステップＳ３０３から処理を再開する。
【００６６】
上述してきたように、本実施例では、プロセッサによって実行された命令を、所定の間隔でサンプリングして得られたサンプリングデータを部分命令列に分割し、類似度と尤度に基づいて合成することとしたので、実行中のプログラムの挙動に影響がない程度に情報を取得する頻度を下げつつ、所望する命令トレースを取得することができる。
【００６７】
なお、上述した例では、所定数間隔で命令をサンプリングして得られたサンプリングデータから命令トレースを生成する例を示したが、本実施例に係る命令トレース方法は、所定時間間隔で命令をサンプリングして得られたサンプリングデータに対しても適用することができる。所定時間間隔で命令をサンプリングして得られたサンプリングデータに対して本実施例に係る命令トレース方法を適用した場合、得られ命令トレースは、実行時間重み付き命令トレースとなる。
【００６８】
図１４は、実行時間重み付き命令トレースの生成の一例を示す図である。命令列１２は、図１に示したプログラムを動作させた場合の通常の命令トレースに相当する命令列であり、サンプリングデータ２２は、プロセッサによって実行された命令を所定時間間隔でサンプリングして得られた命令列である。プロセッサによって実行される命令の実行時間は、命令の種類等によって異なるため、サンプリングデータ２２には、各命令の実行時間の長短が反映される。
【００６９】
このようなサンプリングデータ２２を、本実施例に係る命令トレース方法を用いて合成することにより、実行時間重み付き命令トレース３２が得られる。実行時間重み付き命令トレース３２では、同一の命令が連続する数によってその命令の実行時間が示される。このような実行時間重み付き命令トレースを生成することにより、命令の実行順序だけでなく、命令の実行時間まで知ることが可能になり、プログラムの最適化等に非常に有効な情報を得ることができる。
【００７０】
なお、実行時間重み付き命令トレースを生成する場合は、同一の命令が連続して命令列に出現することが通常であるため、関数内オフセットの差分が０のときに最も得点が高くなるように類似度得点データ１２４と尤度得点データ１２５を設定する必要がある。
【実施例２】
【００７１】
実施例１では、関数名と関数内オフセットに基づいて部分命令列を合成する例を示したが、ベーシックブロック（以下「ＢＢ」という）を考慮することによって、生成される命令トレースの精度をさらに向上させることができる。ＢＢとは、分岐命令によって区切られた命令のブロックであり、関数よりも細かい単位である。
【００７２】
図１５は、ＢＢを考慮した命令トレースの生成の一例を示す図である。本実施例において各命令に付与されている文字列の最初の「：」よりも前の部分は、その命令が属している関数の名称を表す。最初の「：」と２番目の「：」の間の部分は、その命令が属しているＢＢの関数内での出現順序（以下「ＢＢ番号」という）を表す。そして、２番目の「：」よりも後ろの部分は、ＢＢの先頭を基準とした場合のその命令のオフセット（以下「ＢＢ内オフセット」という）を表わす。例えば、「ｆｕｎｃ＿Ａ：ＢＢ１：０」は、ｆｕｎｃ＿Ａ（）という名前の関数において１番目に出現するＢＢの先頭の命令であることを示す。
【００７３】
図１に示したプログラムにおいて、ｆｕｎｃ＿Ａ（）は、４つの命令を有する第１のＢＢと、３つの命令を有する第２のＢＢと、３つの命令を有する第３のＢＢとからなるものとする。また、ｆｕｎｃ＿Ｂ（）は、３つの命令を有する第１のＢＢと、７つの命令を有する第２のＢＢとからなり、ｆｕｎｃ＿Ｃ（）は、１０個の命令を有する１つのＢＢからなるものとする。
【００７４】
この場合、図１に示したプログラムを動作させると、図１５に示した命令列１３がプロセッサによって実行される。そして、プロセッサによって実行される命令を７個毎にサンプリングすると、サンプリングデータ２３が得られる。こうして得られたサンプリングデータ２３は、命令トレースの取得対象であるｆｕｎｃ＿Ｍ（）が１回呼び出された間に取得された単位で部分命令列に分割される。
【００７５】
そして、関数名と、ＢＢ番号と、ＢＢ内オフセットとに基づいて類似度と尤度を算出しながら部分命令列を合成していくことにより、命令トレース３３を得ることができる。こうして得られた命令トレース３３は、関数よりも細かい単位であるＢＢを考慮して合成されたものであるため、実際にプロセッサによって実行された順番通りに正確に命令が配置されていることが期待される。
【００７６】
次に、本実施例に係る命令トレース生成方法を実行する命令トレース生成装置の構成について説明する。図１６は、本実施例に係る命令トレース生成装置２００の構成を示す機能ブロック図である。図１６に示すように、命令トレース生成装置２００は、制御部２１０と、記憶部２２０とを有する。なお、以下の説明では、既に説明した部位と同一の部位には、既に説明した部位と同一の符号を付して、重複する説明を省略することとする。
【００７７】
制御部２１０は、命令トレース生成装置２００を全体制御する制御部である。制御部２１０は、命令情報設定部２１１と、分割部１１２と、合成制御部１１３と、類似度算出部２１３ａと、選択部１１３ｂと、組合せパターン生成部１１３ｃと、尤度算出部２１３ｄと、部分命令列置換部１１３ｅと、命令トレース出力部１１４とを有する。
【００７８】
命令情報設定部２１１は、記憶部２２０に記憶されているサンプリングデータ２２１に対して命令情報を設定する。サンプリングデータ２２１は、命令トレースの取得対象の命令列を複数回実行している間にプロセッサによって実行された命令を所定間隔でサンプリングして得られたデータであり、命令トレースを生成するために十分な数の命令を含んでいる。
【００７９】
具体的には、命令情報設定部２１１は、サンプリングデータ２２１に含まれる命令毎に、関数名と、ＢＢ番号と、ＢＢ内オフセットを命令情報として設定する。なお、関数名は、例えば、命令のアドレスをプログラム中のシンボルテーブルと照合することによって取得することができる。また、ＢＢ番号とＢＢ内オフセットは、例えば、命令のアドレスをプログラム中のシンボルテーブルと照合することによって得られた関数の先頭のアドレスを基準として、プログラム中の命令列を解析することにより取得することができる。
【００８０】
類似度算出部２１３ａは、分割部１１２がサンプリングデータ２２１を分割することによって得られた部分命令列２２２の組合せの全てについて類似度を算出する。類似度は、各部分命令列２２２に含まれる命令を先頭から順に比較し、比較結果を類似度得点データ２２４と照合して得られた得点（命令単位の類似度）を合計することにより算出される。
【００８１】
類似度得点データ２２４の一例を図１７に示す。図１７に示すように、類似度得点データ１２４には、関数名が一致した場合の得点として「５」が設定され、関数名が不一致であった場合の得点として、それよりも低い「０」が設定されている。また、関数名が一致した場合にＢＢ番号の差分に基づいて与えられる得点として、差分が「０」に近いほど高い値が設定されている。また、ＢＢ番号の差分が０であった場合、すなわち、ＢＢ番号が一致した場合にＢＢ内オフセットの差分に基づいて与えられる得点として、差分の絶対値が「１」に近いほど高い値が設定されている。
【００８２】
尤度算出部２１３ｄは、組合せパターン生成部１１３ｃによって生成された各組合せパターン２２３の尤度を算出する。尤度は、組合せパターン２２３に含まれる命令を先頭から順に前後で比較し、比較結果を尤度得点データ２２５と照合して得られた得点（命令単位の尤度）を合計することにより算出される。
【００８３】
尤度得点データ２２５の一例を図１８に示す。図１８に示すように、尤度得点データ２２５には、関数名が一致した場合の得点として「５」が設定され、関数名が不一致であった場合の得点として、それよりも低い「０」が設定されている。また、関数名が一致した場合にＢＢ番号の差分に基づいて与えられる得点として、差分が「０」に近いほど高い値が設定されている。また、ＢＢ番号の差分が０であった場合、すなわち、ＢＢ番号が一致した場合にＢＢ内オフセットの差分に基づいて与えられる得点として、差分が正であり、かつ、差分の絶対値が「１」に近いほど高い値が設定されている。
【００８４】
記憶部２２０は、各種情報を記憶する記憶デバイスであり、サンプリングデータ２２１と、部分命令列２２２と、組合せパターン２２３と、類似度得点データ２２４と、尤度得点データ２２５とを記憶する。なお、記憶部２２０が記憶する各種データについては、既に説明済みであるため、ここでは説明を省略する。
【００８５】
次に、図１６に示した命令トレース生成装置２００の動作について説明する。図１９は、命令トレース生成装置２００による命令トレース生成処理の処理手順を示すフローチャートである。
【００８６】
命令トレース生成処理においては、まず、命令情報設定部２１１が、予め採取されたサンプリングデータ２２１に含まれる各命令に、関数名と、ＢＢ番号と、ＢＢ内オフセットを命令情報として設定する（ステップＳ４０１）。その後の処理については、ステップＳ４０７の類似度算出処理と、ステップＳ４１２の尤度算出処理を除いて、図１１に示した処理手順と同様である。
【００８７】
図２０は、類似度算出処理の処理手順を示すフローチャートである。類似度算出処理において、類似度算出部２１３ａは、まず、類似度を０に設定する（ステップＳ５０１）。そして、類似度算出部２１３ａは、類似度の算出対象の一方の部分命令列２２２から未取得の命令情報のうち先頭のものを取得する（ステップＳ５０２）。ここで、その部分命令列２２２の全ての命令情報を既に取得済であった場合（ステップＳ５０３肯定）、類似度算出部２１３ａは、類似度算出処理を終了する。
【００８８】
一方、命令情報を取得できた場合（ステップＳ５０３否定）、類似度算出部２１３ａは、類似度の算出対象のもう一方の部分命令列２２２から未取得の命令情報のうち先頭のものを取得する（ステップＳ５０４）。ここで、その部分命令列２２２の全ての命令情報を既に取得済であった場合（ステップＳ５０５肯定）、類似度算出部２１３ａは、類似度算出処理を終了する。
【００８９】
もう一方の部分命令列２２２からも命令情報を取得できた場合（ステップＳ５０５否定）、類似度算出部２１３ａは、取得された命令情報に含まれる関数名を比較する（ステップＳ５０６）。そして、関数名が一致しなかった場合（ステップＳ５０７否定）、類似度算出部２１３ａは、類似度得点データ２２４から、関数名不一致時の点数を取得して類似度に加算し（ステップＳ５０８）、ステップＳ５０２から処理を再開する。
【００９０】
関数名が一致した場合（ステップＳ５０７肯定）、類似度算出部２１３ａは、類似度得点データ２２４から、関数名一致時の点数を取得して類似度に加算する（ステップＳ５０９）。そして、類似度算出部２１３ａは、取得された命令情報に含まれるＢＢ番号を比較する（ステップＳ５１０）。ここで、ＢＢ番号が一致しなかった場合（ステップＳ５１１否定）、類似度算出部２１３ａは、ＢＢ番号の差分を算出する（ステップＳ５１２）。そして、類似度算出部２１３ａは、類似度得点データ２２４から、算出されたＢＢ番号の差分に対応する点数を取得して類似度に加算し（ステップＳ５１３）、ステップＳ５０２から処理を再開する。
【００９１】
一方、ＢＢ番号が一致した場合（ステップＳ５１１肯定）、類似度算出部２１３ａは、類似度得点データ２２４から、ＢＢ番号一致時の点数を取得して類似度に加算する（ステップＳ５１４）。さらに、類似度算出部２１３ａは、取得された命令情報に含まれるＢＢ内オフセットの差分を算出する（ステップＳ５１５）。そして、類似度算出部２１３ａは、類似度得点データ２２４から、算出されたＢＢ内オフセットの差分に対応する点数を取得して類似度に加算し（ステップＳ５１６）、ステップＳ５０２から処理を再開する。
【００９２】
図２１は、尤度算出処理の処理手順を示すフローチャートである。尤度算出処理において、尤度算出部２１３ｄは、まず、尤度を０に設定する（ステップＳ６０１）。そして、尤度算出部２１３ｄは、尤度の算出対象の組合せパターン２２３から先頭の命令情報を取得する（ステップＳ６０２）。
【００９３】
そして、尤度算出部２１３ｄは、尤度の算出対象の組合せパターン２２３から次の命令情報を取得する（ステップＳ６０３）。ここで、その組合せパターン２２３の全ての命令情報を既に取得済であった場合（ステップＳ６０４肯定）、尤度算出部２１３ｄは、尤度算出処理を終了する。
【００９４】
組合せパターン２２３から次の命令情報を取得できた場合（ステップＳ６０４否定）、尤度算出部２１３ｄは、今回取得された命令情報に含まれる関数名を直前に取得された命令情報に含まれる関数名と比較する（ステップＳ６０５）。そして、関数名が一致しなかった場合（ステップＳ６０６否定）、尤度算出部２１３ｄは、尤度得点データ２２５から、関数名不一致時の点数を取得して尤度に加算し（ステップＳ６０７）、ステップＳ６０３から処理を再開する。
【００９５】
関数名が一致した場合（ステップＳ６０６肯定）、尤度算出部２１３ｄは、尤度得点データ２２５から、関数名一致時の点数を取得して尤度に加算する（ステップＳ６０８）。そして、尤度算出部２１３ｄは、取得された命令情報に含まれるＢＢ番号を直前に取得された命令情報に含まれるＢＢ番号比較する（ステップＳ６０９）。ここで、ＢＢ番号が一致しなかった場合（ステップＳ６１０否定）、尤度算出部２１３ｄは、ＢＢ番号の差分を算出する（ステップＳ６１１）。そして、尤度算出部２１３ｄは、尤度得点データ２２５から、算出されたＢＢ番号の差分に対応する点数を取得して尤度に加算し（ステップＳ６１２）、ステップＳ６０３から処理を再開する。
【００９６】
一方、ＢＢ番号が一致した場合（ステップＳ６１０肯定）、尤度算出部２１３ｄは、尤度得点データ２２５から、ＢＢ番号一致時の点数を取得して類似度に加算する（ステップＳ６１３）。さらに、尤度算出部２１３ｄは、今回取得された命令情報に含まれるＢＢ内オフセットから直前に取得された命令情報に含まれるＢＢ内オフセットを減算して差分を算出する（ステップＳ６１４）。そして、尤度算出部２１３ｄは、尤度得点データ２２５から、算出された差分に対応する点数を取得して尤度に加算し（ステップＳ６１５）、ステップＳ６０３から処理を再開する。
【００９７】
上述してきたように、本実施例では、ＢＢを考慮して部分命令列を合成することとしたので、正確な命令トレースを生成することができる。
【００９８】
なお、実施例１に係る命令トレース生成装置１００や実施例２に係る命令トレース生成装置２００の構成は、要旨を逸脱しない範囲で種々に変更することができる。例えば、命令トレース生成装置１００の制御部１１０の機能や命令トレース生成装置２００の制御部２１０の機能をソフトウェアとして実装し、これをコンピュータで実行することにより、命令トレース生成装置１００や命令トレース生成装置２００と同等の機能を実現することもできる。以下に、制御部１１０の機能をソフトウェアとして実装した命令トレース生成プログラム１０７１を実行するコンピュータの一例を示す。
【００９９】
図２２は、命令トレース生成プログラム１０７１を実行するコンピュータ１０００を示す機能ブロック図である。このコンピュータ１０００は、各種演算処理を実行するＣＰＵ（Central Processing Unit）１０１０と、ユーザからのデータの入力を受け付ける入力装置１０２０と、各種情報を表示するモニタ１０３０と、記録媒体からプログラム等を読み取る媒体読取り装置１０４０と、ネットワークを介して他のコンピュータとの間でデータの授受を行うネットワークインターフェース装置１０５０と、各種情報を一時記憶するＲＡＭ（Random Access Memory）１０６０と、ハードディスク装置１０７０とをバス１０８０で接続して構成される。
【０１００】
そして、ハードディスク装置１０７０には、図８に示した制御部１１０と同様の機能を有する命令トレース生成プログラム１０７１と、図８に示した記憶部１２０に記憶される各種データに対応する命令トレース生成用データ１０７２とが記憶される。なお、命令トレース生成用データ１０７２を、適宜分散させ、ネットワークを介して接続された他のコンピュータに記憶させておくこともできる。
【０１０１】
そして、ＣＰＵ１０１０が命令トレース生成プログラム１０７１をハードディスク装置１０７０から読み出してＲＡＭ１０６０に展開することにより、命令トレース生成プログラム１０７１は、命令トレース生成プロセス１０６１として機能するようになる。そして、命令トレース生成プロセス１０６１は、命令トレース生成用データ１０７２から読み出した情報等を適宜ＲＡＭ１０６０上の自身に割り当てられた領域に展開し、この展開したデータ等に基づいて各種データ処理を実行する。そして、命令トレース生成プロセス１０６１は、各種データ処理によって生成された命令トレースデータ１０７３をハードディスク装置１０７０に記憶させる。
【０１０２】
なお、上記の命令トレース生成プログラム１０７１は、必ずしもハードディスク装置１０７０に格納されている必要はなく、ＣＤ−ＲＯＭ等の記憶媒体に記憶されたこのプログラムを、コンピュータ１０００が読み出して実行するようにしてもよい。また、公衆回線、インターネット、ＬＡＮ（Local Area Network）、ＷＡＮ（Wide Area Network）等を介してコンピュータ１０００に接続される他のコンピュータ（またはサーバ）等にこのプログラムを記憶させておき、コンピュータ１０００がこれらからプログラムを読み出して実行するようにしてもよい。
【０１０３】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１０４】
（付記１）複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成プログラムであって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割手順と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出手順と、
前記類似度算出手順によって算出された類似度に基づいて部分命令列の組合せを選択する選択手順と、
前記選択手順によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成手順と、
前記組合せパターン生成手順によって生成された組合せパターン毎に尤度を算出する尤度算出手順と、
前記尤度算出手順によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換手順と
をコンピュータに実行させることを特徴とする命令トレース生成プログラム。
【０１０５】
（付記２）合成制御手順をコンピュータにさらに実行させ、
前記選択手順は、前記類似度算出手順によって算出された類似度が最も高い部分命令列の組合せを選択し、
前記部分命令列置換手順は、前記尤度算出手順によって算出された尤度が最も高い組合せパターンを、前記選択手順によって選択された部分文字列に代えて、部分文字列として前記記憶手段に記憶させ、
前記合成制御手順は、前記記憶手段に記憶される部分命令列が１つになるまで、前記類似度算出手順と、前記選択手順と、前記組合せパターン生成手順と、前記部分命令列置換手順とを制御することを特徴とする付記１に記載の命令トレース生成プログラム。
【０１０６】
（付記３）前記類似度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記１または２に記載の命令トレース生成プログラム。
【０１０７】
（付記４）前記尤度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記１から３のいずれか１つに記載の命令トレース生成プログラム。
【０１０８】
（付記５）前記類似度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記１に記載の命令トレース生成プログラム。
【０１０９】
（付記６）前記尤度算出手順は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記１に記載の命令トレース生成プログラム。
【０１１０】
（付記７）複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成装置であって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割手段と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出手段と、
前記類似度算出手段によって算出された類似度に基づいて部分命令列の組合せを選択する選択手段と、
前記選択手段によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成手段と、
前記組合せパターン生成手段によって生成された組合せパターン毎に尤度を算出する尤度算出手段と、
前記尤度算出手段によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換手段と
を備えることを特徴とする命令トレース生成装置。
【０１１１】
（付記８）合成制御手段をさらに備え、
前記選択手段は、前記類似度算出手段によって算出された類似度が最も高い部分命令列の組合せを選択し、
前記部分命令列置換手段は、前記尤度算出手段によって算出された尤度が最も高い組合せパターンを、前記選択手段によって選択された部分文字列に代えて、部分文字列として前記記憶手段に記憶させ、
前記合成制御手段は、前記記憶手段に記憶される部分命令列が１つになるまで、前記類似度算出手段と、前記選択手段と、前記組合せパターン生成手段と、前記部分命令列置換手段とを制御することを特徴とする付記７に記載の命令トレース生成装置。
【０１１２】
（付記９）前記類似度算出手段は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記７または８に記載の命令トレース生成装置。
【０１１３】
（付記１０）前記尤度算出手段は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記７〜９のいずれか１つに記載の命令トレース生成装置。
【０１１４】
（付記１１）前記類似度算出手段は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記７に記載の命令トレース生成装置。
【０１１５】
（付記１２）前記尤度算出手段は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記７に記載の命令トレース生成装置。
【０１１６】
（付記１３）複数回実行される第１の命令列を所定間隔でサンプリングして得られた第２の命令列から、該第１の命令列の命令トレースを生成する命令トレース生成方法であって、
前記第２の命令列を、部分命令列に分割し、分割された各部分命令列を記憶手段に記憶させる分割工程と、
前記記憶手段に記憶された全ての部分命令列の組合せ毎に類似度を算出する類似度算出工程と、
前記類似度算出工程によって算出された類似度に基づいて部分命令列の組合せを選択する選択工程と、
前記選択工程によって選択された部分命令列に含まれる命令を組み合わせて複数の組合せパターンを生成する組合せパターン生成工程と、
前記組合せパターン生成工程によって生成された組合せパターン毎に尤度を算出する尤度算出工程と、
前記尤度算出工程によって算出された尤度に基づいて組合せパターンを前記記憶手段に記憶させる部分命令列置換工程と
を含むことを特徴とする命令トレース生成方法。
【０１１７】
（付記１４）合成制御工程をさらに備え、
前記選択工程は、前記類似度算出工程によって算出された類似度が最も高い部分命令列の組合せを選択し、
前記部分命令列置換工程は、前記尤度算出工程によって算出された尤度が最も高い組合せパターンを、前記選択工程によって選択された部分文字列に代えて、部分文字列として前記記憶手段に記憶させ、
前記合成制御工程は、前記記憶手段に記憶される部分命令列が１つになるまで、前記類似度算出工程と、前記選択工程と、前記組合せパターン生成工程と、前記部分命令列置換工程とを制御することを特徴とする付記１３に記載の命令トレース生成方法。
【０１１８】
（付記１５）前記類似度算出工程は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記１３または１４に記載の命令トレース生成方法。
【０１１９】
（付記１６）前記類似度算出工程は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて類似度を算出することを特徴とする付記１３〜１５のいずれか１つに記載の命令トレース生成方法。
【０１２０】
（付記１７）前記尤度算出工程は、部分命令列に含まれる命令が属する関数の関数名と、該関数の先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記１３に記載の命令トレース生成方法。
【０１２１】
（付記１８）前記尤度算出工程は、部分命令列に含まれる命令が属する関数の関数名と、該命令が含まれるベーシックブロックと、該ベーシックブロックの先頭からの該命令のオフセットとに基づいて尤度を算出することを特徴とする付記１３に記載の命令トレース生成方法。
【図面の簡単な説明】
【０１２２】
【図１】プログラムの一例を示す図である。
【図２】命令のサンプリングの一例を示す図である。
【図３】サンプリングデータの一例を示す図である。
【図４】部分命令列の一例を示す図である。
【図５】類似度の算出結果の一例を示す図である。
【図６】部分命令列の合成の一例を示す図である。
【図７】部分命令列の合成の他の一例を示す図である。
【図８】実施例１に係る命令トレース生成装置の構成を示す機能ブロック図である。
【図９】類似度得点データのデータ構成の一例を示す図である。
【図１０】尤度得点データのデータ構成の一例を示す図である。
【図１１】命令トレース生成処理の処理手順を示すフローチャートである。
【図１２】類似度算出処理の処理手順を示すフローチャートである。
【図１３】尤度算出処理の処理手順を示すフローチャートである。
【図１４】実行時間重み付き命令トレースの生成の一例を示す図である。
【図１５】ベーシックブロックを考慮した命令トレースの生成の一例を示す図である。
【図１６】実施例２に係る命令トレース生成装置の構成を示す機能ブロック図である。
【図１７】類似度得点データのデータ構成の一例を示す図である。
【図１８】尤度得点データのデータ構成の一例を示す図である。
【図１９】命令トレース生成処理の処理手順を示すフローチャートである。
【図２０】類似度算出処理の処理手順を示すフローチャートである。
【図２１】尤度算出処理の処理手順を示すフローチャートである。
【図２２】命令トレース生成プログラムを実行するコンピュータを示す機能ブロック図である。
【符号の説明】
【０１２３】
１１〜１３  命令列
２１〜２３  サンプリングデータ
３２  実行時間重み付き命令トレース
３３  命令トレース
１００、２００  命令トレース生成装置
１１０、２１０  制御部
１１１、２１１  命令情報設定部
１１２  分割部
１１３  合成制御部
１１３ａ、２１３ａ  類似度算出部
１１３ｂ  選択部
１１３ｃ  組合せパターン生成部
１１３ｄ、２１３ｄ  尤度算出部
１１３ｅ  部分命令列置換部
１１４  命令トレース出力部
１２０、２２０  記憶部
１２１、２２１  サンプリングデータ
１２２、２２２  部分命令列
１２３、２２３  組合せパターン
１２４、２２４  類似度得点データ
１２５、２２５  尤度得点データ
１０００  コンピュータ
１０１０  ＣＰＵ
１０２０  入力装置
１０３０  モニタ
１０４０  媒体読取り装置
１０５０  ネットワークインターフェース装置
１０６０  ＲＡＭ
１０６１  命令トレース生成プロセス
１０７０  ハードディスク装置
１０７１  命令トレース生成プログラム
１０７２  命令トレース生成用データ
１０７３  命令トレースデータ
１０８０  バス
【図１】
2010009282.tif 000003
【図２】
2010009282.tif 000004
【図３】
2010009282.tif 000005
【図４】
2010009282.tif 000006
【図５】
2010009282.tif 000007
【図６】
2010009282.tif 000008
【図７】
2010009282.tif 000009
【図８】
2010009282.tif 000010
【図９】
2010009282.tif 000011
【図１０】
2010009282.tif 000012
【図１１】
2010009282.tif 000013
【図１２】
2010009282.tif 000014
【図１３】
2010009282.tif 000015
【図１４】
2010009282.tif 000016
【図１５】
2010009282.tif 000017
【図１６】
2010009282.tif 000018
【図１７】
2010009282.tif 000019
【図１８】
2010009282.tif 000020
【図１９】
2010009282.tif 000021
【図２０】
2010009282.tif 000022
【図２１】
2010009282.tif 000023
【図２２】
2010009282.tif 000024