JP6540340B2 - 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム - Google Patents

関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム Download PDF

Info

Publication number
JP6540340B2
JP6540340B2 JP2015152834A JP2015152834A JP6540340B2 JP 6540340 B2 JP6540340 B2 JP 6540340B2 JP 2015152834 A JP2015152834 A JP 2015152834A JP 2015152834 A JP2015152834 A JP 2015152834A JP 6540340 B2 JP6540340 B2 JP 6540340B2
Authority
JP
Japan
Prior art keywords
call information
function
compressed
program
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2015152834A
Other languages
English (en)
Other versions
JP2017033303A (ja
Inventor
宗則 前田
宗則 前田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2015152834A priority Critical patent/JP6540340B2/ja
Priority to US15/168,282 priority patent/US9858170B2/en
Publication of JP2017033303A publication Critical patent/JP2017033303A/ja
Application granted granted Critical
Publication of JP6540340B2 publication Critical patent/JP6540340B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3612Software analysis for verifying properties of programs by runtime analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3466Performance evaluation by tracing or monitoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/302Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/3024Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a central processing unit [CPU]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3065Monitoring arrangements determined by the means or processing involved in reporting the monitored data
    • G06F11/3072Monitoring arrangements determined by the means or processing involved in reporting the monitored data where the reporting involves data filtering, e.g. pattern matching, time or event triggered, adaptive or policy-based reporting
    • G06F11/3082Monitoring arrangements determined by the means or processing involved in reporting the monitored data where the reporting involves data filtering, e.g. pattern matching, time or event triggered, adaptive or policy-based reporting the data filtering being achieved by aggregating or compressing the monitored data
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3466Performance evaluation by tracing or monitoring
    • G06F11/348Circuit details, i.e. tracer hardware
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/865Monitoring of software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/88Monitoring involving counting

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明は、関数呼び出し情報収集方法及び関数呼び出し情報収集プログラムに関する。
プログラムの実行性能を高めたり、性能特性を分析することを目的として、プログラムの性能プロファイルを採取することが行われる。性能プロファイルには、例えば、プログラム実行中に処理された関数の実行頻度がある。実行頻度の高い関数の性能を向上させることで、プログラム全体の性能を向上させることができる。
実行頻度を求める方法の1つとして、一定時間毎にCPUの命令カウンタの値すなわち実行番地をサンプリングしてメモリ等に保存し、プログラムの実行終了後に保存した番地に対応する関数を決定することで関数毎の出現回数を実行回数として算出する方法がある。出現回数は、一定時間毎にサンプリングされたタイミングで実行されている関数の回数であり、実際に関数が実行された回数とは異なる。ただし、繰り返し実行される関数は実行時間が長くなり、繰り返し実行される関数の出現回数は多くなる。
関数の実行頻度は、関数の呼び出し関係に基づいて分析されることが多い。例えば、関数Cの実行回数を100回とするとき、80回は関数A→関数B→関数Cの順で呼ばれた場合であり、残りの20回は関数X→関数Y→関数Z→関数Cの順で呼ばれた場合であるといった分析が行われる。
なお、メソッドを一例とするプロファイル情報取得対象を指定し、指定されたプロファイル情報取得対象が実行中か否かを一定時間間隔で監視し、実行中であるときにプロファイル情報を取得することで、取得のためのオーバヘッドを小さくする従来技術がある。
また、ソースプログラム中の関数呼び出しを検出してコールペアの種別毎に識別番号を付し、識別番号毎に関数呼び出しの回数を格納するテーブル領域を設定することで、プロファイル処理時のメモリ領域とオーバヘッドを削減する従来技術がある。
また、ソースプログラムに、動的呼び出し側関数と動的呼び出され側関数の組み合わせである動的コールペア毎に呼び出し回数を格納するテーブルの領域を設定する処理を挿入することで、コールペア情報を収集する際の計算量とメモリ量を削減する従来技術がある。
特開2005−141392号公報 特開平11−212837号公報 特開2006−202134号公報
関数の呼び出し関係に基づいて関数の実行頻度を分析する場合、関数呼び出し関係の情報もメモリに格納する必要があり、メモリに格納されるプロファイル情報が多くなるという問題がある。メモリに格納されるプロファイル情報が多くなると、プロファイル情報の採取対象であるプログラムの実行性能に影響を与える場合もある。
本発明は、1つの側面では、関数呼び出し関係の情報のメモリ上の量を削減することを目的とする。
本願の開示する関数呼び出し情報収集方法は、1つの態様において、関数が実行される際に、該関数の呼び出し情報を収集し、収集した呼び出し情報を非可逆圧縮するか否かを選択する処理をコンピュータが実行する。そして、非可逆圧縮を選択した場合には、前記呼び出し情報を非可逆圧縮してサンプリングデータとして記憶部に格納し、非可逆圧縮を選択しなかった場合には、前記呼び出し情報を圧縮することなく、又は、可逆圧縮して前記記憶部にサンプリングデータとして格納し、前記記憶部に格納したサンプリングデータを読み出し、該読み出したサンプリングデータに含まれる圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報を用いて、非可逆圧縮された呼び出し情報と、圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報とを対応付けた逆圧縮表を作成し、非可逆圧縮された呼び出し情報から元の呼び出し情報を前記逆圧縮表に基づいて復元し、圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報と復元された呼び出し情報に基づいて関数の呼び出し関係を集計する処理をコンピュータが実行する。
1実施態様によれば、関数呼び出し関係の情報のメモリ上の量を削減することができる。
図1は、実施例に係る性能情報収集プログラムを説明するための図である。 図2は、性能収集用割込みプログラムの動作を説明するための図である。 図3は、性能収集対象のプログラムの動作を説明するための図である。 図4は、関数呼び出し時にスタックに積まれるデータを説明するための図である。 図5Aは、関数の呼び出し時に実行されるコードの一例を示す図である。 図5Bは、関数の戻り時に実行されるコードの一例を示す図である。 図6は、サンプリングデータの形式を示す図である。 図7は、unwind_stackプログラムの処理のフローを示すフローチャートである。 図8は、分析プログラムの機能構成を示す図である。 図9Aは、分析プログラムの第1のパスを説明するための図である。 図9Bは、分析プログラムの第2のパスを説明するための図である。 図10Aは、第1のパスの処理のフローを示すフローチャートである。 図10Bは、第2のパスの処理のフローを示すフローチャートである 図11Aは、サンプリング結果の集計処理の第1の例を示すフローチャートである。 図11Bは、サンプリング結果の集計処理の第2の例を示すフローチャートである。 図12は、トライ木の一例を示す図である。 図13は、性能情報収集プログラムを実行するコンピュータの構成を示す図である。
以下に、本願の開示する関数呼び出し情報収集方法及び関数呼び出し情報収集プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係る性能情報収集プログラムについて説明する。図1は、実施例に係る性能情報収集プログラムを説明するための図である。図1に示すように、性能情報収集プログラム1は、サンプリングプログラム2と、分析プログラム4とを有する。
サンプリングプログラム2は、関数呼び出し関係の情報をサンプリングするためのプログラムであり、サンプリングした関数呼び出し関係の情報をサンプリングデータとしてサンプリングデータ記憶部3に格納する。サンプリングプログラム2は、unwind_stackプログラム21と、性能収集用割込みプログラム22を有する。
unwind_stackプログラム21は、スタックから関数呼び出し関係の情報を取得してサンプリングデータとしてレジスタに格納する。unwind_stackプログラム21は、性能収集が行われるプログラムである性能収集対象プログラムの各関数の実行開始時に実行される。
性能収集用割込みプログラム22は、一定時間間隔で起動され、unwind_stackプログラム21がレジスタに格納したサンプリングデータをメモリに格納する。メモリに格納されたサンプリングデータは、性能情報の収集が終了した時点等にサンプリングデータ記憶部3に書き出される。
なお、unwind_stackプログラム21が関数呼び出し関係の情報を取得するタイミングは各関数の実行開始時であり、性能収集用割込みプログラム22が関数呼び出し関係の情報をメモリに格納するタイミングは一定時間間隔である。すなわち、両者は異なる。
分析プログラム4は、サンプリングデータ記憶部3から関数呼び出し関係の情報を読み出して関数の呼び出し関係に基づく関数の出現回数を集計し、集計結果を集計結果記憶部5に格納する。
次に、性能収集用割込みプログラム22の動作について説明する。図2は、性能収集用割込みプログラム22の動作を説明するための図である。図2では、メモリ61のヒープ61bに格納された性能収集対象コード71が実行されているとする。ここで、性能収集対象コード71は、性能収集対象プログラムの実行コードである。性能収集対象コード71には、unwind_stackプログラム21の実行コードであるunwind_stackコード71aが含まれる。
ヒープ61bは、動的に確保可能なメモリ領域であり、プログラムの実行コードやデータ等が格納される領域である。ヒープ61bには、性能収集対象コード71以外にハッシュ関数コード72、性能収集用割込みコード73、サンプリングバッファ74が含まれる。ハッシュ関数コード72は、ハッシュ値を計算するハッシュ関数の実行コードである。性能収集用割込みコード73は、性能収集用割込みプログラム22の実行コードである。サンプリングバッファ74は、性能収集用割込みプログラム22により収集されたサンプリングデータを格納する領域である。
図2に示すように、CPU62の性能を監視するPMU(Performance Monitoring Units)62aがCPU62に対して性能収集用割込みを定期的に発生する(1)。なお、PMU62aの代わりにクロックカウンタ、タイマ等がCPU62に対して性能収集用割込みを定期的に発生してもよい。
そして、CPU62は、割込み処理を実行する(2)。具体的には、CPU62は、命令ポインタ81の値を性能収集用割込みコード73の先頭とし、性能収集用割込みコード73を実行する。ここで、命令ポインタ81は、実行するコードのアドレスを記憶するレジスタであり、CPU62のレジスタセット80に含まれる。
性能収集用割込みコード73は、m(mは正の整数)個の呼び出し関係格納専用レジスタ85から関数呼び出し関係の情報を読み出してサンプリングバッファ74にサンプリングデータとして書き込む(3)。ここで、呼び出し関係格納専用レジスタ85は、レジスタセット80に含まれる汎用レジスタ84の一部である。unwind_stackプログラム21により関数呼び出し関係の情報がm個の呼び出し関係格納専用レジスタ85に格納される。
その後、性能情報収集時間が終了すると、性能収集用割込みプログラム22によるデータ収集が終了し(4)、サンプリングプログラム2は、サンプリングデータの永続化、すなわち、サンプリングデータのサンプリングデータ記憶部3への書き込みを行う(5)。なお、サンプリングデータのサンプリングデータ記憶部3への書き込みは、サンプリングバッファ74に空きがなくなったときにも行われる。
このように、性能収集用割込みプログラム22は、一定時間間隔で起動され、起動された時点で呼び出し関係格納専用レジスタ85が記憶する関数呼び出し関係の情報をサンプリングバッファ74に格納することで、関数呼び出し関係の情報を収集することができる。
次に、unwind_stackプログラム21の動作について図3〜図7を用いて説明する。まず、性能収集対象プログラムの動作について説明する。図3は、性能収集対象のプログラムの動作を説明するための図である。
図3に示すように、性能収集対象コード71の実行が開始され(1)、命令ポインタ81が指すアドレスの命令が順番に実行される。そして、実行の途中で関数の呼び出しが行われる(2)と、命令ポインタ81が記憶する戻り命令アドレスがスタック61aにpushされる(3)。ここで、スタック61aは、メモリ61内でデータをFILO(First In Last Out)で格納する領域である。スタック61aのデータを格納する位置はレジスタセット80に含まれるスタックポインタ82で指定される。
そして、関数の実行が終了すると、スタック61aにpushされた戻り命令アドレスがpopされ(4)、命令ポインタ81に設定されることにより、関数からの戻りが行われる(5)。
このように、関数が呼び出される度にスタック61aに戻り命令アドレスが積まれる。そこで、unwind_stackプログラム21は、スタック61aに積まれた一連の戻り命令アドレスを関数呼び出し関係の情報として呼び出し関係格納専用レジスタ85に格納する。
なお、スタック61aには、関数呼び出し時に戻り命令アドレス以外のデータも格納される。図4は、関数呼び出し時にスタック61aに積まれるデータを説明するための図である。図4では、バイナリコード61cが実行されている途中で関数myfuncが呼ばれた場合を示す。また、図4において、ベースポインタ83は、呼び出された関数の局所変数を格納する場所であるスタックフレームの1つ前の領域を指すポインタである。ベースポインタ83が指す領域には、直前のベースポインタ83の値が格納される。
図4に示すように、関数myfuncが呼ばれると、スタック61aには、戻り命令アドレス91と、直前のベースポインタの値92と、myfunc用スタックフレーム93が積まれる。ここで、戻り命令アドレス91と直前のベースポインタの値92は固定長であるが、スタックフレームの長さは、関数で使用される局所変数の個数に依存して可変である。そこで、unwind_stackプログラム21は、直前のベースポインタの値92を順番に辿ることによって、一連の戻り命令アドレスをスタック61aから取得する。
ベースポインタ83とスタックフレームは、関数の呼び出し時に実行されるコードによりスタック61aに積まれる。図5Aは、関数の呼び出し時に実行されるコードの一例を示す図である。図5Aにおいて、push ebpは、ベースポインタ83の値をスタック61aに保存する命令である。mov ebp,espは、現在のスタックフレームを指すようにベースポインタ83の値を変更する。sub esp,xは、局所変数の大きさの分スタックポインタ82の値を減らす。なお、スタック61aには、上位アドレスから下位アドレスに向かってデータが積まれる。また、unwind_stackプログラム21は、push ebpの前で呼ばれ、一連の戻り命令アドレスをスタック61aから取得する。
図5Bは、関数の戻り時に実行されるコードの一例を示す図である。図5Bにおいて、mov esp,ebpは、局所変数を除去する。pop ebpは、ベースポインタ83の値を復帰する。retは、呼び出された関数から戻る。
図6は、サンプリングデータの形式を示す図である。図6に示すように、サンプリングデータの形式には、(a)パック形式と(b)ハッシュ形式がある。サンプリングデータの先頭1ビットによりパック形式かハッシュ形式かが区別される。パック形式では、1つのサンプリングデータに固定長の戻り命令アドレスがN(Nは正の整数)個詰められる。なお、パック形式では、戻り命令アドレスは可逆圧縮されてもよい。
ハッシュ形式では、1つのサンプリングデータは、N個の戻り命令アドレスから計算されたハッシュ値である。図6(b)において、HASHはハッシュ関数である。戻り命令アドレス1…NはN個の戻り命令アドレスを表す。ハッシュ形式では、サンプリングデータは可変長であり、サンプリングデータのサイズは小さくなる。
なお、ハッシュ形式では、図6(c)に示すように、サンプリングデータを固定長とし、ハッシュ値を埋めて余ったスペースに、N個の戻り命令アドレスより前のM−N(MはN以上の正の整数)個の戻り命令アドレスをパック形式で詰める形式としてもよい。この形式は、1つのサンプリングデータがハッシュ値だけである形式と比較して、1つのサンプリングデータの情報量を増やすことができる。
また、図6では、先頭の1ビットを用いてパック形式かハッシュ形式かが区別されるが、パック形式では、戻り命令アドレスが詰められることからサンプリングデータに特徴があるので、先頭の1ビットは省略してもよい。
unwind_stackプログラム21は、ハッシュ形式又はパック形式でN個の戻り命令アドレスをm個の呼び出し関係格納専用レジスタ85に格納する。具体的には、unwind_stackプログラム21は、N個の戻り命令アドレスをm個の呼び出し関係格納専用レジスタ85に格納する際に乱数又は疑似乱数を用いてハッシュ形式又はパック形式を選択し、選択した形式で格納する。
なお、unwind_stackプログラム21は、1ビットの選択フラグを関数毎に用意し、関数が呼び出されたときに選択フラグを書き換え、選択フラグが0のときはパック形式を選択し、選択フラグが1のときはハッシュ形式を選択してもよい。
図7は、unwind_stackプログラム21の処理のフローを示すフローチャートである。図7に示すように、unwind_stackプログラム21は、ハッシュ形式がパック形式かを決定し、繰り返し回数の上限Dを決定する(ステップS1)。ここで、D=Nであるが、図6(c)に示したハッシュ形式の場合、D=Mである。
そして、unwind_stackプログラム21は、作業用レジスタ1にベースポインタ83の値をセットし(ステップS2)、スタックポインタ82の参照先のメモリ61の内容を戻り命令アドレス1として出力する(ステップS3)。そして、unwind_stackプログラム21は、iが2以上D以下であるか否かを判定し(ステップS4)、iが2以上D以下でない場合には、ステップS9へ移動する。ここで、iは、unwind_stackプログラム21が戻り命令アドレスを1つ取得する度に1増加する繰り返し変数であり、初期値は2である。
iが2以上D以下である場合には、unwind_stackプログラム21は、作業用レジスタ2に作業用レジスタ1の内容のメモリ61の内容をセットする(ステップS5)。この結果、作業用レジスタ2には、呼び出し側のベースポインタ83の値がセットされる。
そして、unwind_stackプログラム21は、作業レジスタ2の値は健全か否かを判定する(ステップS6)。作業レジスタ2の値はベースポインタ83の値であるので、unwind_stackプログラム21は、スタック61aのいずれかの領域を指しているか否かで健全性をチェックする。また、1つ前のベースポインタ83の値は、現在のベースポインタ83の値から1つの関数に関する情報を格納する領域分だけ大きい値であり、1つの関数に関する情報を格納する領域の大きさは、局所変数の数に依存するが、ある程度の範囲内である。したがって、unwind_stackプログラム21は、このようなベースポインタ83の値の特徴を利用して健全性をチェックする。
そして、作業レジスタ2の値が健全でない場合には、unwind_stackプログラム21は、ステップS9へ移動する。一方、作業レジスタ2の値が健全である場合には、unwind_stackプログラム21は、作業レジスタ2の参照アドレスに隣接するメモリ61(例えば、(作業用レジスタ2の内容+8)のアドレスになる)の内容を戻り命令アドレスiとして出力する(ステップS7)。なお、ここでは、アドレスは64ビット=8バイトとしている。そして、unwind_stackプログラム21は、作業用レジスタ1に作業用レジスタ2の値をセットし(ステップS8)、iに1を加えてステップS4へ戻る。
そして、unwind_stackプログラム21は、ステップS3及びステップS7で出力した(戻り命令アドレス1、・・・、戻り命令アドレスD)を入力し(ステップS9)、呼び出し関係の保持形式を判定する(ステップS10)。その結果、呼び出し関係の保持形式がハッシュ形式である場合には、unwind_stackプログラム21は、(戻り命令アドレス1、・・・、戻り命令アドレスD)をハッシュ関数に通した後、呼び出し関係格納専用レジスタ85に格納する(ステップS11)。一方、呼び出し関係の保持形式がパック形式である場合には、unwind_stackプログラム21は、(戻り命令アドレス1、・・・、戻り命令アドレスD)をパック形式にて、呼び出し関係格納専用レジスタ85に格納する(ステップS12)。
このように、unwind_stackプログラム21は、ベースポインタ83の値を用いてスタック61aを辿って一連の戻り命令アドレスを取得し、ハッシュ形式又はパック形式で呼び出し関係格納専用レジスタ85に格納する。また、呼び出し関係格納専用レジスタ85に格納された一連の戻り命令アドレスは、性能収集用割込みプログラム22によってメモリ61に格納される。したがって、unwind_stackプログラム21は、ハッシュ形式を使用しない場合と比較して、関数呼び出し関係の情報のメモリ61での量を削減することができる。
次に、分析プログラム4について図8〜図12を用いて説明する。図8は、分析プログラム4の機能構成を示す図である。図8に示すように、分析プログラム4は、サンプリング形式判別部41と、ハッシュ部42と、呼び出し関係復元部43と、呼び出し関係別集計部44とを有する。
なお、分析プログラム4は、サンプリングデータ記憶部3が記憶するサンプリングデータを2回のパスで処理する。第1のパスでは、分析プログラム4は、パック形式のサンプリングレコードのみを用いて逆ハッシュ表43aを作成する、ここで、サンプリングレコードとは、1つのサンプリングデータである。また、逆ハッシュ表43aは、ハッシュ値から関数呼び出し関係の情報を検索するためのテーブルである。第2のパスでは、分析プログラム4は、全サンプリングレコードを用いて関数呼び出し関係の集計を行う。そこで、以下では分析プログラム4の各機能部の処理をパス毎に説明する。
図9Aは、分析プログラム4の第1のパスを説明するための図である。図9Aに示すように、サンプリング形式判別部41は、サンプリングデータ記憶部3からサンプリングレコードを読み出し、データ形式を判定する。そして、サンプリング形式判別部41は、データ形式がパック形式の場合には、サンプリングレコードをハッシュ部42に渡し、データ形式がハッシュ形式の場合には、サンプリングレコードに対する処理は行わない。
ハッシュ部42は、サンプリングレコードに含まれる関数呼び出し関係の情報のハッシュ値を算出し、算出したハッシュ値と関数呼び出し関係の情報を呼び出し関係復元部43に渡す。呼び出し関係復元部43は、ハッシュ値と関数呼び出し関係の情報を対応付けて逆ハッシュ表43aに登録する。
図9Bは、分析プログラム4の第2のパスを説明するための図である。図9Bに示すように、サンプリング形式判別部41は、サンプリングデータ記憶部3からサンプリングレコードを読み出し、データ形式を判定する。そして、サンプリング形式判別部41は、データ形式がハッシュ形式の場合には、サンプリングレコードを呼び出し関係復元部43に渡し、データ形式がパック形式の場合には、サンプリングレコードを呼び出し関係別集計部44に渡す。
呼び出し関係復元部43は、ハッシュ形式のサンプリングレコードに含まれるハッシュ値を用いて逆ハッシュ表43aを検索し、関数呼び出し関係の情報を復元する。そして、呼び出し関係復元部43は、復元した関数呼び出し関係の情報をサンプリングレコードの形式にして呼び出し関係別集計部44に渡す。
呼び出し関係別集計部44は、サンプリング形式判別部41及び呼び出し関係復元部43から渡されたサンプリングレコードを関数呼び出し関係毎に集計し、集計結果を集計結果記憶部5に書き出す。
図10Aは、第1のパスの処理のフローを示すフローチャートである。図10Aに示すように、分析プログラム4は、サンプリングデータ記憶部3から全サンプリングレコードを順番に読み出し(ステップS21)、各サンプリングレコードに対してステップS21とステップS26で挟まれた処理を行う。
なお、図10A〜図11Bにおいて、「i=0,MaxN,1」は、iを繰り返し変数として0から1ずつ増加させながらiがMaxNになるまで処理を繰り返すことを表す。ここで、MaxNはサンプリングレコードの数−1である。
分析プログラム4は、変数DにDATA[i]をセットし(ステップS22)、Dはパック形式か否かを判定する(ステップS23)。ここで、DATA[i]は、i番目のサンプリングレコードを表す。そして、Dがパック形式でない場合には、分析プログラム4は、次のサンプリングレコードを処理する。
一方、Dがパック形式である場合には、分析プログラム4は、変数vにDの戻り命令アドレス1…Nから計算したハッシュ値をセットする(ステップS24)。すなわち、v=HASH(戻り命令アドレス1…N)とする。そして、分析プログラム4は、キーをv、値を戻り命令アドレスのリスト、すなわち、戻り命令アドレス1…Nとして、逆ハッシュ表43aに登録する(ステップS25)。
このように、分析プログラム4は、第1のパスでパック形式のサンプリングレコードから逆ハッシュ表43aを作成することによって、第2のパスで逆ハッシュ表43aを用いてハッシュ形式のサンプリングレコードを復元することができる。
図10Bは、第2のパスの処理のフローを示すフローチャートである。なお、図10Bでは、ハッシュ形式は図6(c)に示した形式である。図10Bに示すように、分析プログラム4は、サンプリングデータ記憶部3から全サンプリングレコードを順番に読み出し、各サンプリングレコードに対してステップS31とステップS38で挟まれた処理を行う。
分析プログラム4は、変数DにDATA[i]をセットし(ステップS32)、Dはパック形式か否かを判定する(ステップS33)。その結果、Dがパック形式である場合には、分析プログラム4は、DをファイルDATA#2に格納する(ステップS34)。すなわち、分析プログラム4は、i番目のサンプリングレコードDATA#2[i]=Dとする。
一方、Dがパック形式でない場合には、分析プログラム4は、D.HASHをキーとして、逆ハッシュ表43aを検索し、検索結果を戻り命令アドレスリストLとする(ステップS35)。ここで、D.HASHは、ハッシュ形式のサンプリングレコードDのハッシュ値の部分である。すなわち、逆ハッシュ表43aを検索する関数をsearchとすると、戻り命令アドレスリストL=search(D.HASH)である。
そして、分析プログラム4は、2つのリストLとD.ADDRSとを連結し、復元したサンプリングレコードRESTOREDを生成する(ステップS36)。ここで、D.ADDRSは、ハッシュ形式のサンプリングレコードDのハッシュ値を除いた部分である。すなわち、リストを連結する関数をconcatとすると、RESTORED=concat(L,D.ADDRS)である。
そして、分析プログラム4は、DATA#2[i]にRESTOREDを格納する(ステップS37)。すなわち、DATA#2[i]=RESTOREDである。
そして、全サンプリングレコードの処理が終了すると、分析プログラム4は、DATA#2に含まれる全サンプリングレコードを関数呼び出し関係別に集計する(ステップS39)。
このように、分析プログラム4は、ハッシュ形式のサンプリングレコードを逆ハッシュ表43aを用いて復元することによって、全サンプリングレコードを関数呼び出し関係別に集計することができる。
図11Aは、サンプリング結果の集計処理の第1の例を示すフローチャートである。図11Aは、戻り命令アドレス1別にサンプリング結果を集計する処理を示す。図11Aに示すように、分析プログラム4は、ファイルDATA#2から全サンプリングレコードを順番に読み出し、各サンプリングレコードに対してステップS41とステップS47で挟まれた処理を行う。
すなわち、分析プログラム4は、変数DにDATA#2[i]をセットし(ステップS42)、Xに戻り命令アドレス1が存在するか否かを判定する(ステップS43)。ここで、Xは、キーを戻り命令アドレス、値を出現回数とするハッシュ表である。D.ADDR[k]は、サンプリングレコードDの戻り命令アドレスkである(kは1〜Nの整数)。exist(X,K)は、ハッシュ表XにキーKが存在すれば値がtrueとなり、存在しなければ値がfalseとなる関数である。
そして、ハッシュ表Xに戻り命令アドレス1が存在しない場合には、分析プログラム4は、ハッシュ表XにキーがD.ADDR[1]であって値が0であるエントリを追加する(ステップS44)。ここで、insert(X,K,VA)は、ハッシュ表XにキーがKであって値がVAであるエントリを追加する関数である。
そして、分析プログラム4は、ハッシュ表XからキーがD.ADDR[1]である値を取得してVに格納する(ステップS45)。ここで、lookup(X,K)は、ハッシュ表XからキーがKである値を取得する関数である。
そして、分析プログラム4は、ハッシュ表XのキーがD.ADDR[1]である値をV+1に更新する(ステップS46)。ここで、update(X,K,VA)は、ハッシュ表XのキーがKである値をVAに更新する関数である。
このように、分析プログラム4は、D.ADDR[1]別に出現回数を数えることで、戻り命令アドレス1別にサンプリング結果を集計することができる。
図11Bは、サンプリング結果の集計処理の第2の例を示すフローチャートである。図11Bは、戻り命令アドレス1,…,Nのサンプリング数の内訳を算出するためにトライ木を作成する処理を示す。ここで、トライ木とは、木構造上のノードの位置とキーが対応付られる木である。後述する図12にトライ木の一例を示す。
図11Bに示すように、分析プログラム4は、ファイルDATA#2から全サンプリングレコードを順番に読み出し、各サンプリングレコードに対してステップS51とステップS57で挟まれた処理を行う。
すなわち、分析プログラム4は、変数DにDATA#2[i]をセットし(ステップS52)、TにD.ADDRSが存在するか否かを判定する(ステップS53)。ここで、Tは、キーを戻り命令アドレスリスト、値を出現回数とするトライ木である。exist(T,K)は、トライ木にキーKが存在すれば値がtrueとなり、存在しなければ値がfalseとなる関数である。
そして、トライ木にD.ADDRSが存在しない場合には、分析プログラム4は、トライ木にキーがD.ADDRSであってトライ木のパスの全ノードの値が0であるエントリを追加する(ステップS54)。ここで、insert(T,K)は、トライ木TにキーがKであってトライ木のパス上の全ノードの値が0であるエントリを追加する関数である。
そして、分析プログラム4は、トライ木からキーがD.ADDRSであるパスの全ノードの値を取得してそれぞれv1、v2、...、vNに格納する(ステップS55)。ここで、lookup(T,K)は、トライ木TからキーがKであるパスの全ノードの値を取得する関数である。
そして、分析プログラム4は、トライ木のキーがD.ADDRSであるパスの各ノードの値をそれぞれv1+1、v2+1、・・・、vN+1に更新する(ステップS56)。ここで、update(T,K,VL)は、トライ木TのキーがKであるパスの各ノードの値を値のリストVLの各値に更新する関数である。
このように、分析プログラム4は、D.ADDRSのパスのノード別に出現回数を数えることで、戻り命令アドレス1,…,Nのサンプリング数の内訳を算出することができる。
図12は、トライ木の一例を示す図である。図12は、6つのサンプリングレコードDATA#2[0]〜DATA#2[5]から作成されるトライ木を示す。ノードは円で図示されており、ノード内に書かれた数が命令アドレスを示している。図12に示すように、トライ木は、ノード1をルートとするサブ木とノード5をルートとするサブ木とから構成される。そして、例えばノード1をルートとするサブ木は、ノード2をルートとするサブ木とノード5のリーフとから構成される。そして、DATA#2[1]=(1,5)は、ノード1→ノード5のパスに対応する。
ノード1は、DATA#2[0]=(1,2,3)、DATA#2[1]=(1,5)及びDATA#2[3]=(1,2,3,4,7)に出現するので、出現回数は3である。図12では、出現回数は、各ノードの右の四角に囲まれた数で示される。また、例えば、ノード6の出現回数2は、先頭が(5,6)で始まる出現が2回あることを表わしている。
次に、性能情報収集プログラム1を実行するコンピュータの構成について説明する。図13は、性能情報収集プログラム1を実行するコンピュータの構成を示す図である。図13に示すように、コンピュータ60は、メモリ61と、CPU62と、HDD63と、LANインタフェース64と、入出力インタフェース65と、DVDドライブ66とを有する。
メモリ61は、プログラムやプログラムの実行途中結果などを記憶するRAM(RandomAccess Memory)であり、CPU62は、メモリ61からプログラムを読み出して実行する中央処理装置である。HDD63は、プログラムやデータを格納するディスク装置であり、LANインタフェース64は、コンピュータ60をLAN経由で他のコンピュータに接続するためのインタフェースである。入出力インタフェース65は、マウスやキーボードなどの入力装置及び表示装置を接続するためのインタフェースであり、DVDドライブ66は、DVDの読み書きを行う装置である。
そして、コンピュータ60において実行される性能情報収集プログラム1は、DVDに記憶され、DVDドライブ66によってDVDから読み出されてコンピュータ60にインストールされる。あるいは、性能情報収集プログラム1は、LANインタフェース64を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ60にインストールされる。そして、インストールされた性能情報収集プログラム1は、HDD63に記憶され、メモリ61に読み出されてCPU62によって実行される。
上述してきたように、実施例では、unwind_stackプログラム21は、関数呼び出しが行われると、スタック61aが記憶する一連の戻り命令アドレスを関数呼び出し関係の情報として呼び出し関係格納専用レジスタ85に格納する。このとき、unwind_stackプログラム21は、ハッシュ形式かパック形式のいずれかを選択し、選択した形式で関数呼び出し関係の情報を呼び出し関係格納専用レジスタ85に格納する。したがって、性能情報収集プログラム1は、全てをパック形式で格納する場合と比較して、関数呼び出し関係の情報の量を削減することできる。
また、実施例では、分析プログラム4は、パック形式のサンプリングレコードから逆ハッシュ表43aを作成し、逆ハッシュ表43aを用いてハッシュ形式のサンプリングレコードを復元する。したがって、性能情報収集プログラム1は、関数呼び出し関係の情報の量を削減するとともに、サンプリングレコード数の減少を防ぐことができる。
また、実施例では、unwind_stackプログラム21は、関数呼び出し関係の情報を呼び出し関係格納専用レジスタ85に格納する。したがって、性能収集用割込みプログラム22は、簡単に関数呼び出し関係の情報を収集することができる。
なお、実施例では、関数呼び出し時にスタック61aに戻り命令アドレス、直前のベースポインタの値、局所変数が積まれる場合について説明した。しかしながら、本発明は、これに限定されるものではなく、他のデータがスタック61aにさらに積まれる場合にも同様に適用することができる。
また、実施例では、ハッシュ関数を用いて関数呼び出し関係の情報を圧縮する場合について説明した。しかしながら、本発明は、これに限定されるものではなく、ハッシュ関数以外の非可逆圧縮関数を用いて関数呼び出し関係の情報を圧縮する場合にも同様に適用することができる。
1 性能情報収集プログラム
2 サンプリングプログラム
3 サンプリングデータ記憶部
4 分析プログラム
5 集計結果記憶部
21 unwind_stackプログラム
22 性能収集用割込みプログラム
41 サンプリング形式判別部
42 ハッシュ部
43 呼び出し関係復元部
43a 逆ハッシュ表
44 呼び出し関係別集計部
60 コンピュータ
61 メモリ
61a スタック
61b ヒープ
61c バイナリコード
62 CPU
62a PMU
63 HDD
64 LANインタフェース
65 入出力インタフェース
66 DVDドライブ
71 性能収集対象コード
71a unwind_stackコード
72 ハッシュ関数コード
73 性能収集用割込みコード
74 サンプリングバッファ
80 レジスタセット
81 命令ポインタ
82 スタックポインタ
83 ベースポインタ
84 汎用レジスタ
85 呼び出し関係格納専用レジスタ
91 戻り命令アドレス
92 直前のベースポインタの値
93 myfunc用スタックフレーム

Claims (2)

  1. コンピュータが、
    関数が実行される際に、該関数の呼び出し情報を収集し、
    収集した呼び出し情報を非可逆圧縮するか否かを選択し、
    非可逆圧縮を選択した場合には、前記呼び出し情報を非可逆圧縮してサンプリングデータとして記憶部に格納し、非可逆圧縮を選択しなかった場合には、前記呼び出し情報を圧縮することなく、又は、可逆圧縮して前記記憶部にサンプリングデータとして格納し、
    前記記憶部に格納したサンプリングデータを読み出し、該読み出したサンプリングデータに含まれる圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報を用いて、非可逆圧縮された呼び出し情報と、圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報とを対応付けた逆圧縮表を作成し、
    非可逆圧縮された呼び出し情報から元の呼び出し情報を前記逆圧縮表に基づいて復元し、
    圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報と復元された呼び出し情報に基づいて関数の呼び出し関係を集計する
    処理を実行することを特徴とする関数呼び出し情報収集方法。
  2. コンピュータに、
    関数が実行される際に、該関数の呼び出し情報を収集し、
    収集した呼び出し情報を非可逆圧縮するか否かを選択し、
    非可逆圧縮を選択した場合には、前記呼び出し情報を非可逆圧縮してサンプリングデータとして記憶部に格納し、非可逆圧縮を選択しなかった場合には、前記呼び出し情報を圧縮することなく、又は、可逆圧縮して前記記憶部にサンプリングデータとして格納し、
    前記記憶部に格納したサンプリングデータを読み出し、該読み出したサンプリングデータに含まれる圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報を用いて、非可逆圧縮された呼び出し情報と、圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報とを対応付けた逆圧縮表を作成し、
    非可逆圧縮された呼び出し情報から元の呼び出し情報を前記逆圧縮表に基づいて復元し、
    圧縮されなかった呼び出し情報又は可逆圧縮された呼び出し情報と復元された呼び出し情報に基づいて関数の呼び出し関係を集計する
    処理を実行させることを特徴とする関数呼び出し情報収集プログラム。
JP2015152834A 2015-07-31 2015-07-31 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム Active JP6540340B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015152834A JP6540340B2 (ja) 2015-07-31 2015-07-31 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム
US15/168,282 US9858170B2 (en) 2015-07-31 2016-05-31 Function-calling-information collection method and computer-readable recording medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015152834A JP6540340B2 (ja) 2015-07-31 2015-07-31 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム

Publications (2)

Publication Number Publication Date
JP2017033303A JP2017033303A (ja) 2017-02-09
JP6540340B2 true JP6540340B2 (ja) 2019-07-10

Family

ID=57885981

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015152834A Active JP6540340B2 (ja) 2015-07-31 2015-07-31 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム

Country Status (2)

Country Link
US (1) US9858170B2 (ja)
JP (1) JP6540340B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6693308B2 (ja) * 2016-07-05 2020-05-13 富士通株式会社 負荷推定プログラム、負荷推定方法及び負荷推定装置
US10761965B2 (en) * 2018-09-28 2020-09-01 Atlassian Pty Ltd. Detecting method calls based on stack trace data
US11892936B2 (en) * 2022-04-11 2024-02-06 Microsoft Tech nology Licensing, LLC Profiling a program based on a combination of dynamic instrumentation and sampling

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3199013B2 (ja) * 1998-01-26 2001-08-13 日本電気株式会社 言語処理方法及び言語処理装置並びに言語処理プログラムを記録した記憶媒体
JP4330429B2 (ja) 2003-11-05 2009-09-16 株式会社日立製作所 プロファイル情報の取得装置及び方法
JP2006202134A (ja) 2005-01-21 2006-08-03 Nec Micro Systems Ltd プロファイル情報収集方法および装置
US7734768B2 (en) * 2005-07-26 2010-06-08 International Business Machines Corporation System and method for adaptively collecting performance and event information
JP2007259274A (ja) * 2006-03-24 2007-10-04 Sony Corp 再送制御回路、送信装置、再送制御方法及び再送制御プログラム
JP2008021066A (ja) * 2006-07-12 2008-01-31 Kyocera Mita Corp 画像形成装置用トレース機能付加方法及びプログラム並びにこのプログラムがインストールされた画像形成装置
US9264478B2 (en) * 2012-10-30 2016-02-16 Microsoft Technology Licensing, Llc Home cloud with virtualized input and output roaming over network
EP2770642B1 (en) * 2013-02-26 2022-10-05 Tata Consultancy Services Limited Systems and methods for data archival
US9417988B2 (en) * 2013-02-26 2016-08-16 Red Hat, Inc. Tracking subclasses of and operations performed by generic objects in a computer system
US9491490B1 (en) * 2015-06-12 2016-11-08 Intel Corporation Facilitating environment-based lossy compression of data for efficient rendering of contents at computing devices

Also Published As

Publication number Publication date
US9858170B2 (en) 2018-01-02
JP2017033303A (ja) 2017-02-09
US20170031738A1 (en) 2017-02-02

Similar Documents

Publication Publication Date Title
US8510721B2 (en) Dynamic calculation of sample profile reports
JP6540340B2 (ja) 関数呼び出し情報収集方法及び関数呼び出し情報収集プログラム
JP2002529849A (ja) データ処理リソースを供給された内蔵システムにおいて実行可能な中間オブジェクトコードプログラムのためのデータ圧縮方法、および、この方法に対応しかつマルチアプリケーションを備えた内蔵システム
CN106844607B (zh) 一种适用于非整型主键与空闲块合并的SQLite数据恢复方法
CN110995273B (zh) 电力数据库的数据压缩方法、装置、设备及介质
US20200294629A1 (en) Gene sequencing data compression method and decompression method, system and computer-readable medium
US11675768B2 (en) Compression/decompression using index correlating uncompressed/compressed content
CN112463784A (zh) 数据去重方法、装置、设备及计算机可读存储介质
US10303655B1 (en) Storage array compression based on the structure of the data being compressed
CN107169057B (zh) 一种重复图片的检测方法和装置
CN112328298A (zh) 移动端的代码库裁剪方法及装置
van den Bos et al. Domain-specific optimization in digital forensics
JP6931442B2 (ja) 符号化プログラム、インデックス生成プログラム、検索プログラム、符号化装置、インデックス生成装置、検索装置、符号化方法、インデックス生成方法および検索方法
CN113495901B (zh) 一种面向可变长数据块的快速检索方法
US8988258B2 (en) Hardware compression using common portions of data
JP2010257330A (ja) ログファイル管理システム、ログファイル管理方法及びプログラム
US10318483B2 (en) Control method and control device
CN109271463B (zh) 一种恢复MySQL数据库的innodb压缩数据的方法
CN111078753A (zh) 基于HBase数据库的时序数据的存储方法及装置
JP2002333998A (ja) 仮想マシン内部情報取得システム
JPWO2020065778A1 (ja) 情報処理装置、制御方法、及びプログラム
JP3191857B2 (ja) シミュレーション実行装置及びそのデータ圧縮方法
CN117194355B (zh) 基于数据库的数据处理方法、装置和电子设备
CN110019053B (zh) 一种Unity3D资源包冗余数据检测方法及终端
KR102139578B1 (ko) 디스크 블록 패턴 분석을 통한 데이터베이스 파일 복구 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180413

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181228

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190205

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190401

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190514

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190527

R150 Certificate of patent or registration of utility model

Ref document number: 6540340

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150