(57)【要約】【課題】プログラムを改変することなく、プログラムが実際に使用している記憶領域の使用量を算出する。【解決手段】構造体情報ファイル記憶部１１４は、プログラムが内部メモリ領域のデータ構造に使用する構造体のサイズ及びメンバ変数のオフセット・データ型を保持する構造体情報ファイルを記憶する。設定ファイル記憶部１２３は、データ構造の先頭アドレス及び各要素の使用状態とサイズ、次要素のアドレスを保持する設定ファイルを記憶する。メモリ解析部１２１は、構造体情報ファイル及び設定ファイルを用いてメモリ使用状況を解析する。メモリ解析部１２１は、構造体情報ファイル及び設定ファイルを用いてデータ構造のアドレスを算出し、算出したアドレスを用いて実行中のプログラムのメモリ内容を読み出し、データ構造を解析することによりプログラムのメモリ使用量を算出する。【選択図】図２
2014002443.tif 000002
【特許請求の範囲】
【請求項１】
制御装置と、解析部と、取得部と、算出部とを有し、
上記解析部は、上記制御装置を用いて、対象プログラムのソースコードにおいて定義されているデータ型のサイズを算出し、
上記取得部は、上記制御装置を用いて、上記対象プログラムを実行している実行装置が上記対象プログラムの実行に用いるデータを記憶している記憶装置から、上記記憶装置の記憶領域に記憶されているデータを取得し、
上記算出部は、上記制御装置を用いて、上記取得部が取得したデータに基づいて、上記対象プログラムが使用している変数を抽出し、抽出した変数と、上記変数のデータ型について上記解析部が算出したサイズとに基づいて、上記記憶領域のうち、上記対象プログラムが使用している記憶領域のサイズを算出する
ことを特徴とする使用量算出装置。
【請求項２】
上記使用量算出装置は、更に、累積実行時間取得部と、判定部とを有し、
上記累積実行時間取得部は、上記制御装置を用いて、上記実行装置が上記対象プログラムを実行している累積実行時間を取得し、
上記判定部は、第一の時刻において上記取得部が取得したデータに基づいて上記算出部が算出した上記対象プログラムが使用している記憶領域のサイズと、第二の時刻において上記取得部が取得したデータに基づいて上記算出部が算出した上記対象プログラムが使用している記憶領域のサイズとが等しく、かつ、上記第一の時刻において上記累積実行時間取得部が取得した累積実行時間と、上記第二の時刻において上記累積実行時間取得部が取得した累積実行時間とが異なる場合に、上記算出部が算出した上記対象プログラムが使用している記憶領域のサイズが正しいと判定する
ことを特徴とする請求項１に記載の使用量算出装置。
【請求項３】
上記変数のうち少なくともいずれかの変数は、上記変数に関連する他の変数の有無を表わす値を含み、
上記算出部は、上記取得部が取得したデータから変数の値を取得し、上記変数に関連する他の変数が存在するか否かを判定することにより、上記対象プログラムが使用している変数を抽出する
ことを特徴とする請求項１または請求項２に記載の使用量算出装置。
【請求項４】
上記変数のうち少なくともいずれかの変数は、上記変数に関連する他の変数が存在する場合に上記記憶領域のなかで上記他の変数の値が記憶されている位置を表わす値を含み、
上記算出部は、上記変数に関連する他の変数が存在すると判定した場合に、上記記憶領域のなかで上記他の変数の値が記憶されている位置を取得し、取得した位置に基づいて、上記取得部が取得したデータから上記他の変数の値を取得する
ことを特徴とする請求項３に記載の使用量算出装置。
【請求項５】
上記算出部は、上記変数に関連する他の変数が存在すると判定した場合に、上記記憶領域のなかで上記変数の値が記憶されている位置と、上記変数のデータ型について上記解析部が算出したサイズとに基づいて、上記記憶領域のなかで上記他の変数の値が記憶されている位置を算出し、算出した位置に基づいて、上記取得部が取得したデータから上記他の変数の値を取得する
ことを特徴とする請求項３または請求項４に記載の使用量算出装置。
【請求項６】
上記解析部は、上記対象プログラムのソースコードから上記データ型の定義を抽出し、抽出したデータ型の定義に基づいて、上記データ型のサイズを算出する算出プログラムのソースコードを生成し、生成したソースコードに基づいて上記算出プログラムを生成し、生成した算出プログラムを実行することにより、上記データ型のサイズを算出する
ことを特徴とする請求項１乃至請求項５のいずれかに記載の使用量算出装置。
【請求項７】
コンピュータが実行することにより、請求項１乃至請求項６のいずれかに記載の使用量算出装置として上記コンピュータを機能させることを特徴とするコンピュータプログラム。
【請求項８】
制御装置が、対象プログラムのソースコードにおいて定義されているデータ型のサイズを算出し、
上記制御装置が、上記対象プログラムを実行している実行装置が上記対象プログラムの実行に用いるデータを記憶している記憶装置から、上記記憶装置の記憶領域に記憶されているデータを取得し、
上記制御装置が、取得したデータに基づいて、上記対象プログラムが使用している変数の数を算出し、算出した変数の数と、上記変数のデータ型について算出したサイズとに基づいて、上記記憶領域のうち、上記対象プログラムが使用している記憶領域のサイズを算出する
ことを特徴とする使用量算出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラムが実際に使用している記憶領域の使用量を算出する使用量算出装置に関する。
【背景技術】
【０００２】
ＯＳ（オペレーティングシステム）は、プロセス（プログラム）にメモリ（記憶装置）のメモリ領域（記憶領域）を割り当てる。プロセスに割り当てられたメモリ領域を使い切る直前や、使い切った時点で障害が発生する場合がある。
そこで、運用中のシステムにおいて、メモリ領域内の使用状況（プロセスに割り当てられたメモリ領域のうちどの程度を実際に使用しているか）を監視することが重要である。
また、試験段階のシステムでは、メモリ領域を使い切るような負荷試験を行うことが重要である。
【０００３】
ＯＳの機能を使えば、プロセスに割り当てられたメモリ領域全体のサイズを取得することができる。
【０００４】
また、オブジェクト指向言語において、コンストラクタに、生成したインスタンスの数を数えるコードを埋め込むことにより、プログラム実行中に生成したインスタンス数を算出し、メモリ使用量を計測する技術がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００２−７３３８０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ＯＳの機能を使う方式では、プロセスに割り当てられたメモリ領域のうち、プロセスが実際に使用している使用量を知ることはできない。
また、生成したインスタンスの数を数えるコードをコンストラクタに埋め込む方式は、プログラムの改変が必要なので、稼働中のシステムに適用することはできない。また、試験段階で行う負荷試験にも適用することができない。更に、ソースコードがオブジェクト指向言語以外の言語で記述されたプログラムにも適用することができない。
【０００７】
この発明は、例えば、プログラムを改変することなく、プログラムが実際に使用している記憶領域の使用量を算出することを目的とする。
【課題を解決するための手段】
【０００８】
この発明にかかる使用量算出装置は、
制御装置と、解析部と、取得部と、算出部とを有し、
上記解析部は、上記制御装置を用いて、対象プログラムのソースコードにおいて定義されているデータ型のサイズを算出し、
上記取得部は、上記制御装置を用いて、上記対象プログラムを実行している実行装置が上記対象プログラムの実行に用いるデータを記憶している記憶装置から、上記記憶装置の記憶領域に記憶されているデータを取得し、
上記算出部は、上記制御装置を用いて、上記取得部が取得したデータに基づいて、上記対象プログラムが使用している変数を抽出し、抽出した変数と、上記変数のデータ型について上記解析部が算出したサイズとに基づいて、上記記憶領域のうち、上記対象プログラムが使用している記憶領域のサイズを算出することを特徴とする。
【発明の効果】
【０００９】
この発明にかかる使用量算出装置によれば、プログラムを改変することなく、プログラムが実際に使用している記憶領域の使用量を算出することができる。
【図面の簡単な説明】
【００１０】
【図１】計算機上で動作するプロセスによるメモリ使用状況の一例を示す図。
【図２】実施の形態１におけるメモリ使用量監視システムの一例を示すシステム構成図。
【図３】実施の形態１における設定ファイルの一例を示す図。
【図４】実施の形態１における構造体情報生成部１１が構造体情報ファイルを生成する処理の流れの一例を示すフロー図。
【図５】実施の形態１におけるメモリ解析処理の流れの一例を示すフロー図。
【図６】実施の形態１における設定値取得処理の流れの一例を示すフロー図。
【図７】実施の形態２におけるメモリ使用量監視システムの一例を示すシステム構成図。
【図８】実施の形態２におけるメモリ解析の流れを示す図。
【図９】実施の形態２におけるメモリ解析処理の流れの一例を示すフロー図。
【図１０】実施の形態３におけるメモリ使用量監視システム１０の構成の一例を示すブロック図。
【図１１】実施の形態３における実行装置１４及び使用量算出装置１３のハードウェア資源の一例を示す図。
【図１２】実施の形態３における実行装置１４及び使用量算出装置１３の機能ブロックの一例を示す図。
【図１３】実施の形態３における解析部３２の詳細な機能ブロックの一例を示す図。
【図１４】実施の形態３における解析部３２が処理するデータの一例を示す図。
【図１５】実施の形態３における算出部３５の詳細な機能ブロックの一例を示す図。
【図１６】実施の形態３における判定部３７の詳細な機能ブロックの一例を示す図。
【発明を実施するための形態】
【００１１】
実施の形態１．
実施の形態１について、図１〜図６を用いて説明する。
【００１２】
図１は、計算機上で動作するプロセスによるメモリ使用状況の一例を示す図である。
【００１３】
計算機上で動作するプロセスは、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）に対して必要とするサイズのメモリ領域の割り当てを依頼し、割り当てられたメモリ領域の内部は各プロセスが独自に管理する。常に割り当て領域全体を使用している訳ではなく、プロセスの実行に伴うデータの生成／破棄により使用状況は変化する。
【００１４】
図２は、この実施の形態におけるメモリ使用量監視システムの一例を示すシステム構成図である。
【００１５】
メモリ使用量監視システムは、メモリ使用量監視装置１と、開発環境装置２と、実行環境装置３とを有する。開発環境装置２は、プログラム開発を行う。実行環境装置３は、試験環境であってもよいし、実システムであってもよい。メモリ使用量監視装置１（使用量算出装置）は、構造体情報生成部１１と、メモリ使用量監視部１２とを有する。
【００１６】
構造体情報生成部１１（解析部）は、ソースコード格納部１１１と、構造体情報ファイル記憶部１１４と、構造体情報生成プログラム実行部１１３と、ソース解析部１１２とを有する。
ソースコード格納部１１１は、ソースコードを保持する。
ソース解析部１１２は、ソースコードを解析して構造体情報生成プログラムを生成する。
構造体情報生成プログラム実行部１１３は、ソース解析部１１２が生成した構造体情報生成プログラムを実行して構造体情報ファイルを出力する。
構造体情報ファイル記憶部１１４は、構造体情報生成プログラム実行部１１３が出力した構造体情報ファイルを記憶する。構造体ファイルは、ソースコード中に定義された構造体のサイズ及びメンバ変数のオフセット、データ型を保持する。
【００１７】
メモリ使用量監視部１２は、メモリ解析部１２１と、シンボル情報格納部１２２と、設定ファイル記憶部１２３とを有する。
メモリ解析部１２１（取得部・算出部）は、実行中のプログラムのメモリ内容を解析する。
シンボル情報格納部１２２は、開発環境でプログラムをコンパイルする際に出力されるシンボル情報を格納する。
設定ファイル記憶部１２３は、設定ファイルを記憶する。
【００１８】
図３は、この実施の形態における設定ファイルの一例を示す図である。
【００１９】
「ＴＹＰＥ」は、データ構造のタイプを示す設定項目である。「ＦＩＲＳＴ＿ＬＡＳＴ」は、キュー・スタックを意味する。「ＴＡＢＬＥ」は、テーブルを意味する。「ＬＩＳＴ」は、リンクリストを意味する。
「ＨＥＡＤ」は、データ管理構造の先頭アドレスを格納する変数を示す。
「ＦＩＲＳＴ」及び「ＬＡＳＴ」は、「ＦＩＲＳＴ＿ＬＡＳＴ」タイプにおいて使用領域の先頭及び末尾を格納する変数を示す。
「ＦＬＡＧ」は、「ＴＡＢＬＥ」タイプにおいて各エントリの使用状態（使用／未使用）が設定される変数を示す。
「ＮＥＸＴ」は、データ管理構造の次要素を格納する変数を示す。
「ＬＥＮ」は、各要素のサイズを格納する変数を示す。
【００２０】
設定ファイルの各設定項目では、「Ｇｌｏｂａｌ」／「Ｓｔｒｕｃｔ」／「ｓｉｚｅｏｆ」の３種類の指定方法が可能である。「Ｇｌｏｂａｌ：ｘｘｘ」はグローバル変数ｘｘｘの値を意味する。「Ｓｔｒｕｃｔ：ｘｘｘ．ｙｙｙ」は、構造体ｘｘｘのメンバ変数ｙｙｙの値を意味する。「ｓｉｚｅｏｆ（Ｓｔｒｕｃｔ：ｘｘｘ）」は、構造体ｘｘｘのサイズを意味する。
【００２１】
次に、構造体情報生成部１１の動作について説明する。
【００２２】
図４は、この実施の形態における構造体情報生成部１１が構造体情報ファイルを生成する処理の流れの一例を示すフロー図である。
【００２３】
まず、ステップＳ４０１において、ソース解析部１１２は、ソースコード格納部１１１に格納されたソースファイルから、プログラムが使用する構造体の定義情報を抽出する。
次に、ステップＳ４０２において、ソース解析部１１２は、抽出した構造体定義情報を用いて、構造体情報生成プログラムのソースコードを生成する。
さらに、ステップＳ４０３において、構造体情報生成プログラム実行部１１３は、ソース解析部１１２が生成したソースコードをコンパイルして実行し、構造体情報ファイルを出力する。構造体情報ファイル記憶部１１４は、構造体情報生成プログラム実行部１１３が出力した構造体情報ファイルを記憶する。
【００２４】
次に、メモリ使用量監視部１２の動作について説明する。ここでは、リスト構造を解析する場合を例にとって説明する。
【００２５】
図５は、この実施の形態におけるメモリ解析処理の流れの一例を示すフロー図である。
【００２６】
メモリ解析処理は、メモリ使用量監視部１２がメモリ解析をする処理である。
【００２７】
まず、ステップＳ５０１において、メモリ解析部１２１は、メモリ使用量を表わす変数ｓｉｚｅの値を０に初期化する。
次に、ステップＳ５０２において、メモリ解析部１２１は、設定ファイル記憶部１２３が記憶した設定ファイルの設定項目「ＨＥＡＤ」に設定された変数から、解析するリストの先頭アドレスを取得して変数ｐに設定する。
さらに、ステップＳ５０３において、メモリ解析部１２１は、設定ファイル記憶部１２３が記憶した設定ファイルの設定項目「ＬＥＮ」に設定された値を取得して変数ｌｅｎに設定する。
ステップＳ５０４において、メモリ解析部１２１は、変数ｌｅｎの値をメモリ使用量ｓｉｚｅに加算する。
ステップＳ５０５において、メモリ解析部１２１は、リスト末尾に達した否かを判定する。末尾に達した場合、メモリ解析部１２１は処理を終了する。
末尾に達していない場合、メモリ解析部１２１は、ステップＳ５０６へ処理を進め、設定ファイル記憶部１２３が記憶した設定ファイルの設定項目「ＮＥＸＴ」に設定された値を取得して変数ｎｅｘｔに設定する。
ステップＳ５０７において、メモリ解析部１２１は、変数ｎｅｘｔの値を、変数ｐに設定する。メモリ解析部１２１は、ステップＳ５０３に処理を戻し、次の要素を解析する。
【００２８】
図６は、この実施の形態における設定値取得処理の流れの一例を示すフロー図である。
【００２９】
設定値取得処理は、メモリ解析処理において、メモリ解析部１２１が設定ファイルに設定された値を読み出す処理である。
【００３０】
まず、ステップＳ６０１において、メモリ解析部１２１は、設定ファイル記憶部１２３が記憶した設定ファイルから記述内容を読み出す。
ステップＳ６０２において、メモリ解析部１２１は、設定値の種別を判定する。
設定値がｓｉｚｅｏｆ（Ｓｔｒｕｃｔ：ｘｘｘ）である場合、メモリ解析部１２１は、ステップＳ６０３へ処理を進める。
設定値がＳｔｒｕｃｔ：ｘｘｘ．ｙｙｙである場合、メモリ解析部１２１は、ステップＳ６０４へ処理を進める。
設定値がＧｌｏｂａｌ：ｘｘｘである場合、メモリ解析部１２１は、ステップＳ６０７へ処理を進める。
【００３１】
ステップＳ６０３において、構造体情報ファイル記憶部１１４が記憶した構造体情報ファイルから構造体ｘｘｘのサイズを取得して、処理を終了する。
【００３２】
ステップＳ６０４において、メモリ解析部１２１は、まず、構造体情報ファイル記憶部１１４が記憶した構造体情報ファイルから、構造体ｘｘｘのメンバ変数ｙｙｙのオフセットを取得して変数ｏｆｆに設定する。
次に、ステップＳ６０５において、メモリ解析部１２１は、現在解析中の要素の先頭アドレスｐに取得したオフセットｏｆｆを加算してメンバ変数ｙｙｙのアドレスを算出し、変数ａｄに設定する。メモリ解析部１２１は、ステップＳ６０６へ処理を進める。
【００３３】
ステップＳ６０７において、メモリ解析部１２１は、シンボル情報格納部１２２に格納されているシンボル情報からグローバル変数ｘｘｘのアドレスを取得して、変数ａｄに設定する。メモリ解析部１２１は、ステップＳ６０６へ処理を進める。
【００３４】
ステップＳ６０６において、メモリ解析部１２１は、実行環境装置３で実行中のプログラムのメモリから、ステップＳ６０５またはステップＳ６０７で算出したアドレスａｄに格納されている値を読み出す。
【００３５】
以上のように、実行中のプログラムのメモリ中にあるデータ管理構造を解析することにより、プログラムが確保したメモリ領域内の実際の使用状況を、対象プログラムを改変することなく監視することができる。
【００３６】
この実施の形態におけるメモリ使用量監視装置１は、構造体情報ファイル記憶部１１４と、設定ファイル記憶部１２３と、メモリ解析部１２１とを有する。
構造体情報ファイル記憶部１１４は、プログラムが内部メモリ領域のデータ構造に使用する構造体のサイズ及びメンバ変数のオフセット・データ型を保持する構造体情報ファイルを記憶する。
設定ファイル記憶部１２３は、データ構造の先頭アドレス及び各要素の使用状態とサイズ、次要素のアドレスを保持する設定ファイルを記憶する。
メモリ解析部１２１は、構造体情報ファイル及び設定ファイルを用いてメモリ使用状況を解析する。
メモリ解析部１２１は、構造体情報ファイル及び設定ファイルを用いてデータ構造のアドレスを算出し、算出したアドレスを用いて実行中のプログラムのメモリ内容を読み出し、データ構造を解析することによりプログラムのメモリ使用量を算出する。
【００３７】
メモリ使用量監視装置１は、ソースコード格納部１１１と、ソース解析部１１２とを備える構造体情報生成部１１を有する。
ソース解析部１１２は、ソースコード格納部１１１に格納されたソースコードから、プログラムが使用する構造体の定義情報を抽出し、抽出結果を用いて構造体情報ファイルを出力する構造体情報生成プログラムを生成／実行し、構造体情報ファイルを自動生成する。
【００３８】
この実施の形態におけるメモリ使用量監視装置１は、実行中プロセスのメモリを解析することにより、プログラムを改変することなくプロセスのメモリ使用状況を監視する。これにより、負荷試験時や稼働中システムのメモリ使用量の監視を行うことが可能になる。
【００３９】
実施の形態２．
実施の形態２について、図７〜図９を用いて説明する。
なお、実施の形態１と共通する部分については、同一の符号を付し、説明を省略する。
【００４０】
この実施の形態では、メモリ解析時にプログラムの動作状態を確認し、プログラムが解析対象のデータ構造を操作していた場合は解析結果を破棄する構成について説明する。
【００４１】
図７は、この実施の形態におけるメモリ使用量監視システムの一例を示すシステム構成図である。
【００４２】
メモリ使用量監視部１２は、実施の形態１で説明した構成に加えて、更に、解析結果判定部１２４（累積実行時間取得部・判定部）を有する。それ以外は、実施の形態１と同様である。
【００４３】
図８は、この実施の形態におけるメモリ解析の流れを示す図である。
【００４４】
メモリ使用量監視部１２は、１回のメモリ使用量の計測において、プログラムが解析対象のデータ構造を操作していないことが確認されるまで、複数回のメモリ解析を行う。
Ｔｆｉｘは、前回の計測完了時刻である。Ｔ０は、今回の計測における１回目のメモリ解析の開始時刻である。Ｔｎは、今回の計測におけるｎ回目のメモリ解析の完了時刻である。
【００４５】
図９は、この実施の形態におけるメモリ解析処理の流れの一例を示すフロー図である。
【００４６】
まず、ステップＳ９０１において、メモリ解析部１２１は、計測開始時刻Ｔ０までのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）消費時間Ｅ（Ｔ０）を取得する。なお、Ｅ（Ｔｎ）は、プログラム開始から時刻Ｔｎまでに、プログラムが消費したＣＰＵ時間を意味する。
ステップＳ９０２において、メモリ解析部１２１は、取得したＥ（Ｔ０）を、前回の計測完了時刻までのＣＰＵ消費時間Ｅ（Ｔｆｉｘ）と比較する。
Ｅ（Ｔ０）＝Ｅ（Ｔｆｉｘ）の場合、前回計測時からプログラムが全く動作していないことを意味する。この場合は、メモリ使用量も変化しないので、メモリ解析部１２１は、計測を終了し、Ｓ９１０へ処理を進める。
Ｅ（Ｔ０）＞Ｅ（Ｔｆｉｘ）の場合、メモリ解析部１２１は、ステップＳ９０３へ処理を進め、計測を行う。
【００４７】
まず、ステップＳ９０３において、メモリ解析部１２１は、１回目のメモリ解析を実行する。
ステップＳ９０４において、メモリ解析部１２１は、解析完了時刻Ｔ１までのＣＰＵ消費時間Ｅ（Ｔ１）を取得する。
【００４８】
ステップＳ９０５において、メモリ解析部１２１は、さらに、ｎ回目のメモリ解析を実行する。
ステップＳ９０６において、メモリ解析部１２１は、解析完了時刻ＴｎまでのＣＰＵ消費時間Ｅ（Ｔｎ）を取得する。
ステップＳ９０７において、解析結果判定部１２４は、ｎ回目のメモリ解析結果を、（ｎ−１）回目のメモリ解析結果と比較する。
ステップＳ９０８において、解析結果判定部１２４は、２回のメモリ解析結果が一致しない場合、ステップＳ９０５に処理を戻し、メモリ解析部１２１にもう一度メモリ解析を実行させる。
２回のメモリ解析結果が一致した場合、解析結果判定部１２４は、ステップＳ９０９へ処理を進める。
ステップＳ９０９において、解析結果判定部１２４は、解析完了時刻ＴｎまでのＣＰＵ消費時間Ｅ（Ｔｎ）を、解析完了時刻Ｔｎ−１までのＣＰＵ消費時間Ｅ（Ｔｎ−１）と比較する。
Ｅ（Ｔｎ）がＥ（Ｔｎ−１）以下である場合、解析結果判定部１２４は、ステップＳ９０５に処理を戻し、メモリ解析部１２１にもう一度メモリ解析を実行させる。
Ｅ（Ｔｎ）がＥ（Ｔｎ−１）より大きい場合、解析中にプログラムが実行されたにも関わらず解析結果が変化していないので、プログラムが解析対象のデータ構造を操作していないと考えられる。メモリ解析部１２１は、メモリ解析を終了し、ステップＳ９１０へ処理を進める。
【００４９】
これにより、メモリ使用量監視部１２は、ステップＳ９０８及びステップＳ９０９の条件をともに満たすまでメモリ解析を繰り返す。
【００５０】
ステップＳ９１０において、メモリ解析部１２１は、最後に実行したメモリ解析の結果を、今回の計測におけるメモリ使用量とする。
【００５１】
以上のように、メモリ解析中のプログラムによるデータ構造操作の有無を判定し、データ構造操作が行われた場合の解析結果を破棄する。これにより、監視対象のプログラムが解析対象のデータ構造を操作している最中に、監視対象プログラムの動作とは無関係にメモリ解析処理を行うことにより誤ったメモリ使用量を算出するのを防ぐことができ、プログラムが確保したメモリ領域内の実際の使用状況を、対象プログラムを改変することなく、正確に監視することができる。
【００５２】
この実施の形態におけるメモリ使用量監視装置１は、解析結果判定部１２４を有する。
解析結果判定部１２４は、メモリ解析部１２１の解析結果を判定する。
解析結果判定部１２４は、メモリ解析部１２１による解析中の、プログラムによる解析対象データ構造の操作の有無を判定し、データ構造操作があった場合は解析結果を破棄してメモリ解析部１２１に対してメモリ解析の再実行を指示する。
【００５３】
実施の形態３．
実施の形態３について、図１０〜図１６を用いて説明する。
なお、実施の形態１または実施の形態２と共通する部分については、同一の符号を付し、説明を省略する。
【００５４】
図１０は、この実施の形態におけるメモリ使用量監視システム１０の構成の一例を示すブロック図である。
メモリ使用量監視システム１０は、例えば、実行装置１４と、使用量算出装置１３とを有する。
実行装置１４は、メモリ使用量を監視する対象となるプログラム（以下「対象プログラム」と呼ぶ。）を実行する。
使用量算出装置１３は、実行装置１４において対象プログラムのメモリ使用量を算出する。
【００５５】
図１１は、この実施の形態における実行装置１４及び使用量算出装置１３のハードウェア資源の一例を示す図である。
【００５６】
実行装置１４や使用量算出装置１３は、例えば、コンピュータである。コンピュータは、制御装置９１と、入力装置９２と、出力装置９３と、記憶装置９４と、演算装置９５とを有する。
記憶装置９４は、プログラムやデータを記憶する。記憶装置９４は、例えば、揮発性メモリ（ＲＡＭ）や不揮発性メモリ（ＲＯＭ）などの内部記憶装置や、磁気ディスク装置や光ディスク装置などの外部記憶装置である。
制御装置９１は、記憶装置９４が記憶したプログラムを実行することにより、コンピュータ全体を制御する。
入力装置９２は、制御装置９１による制御にしたがって、コンピュータの外部から情報を入力して、データに変換する。入力装置９２は、例えば、キーボードやマウスなどの操作入力装置、マイクなどの音声入力装置、カメラやスキャナなどの画像入力装置、温度や電圧などの物理量を測定する測定装置、他の装置が送信した信号を受信して復号する受信装置などである。
演算装置９５は、制御装置９１による制御にしたがって、記憶装置９４が記憶したデータや、入力装置９２が変換したデータを対象とした演算をする。演算装置９５がする演算は、例えば、算術演算や論理演算などである。演算装置９５が演算をした結果を表わすデータは、例えば、記憶装置９４が記憶する。
出力装置９３は、制御装置９１による制御にしたがって、記憶装置９４が記憶したデータや、演算装置９５が演算した結果を表わすデータを変換して、コンピュータの外部に出力する。出力装置９３は、例えば、文字や画像などを表示する表示装置、文字や画像などを印刷する印刷装置、スピーカなどの音声出力装置、他の装置に対して信号を送信する送信装置などである。
【００５７】
以下に説明する実行装置１４や使用量算出装置１３の機能ブロックは、記憶装置９４が記憶したプログラムを制御装置９１が実行することにより実現できる。なお、実行装置１４や使用量算出装置１３は、物理的に１つのコンピュータによって実現される構成であってもよいし、複数のコンピュータによって実現される構成であってもよい。また、実行装置１４と使用量算出装置１３とが、同じ１つのコンピュータによって実現される構成であってもよい。
なお、実行装置１４や使用量算出装置１３の機能ブロックは、必ずしもコンピュータによって実現されるものでなくてもよい。
【００５８】
図１２は、この実施の形態における実行装置１４及び使用量算出装置１３の機能ブロックの一例を示す図である。
【００５９】
実行装置１４は、例えば、対象プログラム記憶部４１と、対象プログラム実行部４２と、データ記憶部４３と、累積実行時間計測部４４と、累積実行時間記憶部４５とを有する。
【００６０】
対象プログラム記憶部４１は、記憶装置９４を用いて、対象プログラムを記憶している。対象プログラム記憶部４１が記憶している対象プログラムは、例えば、対象プログラムのソースコードをコンパイルすることにより生成された実行形式コードである。
対象プログラム実行部４２は、制御装置９１を用いて、対象プログラム記憶部４１が記憶している対象プログラムを実行する。
データ記憶部４３は、記憶装置９４を用いて、対象プログラム実行部４２が対象プログラムを実行するために必要なデータを記憶する。データ記憶部４３が記憶するデータには、例えば、対象プログラムで使用されている変数の値を表わすデータや、変数の値を記憶したアドレスを表わすデータなどがある。
累積実行時間計測部４４は、制御装置９１を用いて、対象プログラム実行部４２が対象プログラムを実行した時間の累積（以下「累積実行時間」と呼ぶ。）を計測する。
累積実行時間記憶部４５は、記憶装置９４を用いて、累積実行時間計測部４４が計測した累積実行時間を記憶する。
【００６１】
実行装置１４の制御装置９１は、対象プログラムだけでなく、他のプログラムも並行して実行する。制御装置９１は、複数のプログラムを時分割で切り替えながら実行する。制御装置９１は、一つのプログラムの実行を開始したのち、所定の時間が経過した場合や入出力待ちになった場合に、そのプログラムの実行を中断して、別のプログラムの実行を開始し、あるいは、中断していた実行を再開する。これを繰り返すことにより、実行装置１４は、あたかも複数のプログラムを同時に実行しているかのように振舞う。累積実行時間計測部４４は、このうち、制御装置９１が対象プログラムを実行している時間だけを計測して、累計する。したがって、制御装置９１が対象プログラムを実行している間は、累積実行時間が増加していき、制御装置９１が対象プログラムの実行を中断している間は、累積実行時間は変化しない。
また、実行装置１４の制御装置９１は、記憶装置９４の記憶領域を複数に分割して管理する。分割された記憶領域は、例えば、いずれかのプログラムに割り当てられ、あるいは、プログラムの切替を管理するために割り当てられる。データ記憶部４３は、このうち、対象プログラムに割り当てられた記憶領域を使って、対象プログラムを実行するために必要なデータを記憶する。
【００６２】
使用量算出装置１３は、例えば、対象ソース記憶部３１と、解析部３２と、解析結果記憶部３３と、データ取得部３４と、算出部３５と、累積実行時間取得部３６と、判定部３７と、出力部３８とを有する。
【００６３】
対象ソース記憶部３１は、記憶装置９４を用いて、対象プログラムのソースコードを記憶している。対象プログラムのソースコードは、例えばＣ言語などのプログラミング言語で記述されたテキストである。
解析部３２は、制御装置９１を用いて、対象ソース記憶部３１が記憶したソースコードを解析する。解析部３２は、例えば、ソースコードでユーザが定義したデータ型のサイズなどの情報を抽出する。ユーザが定義したデータ型には、例えば構造体やクラスなどがある。データ型のサイズとは、そのデータ型であると宣言された変数の値を、実行装置１４の記憶装置９４が記憶するために必要となる記憶領域の大きさである。データ型のサイズは、例えばバイト単位あるいはワード単位の自然数である。
解析結果記憶部３３は、記憶装置９４を用いて、解析部３２がソースコードを解析して得た情報（以下「解析結果」と呼ぶ。）を記憶する。
【００６４】
データ取得部３４は、制御装置９１を用いて、データ記憶部４３が記憶しているデータを取得し、記憶装置９４を用いて記憶する。対象プログラム実行部４２が対象プログラムを実行している場合、データ記憶部４３が記憶しているデータは、頻繁に書き換えられる。データ取得部３４は、ある時点でデータ記憶部４３が記憶しているデータをそのまま複製して、スナップショットを記憶する。
累積実行時間取得部３６は、制御装置９１を用いて、累積実行時間記憶部４５が記憶している累積実行時間を取得し、記憶装置９４を用いて記憶する。累積実行時間は、対象プログラム実行部４２が対象プログラムを実行している間、増加していく。累積実行時間取得部３６は、データ記憶部４３が記憶しているデータをデータ取得部３４が取得した時点における累積実行時間を取得する。
【００６５】
算出部３５は、制御装置９１を用いて、解析結果記憶部３３が記憶した解析結果と、データ取得部３４が記憶したデータとに基づいて、対象プログラム実行部４２が実行している対象プログラムに割り当てられた記憶領域のうち、実際に使用されている記憶領域のサイズを算出する。
判定部３７は、制御装置９１を用いて、累積実行時間取得部３６が記憶した累積実行時間に基づいて、算出部３５が算出したサイズが正しいか否かを判定する。
出力部３８は、制御装置９１を用いて、算出部３５が算出したサイズが正しいと判定部３７が判定した場合に、算出部３５が算出したサイズを出力する。出力部３８は、例えば、出力装置９３を用いて、算出部３５が算出したサイズを出力する。なお、出力部３８は、記憶装置９４を用いて、算出部３５が算出したサイズを記録する構成であってもよい。
【００６６】
図１３は、この実施の形態における解析部３２の詳細な機能ブロックの一例を示す図である。
【００６７】
解析部３２は、例えば、ソース変換部３２１と、算出ソース記憶部３２２と、コンパイル部３２３と、算出プログラム記憶部３２４と、算出プログラム実行部３２５とを有する。
【００６８】
ソース変換部３２１は、制御装置９１を用いて、対象ソース記憶部３１が記憶した対象プログラムのソースコードを変換して、解析結果を算出する算出プログラムのソースコードを生成する。
算出ソース記憶部３２２は、記憶装置９４を用いて、ソース変換部３２１が生成した算出プログラムのソースコードを記憶する。
コンパイル部３２３は、制御装置９１を用いて、算出ソース記憶部３２２が記憶した算出プログラムのソースコードをコンパイルして、算出プログラムの実行形式コードを生成する。
算出プログラム記憶部３２４は、記憶装置９４を用いて、コンパイル部３２３が生成した算出プログラムの実行形式コードを記憶する。
算出プログラム実行部３２５は、制御装置９１を用いて、算出プログラム記憶部３２４が記憶した算出プログラムの実行形式コードを実行することにより、解析結果を算出する。
【００６９】
なお、実行装置１４の制御装置９１が実行できる実行形式コードと、使用量算出装置１３の制御装置９１が実行できる実行形式コードとが異なる場合、コンパイル部３２３は、クロスコンパイルにより、実行装置１４の制御装置９１が実行できる実行形式コードを生成する。算出プログラム実行部３２５は、実行装置１４の制御装置９１をエミュレートすることにより、実行装置１４の制御装置９１が実行できる実行形式コードである算出プログラムを実行する。
【００７０】
図１４は、この実施の形態における解析部３２が処理するデータの一例を示す図である。
【００７１】
ソースコード２１は、対象ソース記憶部３１が記憶している対象プログラムのソースコードである。
ソースコード２２は、ソースコード２１をソース変換部３２１が変換して生成し、算出ソース記憶部３２２が記憶する算出プログラムのソースコードである。
解析結果２３は、ソースコード２２をコンパイル部３２３がコンパイルして生成した算出プログラムを算出プログラム実行部３２５が実行することにより出力し、解析結果記憶部３３が記憶するものである。
【００７２】
例えば、ソースコード２１がＣ言語で記述されたものである場合、ソース変換部３２１が生成するソースコード２２も、Ｃ言語で記述される。
【００７３】
ソース変換部３２１は、例えば、ソースコード２１のなかから、構造体の定義を表わす「ｓｔｒｕｃｔ」文や、「ｓｔｒｕｃｔ」文を含む「ｔｙｐｅｄｅｆ」文など、データ型の宣言を抽出する。
例えば、この例に示したソースコード２１では、「ｔｙｐｅｄｅｆ」文２１１によって「ｓ１＿ｔ」型というデータ型が定義されている。「ｓ１＿ｔ」型は、整数ｉと倍精度実数ｄとをメンバとする構造体である。また、「ｓｔｒｕｃｔ」文２１２によって、構造体「＿ｓ２」が定義されている。構造体「＿ｓ２」は、１０文字の固定長文字列ｓと、「ｓ１＿ｔ」型へのポインタｐと、構造体「＿ｓ２」へのポインタｑとをメンバとする構造体である。
【００７４】
ソース変換部３２１は、抽出したデータ型の宣言に基づいて、構造体のサイズや、構造体のメンバのデータ型やオフセットなど、定義されたデータ型についての情報を出力する算出プログラムを生成する。
例えば、ソース変換部３２１は、ソースコード２１から、「ｔｙｐｅｄｅｆ」文２１１や「ｓｔｒｕｃｔ」文２１２などデータ型の宣言をそのまま複製して、「ｔｙｐｅｄｅｆ」文２２１や「ｓｔｒｕｃｔ」文２２２を生成する。ソース変換部３２１は、宣言されているデータ型の変数を生成して、サイズやオフセットなどの情報を出力する処理を表わすソースコード２２３を生成して追加し、ソースコード２２とする。
【００７５】
ソースコード２２をコンパイル部３２３がコンパイルして、算出プログラム実行部３２５が実行することにより、解析結果２３を生成する。
例えば、この例に示した解析結果２３によれば、「ｓ１＿ｔ」型は、サイズが１６バイトであり、整数型であるメンバｉと、倍精度実数型であるメンバｄとを有する。メンバｉのオフセットは０バイトであり、メンバｄのオフセットは８バイトである。すなわち、メンバｉの記憶領域の開始アドレスは、「ｓ１＿ｔ」型の変数の記憶領域の開始アドレスと同じであり、メンバｄの記憶領域の開始アドレスは、「ｓ１＿ｔ」型の変数の記憶領域の開始アドレスに８を加えたアドレスである。また、構造体「＿ｓ２」は、サイズが２０バイトであり、固定長文字列型であるメンバｓと、「ｓ１＿ｔ」型へのポインタ型であるメンバｐと、構造体「＿ｓ２」へのポインタ型であるメンバｑとを有する。メンバｓのオフセットは０バイトであり、メンバｐのオフセットは１２バイトであり、メンバｑのオフセットは１６バイトである。
【００７６】
図１５は、この実施の形態における算出部３５の詳細な機能ブロックの一例を示す図である。
【００７７】
算出部３５は、例えば、値取得部３５１と、関連判定部３５２と、領域算出部３５３と、領域判定部３５４と、領域記憶部３５５と、使用量累積部３５６と、使用量記憶部３５７とを有する。
【００７８】
値取得部３５１は、制御装置９１を用いて、データ取得部３４が記憶したデータのなかから、変数の値が記憶されている記憶領域に対応するデータを取得する。
関連判定部３５２は、制御装置９１を用いて、解析結果記憶部３３が記憶した解析結果と、値取得部３５１が取得したデータによって表わされる変数の値とに基づいて、その変数に関連する他の変数が存在するか否かを判定する。
領域算出部３５３は、制御装置９１を用いて、解析結果記憶部３３が記憶した解析結果と、値取得部３５１が取得したデータによって表わされる変数の値とに基づいて、関連判定部３５２が存在すると判定した他の変数の値が記憶されている記憶領域を算出する。
領域判定部３５４は、制御装置９１を用いて、領域記憶部３５５が記憶したデータに基づいて、領域算出部３５３が算出した記憶領域に記憶されている変数についての処理が終わっているか否かを判定する。領域記憶部３５５は、記憶装置９４を用いて、処理が終わった変数の記憶領域を表わすデータを記憶している。領域判定部３５４は、領域記憶部３５５が記憶しているデータに基づいて、その変数についての処理が終わっているか否かを判定する。その変数についての処理が終わっていないとが判定した場合、領域判定部３５４は、領域記憶部３５５が記憶しているデータを更新し、領域記憶部３５５は、その記憶領域に記憶されている変数についての処理が終わったことを表わすデータを記憶する。
【００７９】
その変数についての処理が終わっていないと領域判定部３５４が判定した場合、使用量累積部３５６は、制御装置９１を用いて、解析結果記憶部３３が記憶した解析結果から、その変数のサイズを取得する。使用量記憶部３５７は、記憶装置９４を用いて、記憶領域の使用量を記憶している。使用量累積部３５６は、制御装置９１を用いて、取得したサイズを、使用量記憶部３５７が記憶した使用量に加算する。使用量累積部３５６は、使用量記憶部３５７が記憶している使用量を更新し、使用量記憶部３５７は、その変数のサイズが加算された使用量を記憶する。
【００８０】
また、処理が終わっていないと判定した変数について、値取得部３５１が値を取得し、関連判定部３５２が関連する変数の有無を判定する。このようにして、芋蔓式に変数を辿ることにより、算出部３５は、関連がある変数を抽出し、そのために使用されている記憶領域の使用量の合計を算出する。
【００８１】
関連判定部３５２や領域算出部３５３の処理は、対象プログラムが扱うデータのデータ構造によって異なる。関連判定部３５２や領域算出部３５３は、例えば次のような処理をする。
【００８２】
（１）変数が、ポインタのように、その変数に関連する他の変数を記憶している記憶領域内の位置を示す値を含む場合：
【００８３】
関連判定部３５２は、その変数に関連する他の変数を記憶している記憶領域内の位置を示す値を取得し、取得した値が、記憶領域内の位置を有効に示す値であるか、ヌルなど、記憶領域内の位置を示さない値であるかを判定する。
取得した値が記憶領域内の位置を示さない値であれば、関連判定部３５２は、その変数に関連する他の変数が存在しないと判定する。
取得した値が記憶領域内の位置を有効に示す値であれば、関連判定部３５２は、その変数に関連する他の変数が存在すると判定する。領域算出部３５３は、関連判定部３５２が取得した値を、その変数に関連する他の変数を記憶している記憶領域内の位置とする。
【００８４】
なお、図１４に例示した構造体「＿ｓ２」のように、一つの変数に、その変数に関連する他の変数を記憶している記憶領域内の位置を示す値が複数含まれる場合がある。その場合、関連判定部３５２は、複数の値がすべて記憶領域内の位置を示さない値である場合に、その変数に関連する他の変数が存在しないと判定する。いずれかの値が記憶領域内の位置を有効に示す値であれば、関連判定部３５２は、その変数に関連する他の変数が存在すると判定する。複数の値が記憶領域内の位置を有効に示す値である場合、変数の探索は、そこで分岐する。すなわち、算出部３５は、いずれか１つの変数を辿り、それが終わったら、別の１つの変数を辿る。これを繰り返してすべての変数を辿ることにより、算出部３５は、関連する変数を抽出する。
【００８５】
また、環状リストや双方向リストのように、変数の連鎖を辿っていくと、元の変数に戻ってくる場合がある。その場合、その変数についての処理が終わっていると領域判定部３５４が判定するので、その連鎖についての探索は、そこで終了する。算出部３５は、分岐した他の連鎖があれば、それを探索し、分岐した他の連鎖がなく、あるいは、他の連鎖の探索が既に終了していれば、すべての探索を終了する。
【００８６】
（２）複数の変数が、一次元配列のように、記憶領域内に規則正しく配置され、それぞれの変数が、その変数が最後であるか否かを表わすフラグを含む場合：
【００８７】
関連判定部３５２は、フラグの値を取得し、取得したフラグの値に基づいて、その変数が最後であるか否かを判定する。
取得したフラグが、その変数が最後であることを表わす場合、関連判定部３５２は、次の変数（その変数に関連する他の変数）が存在しないと判定する。
取得したフラグが、その変数が最後ではないことを表わす場合、関連判定部３５２は、次の変数（その変数に関連する他の変数）が存在すると判定する。領域算出部３５３は、例えば、その変数を記憶している記憶領域のアドレスに、その変数のデータ型のサイズを加えることにより、次の変数を記憶している記憶領域のアドレスを算出する。
【００８８】
なお、対象プログラムのデータ構造は、メモリ使用量監視システム１０の使用者があらかじめ指定して、使用量算出装置１３が記憶しておく構成であってもよいし、対象プログラムのソースコードを解析部３２が解析して判定する構成であってもよい。
また、探索の起点となる変数についても同様に、メモリ使用量監視システム１０の使用者があらかじめ指定して、使用量算出装置１３が記憶しておく構成であってもよいし、対象プログラムのソースコードを解析部３２が解析して判定する構成であってもよい。
【００８９】
図１６は、この実施の形態における判定部３７の詳細な機能ブロックの一例を示す図である。
【００９０】
判定部３７は、例えば、前回累積実行時間記憶部３７１と、累積実行時間比較部３７２と、前回使用量記憶部３７３と、使用量比較部３７４とを有する。
【００９１】
前回累積実行時間記憶部３７１は、記憶装置９４を用いて、累積実行時間取得部３６が新たに累積実行時間を取得した時点で、それまで累積実行時間取得部３６が記憶していた前回の累積実行時間を記憶する。
累積実行時間比較部３７２は、制御装置９１を用いて、前回累積実行時間記憶部３７１が記憶している前回の累積実行時間と、累積実行時間取得部３６が記憶している累積実行時間とを比較する。２つの累積実行時間が等しい場合、累積実行時間比較部３７２は、算出部３５が算出した使用量が間違っていると判定する。
前回使用量記憶部３７３は、記憶装置９４を用いて、算出部３５が前回算出した使用量を記憶する。
使用量比較部３７４は、制御装置９１を用いて、前回使用量記憶部３７３が記憶している前回の使用量と、算出部３５が新たに算出した使用量とを比較する。２つの使用量が等しくない場合、使用量比較部３７４は、算出部３５が算出した使用量が間違っていると判定する。
使用量比較部３７４は、算出部３５が算出した使用量が間違っていないと判定し、かつ、累積実行時間比較部３７２も、算出部３５が算出した使用量が間違っていないと判定した場合に、算出部３５が算出した使用量が正しいものと判定する。
【００９２】
なお、前回の累積実行時間と今回の累積実行時間とが等しい場合、累積実行時間比較部３７２は、そのことを算出部３５に対して通知し、算出部３５は、使用量の算出を中断する構成であってもよい。
【００９３】
以上、各実施の形態で説明した構成は、一例であり、他の構成であってもよい。例えば、異なる実施の形態で説明した構成を組み合わせた構成であってもよいし、本質的でない部分の構成を、他の構成で置き換えた構成であってもよい。
【００９４】
以上説明した使用量算出装置（１３；メモリ使用量監視装置１）は、制御装置（９１）と、解析部（３２；構造体情報生成部１１）と、取得部（データ取得部３４；メモリ解析部１２１）と、算出部（３５；メモリ解析部１２１）とを有する。
上記解析部は、上記制御装置を用いて、対象プログラムのソースコードにおいて定義されているデータ型のサイズを算出する。
上記取得部は、上記制御装置を用いて、上記対象プログラムを実行している実行装置（１４；実行環境装置３）が上記対象プログラムの実行に用いるデータを記憶している記憶装置（９４）から、上記記憶装置の記憶領域に記憶されているデータを取得する。
上記算出部は、上記制御装置を用いて、上記取得部が取得したデータに基づいて、上記対象プログラムが使用している変数を抽出し、抽出した変数と、上記変数のデータ型について上記解析部が算出したサイズとに基づいて、上記記憶領域のうち、上記対象プログラムが使用している記憶領域のサイズを算出する。
【００９５】
これにより、対象プログラムが確保した記憶領域のうち、実際に使用している記憶領域の使用量を算出することができる。
【００９６】
上記使用量算出装置（１３；１）は、更に、累積実行時間取得部（３６；解析結果判定部１２４）と、判定部（３７；解析結果判定部１２４）とを有する。
上記累積実行時間取得部は、上記制御装置（９１）を用いて、上記実行装置（１４；３）が上記対象プログラムを実行している累積実行時間を取得する。
上記判定部は、第一の時刻において上記取得部（３４；１２１）が取得したデータに基づいて上記算出部（３５；１２１）が算出した上記対象プログラムが使用している記憶領域のサイズと、第二の時刻において上記取得部が取得したデータに基づいて上記算出部が算出した上記対象プログラムが使用している記憶領域のサイズとが等しく、かつ、上記第一の時刻において上記累積実行時間取得部が取得した累積実行時間と、上記第二の時刻において上記累積実行時間取得部が取得した累積実行時間とが異なる場合に、上記算出部が算出した上記対象プログラムが使用している記憶領域のサイズが正しいと判定する。
【００９７】
これにより、対象プログラムが記憶領域の内容を書き換えている途中で取得したデータに基づいて間違った使用量を算出するのを防ぎ、使用量を正しく算出することができる。
【００９８】
上記変数は、上記変数に関連する他の変数の有無を表わす値を含む。
上記算出部（３５；１２１）は、上記取得部（３４；１２１）が取得したデータから変数の値を取得し、上記変数に関連する他の変数が存在するか否かを判定することにより、上記対象プログラムが使用している変数を抽出する。
【００９９】
これにより、関連する変数を芋蔓式に抽出することができる。
【０１００】
上記変数は、上記変数に関連する他の変数が存在する場合に上記記憶領域のなかで上記他の変数の値が記憶されている位置を表わす値を含む。
上記算出部（３５；１２１）は、上記変数に関連する他の変数が存在すると判定した場合に、上記記憶領域のなかで上記他の変数の値が記憶されている位置を取得し、取得した位置に基づいて、上記取得部が取得したデータから上記他の変数の値を取得する。
【０１０１】
これにより、対象プログラムがリスト構造などのデータ構造を扱う場合に、関連する変数を抽出することができる。
【０１０２】
上記算出部（３５；１２１）は、上記変数に関連する他の変数が存在すると判定した場合に、上記記憶領域のなかで上記変数の値が記憶されている位置と、上記変数のデータ型について上記解析部（３２；１１）が算出したサイズとに基づいて、上記記憶領域のなかで上記他の変数の値が記憶されている位置を算出し、算出した位置に基づいて、上記取得部が取得したデータから上記他の変数の値を取得する。
【０１０３】
これにより、対象プログラムが可変長配列構造などのデータ構造を扱う場合に、関連する変数を抽出することができる。
【０１０４】
上記解析部（３２；１１）は、上記対象プログラムのソースコードから上記データ型の定義を抽出し、抽出したデータ型の定義に基づいて、上記データ型のサイズを算出する算出プログラムのソースコードを生成し、生成したソースコードに基づいて上記算出プログラムを生成し、生成した算出プログラムを実行することにより、上記データ型のサイズを算出する。
【０１０５】
これにより、データ型のサイズを容易に算出することができる。
【符号の説明】
【０１０６】
１  メモリ使用量監視装置、１０  メモリ使用量監視システム、１１  構造体情報生成部、１１１  ソースコード格納部、１１２  ソース解析部、１１３  構造体情報生成プログラム実行部、１１４  構造体情報ファイル記憶部、１２  メモリ使用量監視部、１２１  メモリ解析部、１２２  シンボル情報格納部、１２３  設定ファイル記憶部、１２４  解析結果判定部、１３  使用量算出装置、１４  実行装置、２  開発環境装置、２１，２２，２２３  ソースコード、２１１，２２１  「ｔｙｐｅｄｅｆ」文、２１２，２２２  「ｓｔｒｕｃｔ」文、２３  解析結果、３  実行環境装置、３１  対象ソース記憶部、３２  解析部、３２１  ソース変換部、３２２  算出ソース記憶部、３２３  コンパイル部、３２４  算出プログラム記憶部、３２５  算出プログラム実行部、３３  解析結果記憶部、３４  データ取得部、３５  算出部、３５１  値取得部、３５２  関連判定部、３５３  領域算出部、３５４  領域判定部、３５５  領域記憶部、３５６  使用量累積部、３５７  使用量記憶部、３６  累積実行時間取得部、３７  判定部、３７１  前回累積実行時間記憶部、３７２  累積実行時間比較部、３７３  前回使用量記憶部、３７４  使用量比較部、３８  出力部、４１  対象プログラム記憶部、４２  対象プログラム実行部、４３  データ記憶部、４４  累積実行時間計測部、４５  累積実行時間記憶部、９１  制御装置、９２  入力装置、９３  出力装置、９４  記憶装置、９５  演算装置。
【図１】
2014002443.tif 000003
【図２】
2014002443.tif 000004
【図３】
2014002443.tif 000005
【図４】
2014002443.tif 000006
【図５】
2014002443.tif 000007
【図６】
2014002443.tif 000008
【図７】
2014002443.tif 000009
【図８】
2014002443.tif 000010
【図９】
2014002443.tif 000011
【図１０】
2014002443.tif 000012
【図１１】
2014002443.tif 000013
【図１２】
2014002443.tif 000014
【図１３】
2014002443.tif 000015
【図１４】
2014002443.tif 000016
【図１５】
2014002443.tif 000017
【図１６】
2014002443.tif 000018