(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出装置であって、
前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力手段と、
前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出手段と、
を備えたことを特徴とするメモリリーク検出装置。
【請求項２】
前記メモリリーク検出手段によりメモリリークの発生が検出された場合に、前記パターンに基づいてメモリリークの原因に係る情報を抽出し、抽出した情報を出力するメモリリーク原因情報出力手段をさらに備えたことを特徴とする請求項１に記載のメモリリーク検出装置。
【請求項３】
コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出プログラムであって、
前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力手順と、
前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出手順と、
をコンピュータに実行させることを特徴とするメモリリーク検出プログラム。
【請求項４】
コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出方法であって、
前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力工程と、
前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出工程と、
を含んだことを特徴とするメモリリーク検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリリークが発生したか否かを検出するメモリリーク検出プログラム、メモリリーク検出装置およびメモリリーク検出方法に関し、特に、検査対象となるコンピュータプログラムを変更することなく、メモリリークの発生を容易かつ効率的に検出することができるメモリリーク検出プログラム、メモリリーク検出装置およびメモリリーク検出方法に関する。
【背景技術】
【０００２】
従来、コンピュータプログラムのソースコードに含まれる誤りを、コンピュータプログラムの開発者が容易に発見できるようにするために、デバッガとよばれるソフトウェアツールが利用されている。
【０００３】
このデバッガは、コンピュータプログラムの実行を、ブレークポイントと呼ばれるあらかじめ設定された位置で停止させながら、変数の内容などの情報を出力する。開発者は、出力された情報を参照することにより、ソースコードのどこに誤りがあるかを見つけ出す作業をおこなう。
【０００４】
このようなデバッガがブレークポイントを設定できる領域は、ＲＡＭ領域に展開されたコンピュータプログラムに限定される。そのため、ＲＯＭ領域に記憶されたコンピュータプログラムのデバッグをおこなう場合にはブレークポイントの設定が困難であるという問題があった。
【０００５】
この問題を解決するために、ＲＯＭ領域に記憶されたコンピュータプログラムをＲＡＭ領域にコピーするとともに、ＲＡＭ領域にコピーされたコンピュータプログラムにブレークポイントを設定し、さらにコンピュータプログラムの実行アドレスをＲＡＭ領域に設定することにより、あたかもＲＯＭ領域にブレークポイントを設定したかのようにしてデバッグを実行する技術が開示されている（特許文献１を参照）。
【０００６】
【特許文献１】特開２００１−２６５６２０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述した従来技術では、コンピュータプログラムにより動的に確保されたメモリ領域が解放されないことによって生じるメモリリークを検出することが難しいという問題があった。
【０００８】
具体的には、コンピュータプログラムの実行をブレークポイントを設定することにより停止させ、各変数の内容を確認したとしても、その変数を格納しているメモリ領域が解放されるべきものであるか否かを変数の内容から判断することは難しく、メモリリークを検出する目的には適さないという問題があった。
【０００９】
また、従来、検査対象となるコンピュータプログラムがメモリ領域の確保や解放を実行した場合に、その情報をメモリ領域を確保または解放した回数だけ記録するようにコンピュータプログラムを変更し、メモリ領域の確保と解放とが対応しているか否かを確認することによりメモリリークを検出する方法が用いられているが、この方法では、検査対象となるコンピュータプログラムを変更しなければならないという問題があった。
【００１０】
このような場合、たとえば、メモリリークの発生原因であると予想されるコンピュータプログラムが変更困難な外部ライブラリであると、メモリリークの検出が非常に難しくなるという問題があった。
【００１１】
利用される頻度の少ないコンピュータプログラムでは、たとえメモリリークが発生したとしてもその影響は大きくないが、頻繁に利用されるコンピュータプログラムでメモリリークが発生すると、メモリが不足し、コンピュータがダウンするなどの障害を発生させてしまう。そのため、検査対象となるコンピュータプログラムを変更することなく、メモリリークの発生をいかに容易かつ効率的に検出することができるかが重要な課題として挙げられている。
【００１２】
この発明は、上述した従来技術による問題点を解消するためになされたものであり、検査対象となるコンピュータプログラムを変更することなく、メモリリークの発生を容易かつ効率的に検出することができるメモリリーク検出プログラム、メモリリーク検出装置およびメモリリーク検出方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
上述した課題を解決し、目的を達成するため、本発明は、コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出プログラムであって、前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力手順と、前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出手順と、をコンピュータに実行させることを特徴とする。
【００１８】
また、本発明は、コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出装置であって、前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力手段と、前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出手段と、を備えたことを特徴とする。
【００２２】
また、本発明は、上記発明において、前記メモリリーク検出手段によりメモリリークの発生が検出された場合に、前記パターンに基づいてメモリリークの原因に係る情報を抽出し、抽出した情報を出力するメモリリーク原因情報出力手段をさらに備えたことを特徴とする。
【００２３】
また、本発明は、コンピュータプログラムを実行した場合に当該コンピュータプログラムに割り当てられる範囲のメモリにおいてメモリリークが発生したか否かを検出するメモリリーク検出方法であって、前記コンピュータプログラムをｐ1回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容と、前記コンピュータプログラムをｐ2回連続かつその間に前記メモリの内容を初期化することなく実行した時点の前記メモリの内容とを読み出して出力するメモリ内容出力工程と、前記コンピュータプログラムをｐ1回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ1を文字列パターンごとに計測し、また、前記コンピュータプログラムをｐ2回実行した時点の前記メモリの内容から、前記コンピュータプログラムに含まれる関数の引数を表す文字列パターンの出現回数ａ2を文字列パターンごとに計測し、同一の文字列パターンの出現回数ａ1およびａ2の差が、前記コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となる文字列パターンがある場合に、メモリリークが発生したことを検出するメモリリーク検出工程と、を含んだことを特徴とする。
【発明の効果】
【００２９】
本発明によれば、コンピュータプログラムを複数回実行した場合のメモリの内容を読み出して出力し、出力したメモリの内容に基づいてメモリリークが発生したか否かを検出することとしたので、コンピュータプログラムが複数回実行された場合にメモリリークが発生するとメモリの内容が変化することを利用して、検査対象となるコンピュータプログラムを変更することなく、メモリリークの発生を容易かつ効率的に検出することができるという効果を奏する。
【００３０】
また、本発明によれば、コンピュータプログラムをｐ1回実行した場合のコンピュータプログラムに割り当てられている範囲のメモリの内容と、コンピュータプログラムをｐ2回実行した場合のコンピュータプログラムに割り当てられている範囲のメモリの内容とを読み出して出力することとしたので、コンピュータプログラムの実行回数が異なる場合にメモリリーク時のメモリの内容が変化することを利用して、メモリリークの発生を容易かつ効率的に検出することができるという効果を奏する。
【００３１】
また、本発明によれば、コンピュータプログラムをｐ1回実行した場合のメモリの内容から同一のパターンの出現回数ａ1を計測し、また、コンピュータプログラムをｐ2回実行した場合のメモリの内容から同一のパターンの出現回数ａ2を計測し、当該同一のパターンの出現回数ａ1およびａ2に基づいてメモリリークが発生したか否かを検出することとしたので、メモリリーク発生時にコンピュータプログラムの実行回数に応じて同一のパターンの出現回数が異なることを利用して、メモリリークの発生を容易かつ効率的に検出することができるという効果を奏する。
【００３２】
また、本発明によれば、同一のパターンの出現回数ａ1およびａ2の差が、コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍である場合に、メモリリークが発生したことを検出することとしたので、メモリリーク発生時に同一のパターンの出現回数ａ1およびａ2の差が、コンピュータプログラムの実行回数ｐ1およびｐ2の差の整数倍となることを利用して、メモリリークの発生を容易かつ効率的に検出することができるという効果を奏する。
【００３３】
また、本発明によれば、メモリリークの発生が検出された場合に、上記パターンに基づいてメモリリークの原因に係る情報を抽出し、抽出した情報を出力することとしたので、メモリリークを発生させるコンピュータプログラムの誤り部分を容易かつ効率的に検出することができるという効果を奏する。
【００３４】
また、本発明によれば、上記パターンは、コンピュータプログラムにおける関数の引数を表すパターンであることとしたので、メモリリークの発生回数に応じて引数を表すパターンがメモリに格納されることを利用して、メモリリークの発生を容易かつ効率的に検出することができるという効果を奏する。
【発明を実施するための最良の形態】
【００３５】
以下に添付図面を参照して、本発明に係るメモリリーク検出プログラム、メモリリーク検出装置およびメモリリーク検出方法の好適な実施例を詳細に説明する。
【００３６】
なお、ここでは、ウェブブラウザを搭載したクライアント装置からＨＴＴＰ（HyperText Transfer Protocol）リクエストを受け付けた場合に実行されるＨＴＭＬ情報処理プログラムのメモリリークを検出する場合について説明する。
【００３７】
このＨＴＭＬ情報処理プログラムは、ＨＴＴＰリクエストによりリクエストされたＨＴＭＬ（HyperText Markup Language）文書をクライアント装置に出力することにより、クライアント装置に対してウェブページの閲覧サービスを提供するプログラムであり、ウェブサーバ装置に搭載されるプログラムである。ただし、メモリリークの検出対象となるプログラムは、これに限定されるものではなく、その他のプログラムであってもよい。
【実施例】
【００３８】
まず、本発明に係るメモリリーク検出処理について説明する。図１は、メモリリークを発生させるコンピュータプログラムの一例を示す図である。ここでは、プログラミング言語としてＣ言語を用いている。
【００３９】
図１に示すコンピュータプログラムは、memleak_func関数とmain関数とから構成されている。memleak_func関数は、解放しないメモリ領域を作り出し、メモリリークを発生させる関数である。具体的には、memleak_func関数は、strdup関数によりstrbufのメモリ領域を確保しているが、確保したメモリ領域の解放はおこなわない。
【００４０】
また、main関数は、メモリリークが発生した場合にメモリの内容をコアファイルに書き出す関数である。具体的には、main関数は、memleak_func関数をcnt回だけ呼び出して実行し、その後、abort関数を用いて当該プログラムを強制的に中止し、プログラムを中止した時点のメモリの内容をコアファイルに書き出す。
【００４１】
このメモリリーク検出処理では、cntを異なる値に設定してmain関数を２回実行し、２つのコアファイルを生成する。たとえば、１回目のmain関数の実行時にはcntを１，０２４に設定し、２回目のmain関数の実行時にはcntを１，２３４に設定する。
【００４２】
そして、以下のようなコマンドを実行することにより、２つのコアファイルにそれぞれ含まれる文字列パターンの出現回数を計測する。
（コマンド）strings corefile | sort | uniq -c | sort -r | head
【００４３】
具体的には、上記コマンドは、コアファイルから文字列パターンを抽出して並べ替え、重複した文字列パターンの数を計測し、さらに並び順を逆にして先頭から１０行分を出力させるコマンドである。
【００４４】
このコマンドを２つのコアファイルに適用した出力結果が図２および図３に示したものとなる。図２は、memleak_func関数の実行回数を１，０２４に設定した場合のコアファイルに対して文字列パターンの出現回数の計測を実行した結果の一例を示す図であり、図３は、memleak_func関数の実行回数を１，２３４に設定した場合のコアファイルに対して文字列パターンの出現回数の計測を実行した結果の一例を示す図である。
【００４５】
図２に示した結果と図３に示した結果では、memleak_func関数の引数である「memleaked strings」という文字列パターンの出現回数のみが異なっている。具体的には、１回目にcntを１，０２４に設定してプログラムを実行した場合の文字列パターン「memleaked strings」の出現回数は１，０２５回となり、２回目にcntを１，２３４に設定してプログラムを実行した場合の文字列パターン「memleaked strings」の出現回数は１，２３５回となる。
【００４６】
すなわち、１回目と２回目のmemleak_func関数の実行回数の差が２１０回（＝１，２３４−１，０２４）である場合に、文字列パターン「memleaked strings」の出現回数の差は２１０回（＝１，２３５−１，０２５）となり、memleak_func関数の実行回数の差と同じ値になる。
【００４７】
なお、ここでは、１回のmemleak_func関数の処理でメモリリークが１回だけ発生する場合が示されているが、一般には、呼び出された関数内において、メモリリークが複数回発生する場合もある。
【００４８】
その場合には、１回の関数の処理で発生するメモリリークの回数をｎとすると、当該関数の１回目と２回目の実行回数ｐ1およびｐ2の差の絶対値｜ｐ1−ｐ2｜と、当該関数の１回目と２回目の実行時に、引数を現す文字列パターンがメモリ領域に出現する出現回数ａ1およびａ2の差の絶対値｜ａ1−ａ2｜との間の関係は、
｜ｐ1−ｐ2｜×ｎ＝｜ａ1−ａ2｜      ．．．．．．（式１）
のようになる。
【００４９】
したがって、メモリリークが発生したか否かは、１回目と２回目の関数の実行回数ｐ1およびｐ2、文字列パターンがメモリ領域に出現する出現回数ａ1およびａ2が式１を満足するか否かを調べることにより判定することができる。
【００５０】
なお、本実施例では、ＨＴＴＰリクエストをそれぞれｐ1回およびｐ2回生成し、そのＨＴＴＰリクエストによりリクエストされたＨＴＭＬ情報の処理をおこなうＨＴＭＬ情報処理プログラムを１回目と２回目とに分けてそれぞれｐ1回およびｐ2回実行することにより、メモリリークが発生しているか否かの検出をおこなう。このＨＴＭＬ情報処理プログラムは、図１に示したような関数を多数組み合わせることにより構成されたプログラムである。
【００５１】
図４は、ウェブサーバに搭載されるＨＴＭＬ情報処理プログラムの処理実行サイクルについて説明する図である。図４に示すように、ＨＴＭＬ情報処理プログラムの処理実行サイクルは、ウェブブラウザを搭載したクライアント装置により送信されたＨＴＴＰリクエストを受け付け、リクエストされたＨＴＭＬ文書をＨＴＴＰレスポンスとしてクライアント装置に送信する処理を繰り返すものとなっている。
【００５２】
この場合、ＨＴＭＬ情報処理プログラムにおいて、メモリの解放をおこなっていない関数があり、その関数がＨＴＴＰリクエストごとに変化しない場合には、ＨＴＴＰリクエストにより確保されるメモリ領域の内容は同じ内容となる。
【００５３】
そのため、このメモリリーク検出処理では、ＨＴＭＬ情報処理プログラムを１回目と２回目とに分けてそれぞれｐ1回およびｐ2回実行し、メモリ領域に出現する文字列パターンの出現回数ａ1，ａ2が式１を満足するか否かを調べることによりメモリリークが発生したか否かを検出することとしている。これにより、メモリリークの発生を容易かつ効率的に検出することができる。
【００５４】
つぎに、本実施例に係るメモリリーク検出装置の機能構成について説明する。図５は、本実施例に係るメモリリーク検出装置の機能構成を示す図である。
【００５５】
図５に示すように、このメモリリーク検出装置は、入力部１０、表示部１１、記憶部１２、プログラム実行処理部１３、メモリ内容出力部１４、同一パターン出現回数計測部１５、メモリリーク検出部１６、メモリリーク原因情報出力部１７および制御部１８を有する。
【００５６】
入力部１０は、キーボードやマウスなどの入力デバイスである。表示部１１は、ディスプレイなどの表示デバイスである。記憶部１２は、メモリやハードディスクなどの記憶デバイスである。
【００５７】
この記憶部１２は、ＨＴＭＬ情報処理プログラム１２ａ、第１コアファイル１２ｂ、第２コアファイル１２ｃ、第１同一パターン出現回数データ１２ｄ、第２同一パターン出現回数データ１２ｅ、メモリリーク検出結果１２ｆ、および、メモリリーク原因データ１２ｇを記憶している。
【００５８】
ＨＴＭＬ情報処理プログラム１２ａは、ウェブブラウザを搭載したクライアント装置からＨＴＴＰリクエストを受け付けた場合に実行されるウェブサーバ用のプログラムである。このＨＴＭＬ情報処理プログラム１２ａは、リクエストされたＨＴＭＬ文書をクライアント装置に送信する処理をおこなう。
【００５９】
このＨＴＭＬ情報処理プログラム１２ａは、図１に示したような関数を多数組み合わせることにより構成されたプログラムであり、メモリリークを発生させるか否かが検査されるプログラムである。
【００６０】
第１コアファイル１２ｂは、ＨＴＭＬ情報処理プログラム１２ａがｐ1回実行された場合のメモリの内容を記憶したコアファイルである。第２コアファイル１２ｃは、ＨＴＭＬ情報処理プログラム１２ａがｐ2回実行された場合のメモリの内容を記憶したコアファイルである。
【００６１】
第１同一パターン出現回数データ１２ｄは、第１コアファイル１２ｂに含まれる文字列パターンの出現回数を記憶したものである。具体的には、第１同一パターン出現回数データ１２ｄは、関数の引数などの文字列パターンが第１コアファイル１２ｂに出現した出現回数を記憶したものである。
【００６２】
第２同一パターン出現回数データ１２ｅは、第２コアファイル１２ｃに含まれる文字列パターンの出現回数を記憶したものである。具体的には、第２同一パターン出現回数データ１２ｅは、関数の引数などの文字列パターンが第２コアファイル１２ｃに出現した出現回数を記憶したものである。
【００６３】
メモリリーク検出結果１２ｆは、メモリリークが発生したか否かを判定した判定結果の情報を記憶したものである。メモリリーク原因データ１２ｇは、メモリリークの発生原因となっている関数の関数名や位置などの情報を記憶したものである。
【００６４】
プログラム実行処理部１３は、記憶部１２からＨＴＭＬ情報処理プログラム１２ａを読み出して実行する処理部である。具体的には、プログラム実行処理部１３は、ＨＴＴＰリクエストをｐ1回生成することによりＨＴＭＬ情報処理プログラム１２ａをｐ1回実行し、また、ＨＴＴＰリクエストをｐ2回生成することによりＨＴＭＬ情報処理プログラム１２ａをｐ2回実行する。
【００６５】
メモリ内容出力部１４は、プログラム実行処理部１３によりＨＴＭＬ情報処理プログラム１２ａが１回目と２回目とに分けてｐ1，ｐ2回実行された場合に、メモリの内容をそれぞれ出力し、記憶部１２に第１コアファイル１２ｂおよび第２コアファイル１２ｃとして記憶させる出力部である。
【００６６】
同一パターン出現回数計測部１５は、記憶部１２から第１コアファイル１２ｂおよび第２コアファイル１２ｃを読み出して、第１コアファイル１２ｂおよび第２コアファイル１２ｃに出現する関数の引数などの文字列パターンの出現回数をそれぞれ計測し、その出現回数の情報を記憶部１２に、第１同一パターン出現回数データ１２ｄおよび第２同一パターン出現回数データ１２ｅとして記憶させる計測部である。
【００６７】
メモリリーク検出部１６は、記憶部１２から第１同一パターン出現回数データ１２ｄおよび第２同一パターン出現回数データ１２ｅを読み出して、文字列パターンの出現回数が式１を満足するか否かを調べることにより、メモリリークが発生したか否かを検出する検出部である。
【００６８】
メモリリーク原因情報出力部１７は、メモリリーク検出部１６によりメモリリークの発生が検出された場合に、式１を満足した文字列パターン（本実施例では、この文字列パターンは関数の引数である。）を基にして、ＨＴＭＬ情報処理プログラム１２ａ中からその文字列パターンを含んだ関数を探索し、探索された関数の関数名や位置の情報を出力する出力部である。
【００６９】
制御部１８は、メモリリーク検出装置を全体制御する制御部であり、各機能部間のデータの授受などを司る。
【００７０】
つぎに、本実施例に係るメモリリーク検出処理の処理手順について説明する。図６は、本実施例に係るメモリリーク検出処理の処理手順を示すフローチャートである。
【００７１】
図６に示すように、まず、メモリリーク検出装置のプログラム実行処理部１３は、ｐ1回ＨＴＴＰリクエストを生成してＨＴＭＬ情報処理プログラム１２ａを実行する（ステップＳ１０１）。
【００７２】
そして、メモリ内容出力部１４は、メモリ領域に格納されているデータを第１コアファイル１２ｂとして出力する（ステップＳ１０２）。続いて、同一パターン出現回数計測部１５は、第１コアファイル１２ｂにおける文字列パターンの出現回数ａ1を計測する（ステップＳ１０３）。
【００７３】
さらに、プログラム実行処理部１３は、ｐ2回ＨＴＴＰリクエストを生成してＨＴＭＬ情報処理プログラム１２ａを実行する（ステップＳ１０４）。そして、メモリ内容出力部１４は、メモリ領域に格納されているデータを第２コアファイル１２ｃとして出力する（ステップＳ１０５）。続いて、同一パターン出現回数計測部１５は、第２コアファイル１２ｃにおける文字列パターンの出現回数ａ2を計測する（ステップＳ１０６）。
【００７４】
その後、メモリリーク検出部１６は、ｐ1，ｐ2，ａ1およびａ2の各値の間に式１の関係があるか否かを調べる（ステップＳ１０７）。各値の間に式１の関係がある場合には（ステップＳ１０７，Ｙｅｓ）、メモリリーク検出部１６は、メモリリークが発生したと判定する（ステップＳ１０８）。
【００７５】
そして、メモリリーク原因情報出力部１７は、式１の関係を満足した文字列パターン（本実施例の場合は、関数の引数）を含んでいる関数の関数名や位置の情報をＨＴＭＬ情報処理プログラム１２ａから抽出し（ステップＳ１０９）、抽出した関数名や位置の情報を表示部１１に出力して（ステップＳ１１０）、このメモリリーク検出処理を終了する。
【００７６】
ステップＳ１０７において、各値の間に式１の関係がなかった場合には（ステップＳ１０７，Ｎｏ）、メモリリーク検出部１６は、メモリリークの発生は無いと判定し（ステップＳ１１１）、その判定結果を表示部１１に出力して（ステップＳ１１２）、このメモリリーク検出処理を終了する。
【００７７】
以上、上記実施例において、メモリリーク検出処理をコンピュータ上で実現する場合について説明してきたが、メモリリーク検出処理を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行することによりメモリリーク検出処理を実現してもよい。
【００７８】
図７は、メモリリーク検出処理を実現するコンピュータ１００のハードウェア構成を示すブロック図である。
【００７９】
図７に示すように、このコンピュータ１００は、上記プログラムを実行するＣＰＵ１１０と、データを入力する入力装置１２０と、各種データを記憶するＲＯＭ１３０と、演算パラメータ等を記憶するＲＡＭ１４０と、メモリリーク検出処理を実現するためのプログラムを記録した記録媒体２００からプログラムを読み取る読取装置１５０と、ディスプレイ等の出力装置１６０と、ネットワーク３００を介して他のコンピュータとの間でデータの授受をおこなうネットワークインターフェース１７０とが、バス１８０で接続された構成となっている。
【００８０】
ＣＰＵ１１０は、読取装置１５０を経由して記録媒体２００に記録されているプログラムを読み込んだ後、メモリリーク検出プログラムを実行することにより、メモリリーク検出処理を実現する。
【００８１】
なお、記録媒体２００としては、光ディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ハードディスク等が挙げられる。また、このメモリリーク検出プログラムは、ネットワーク３００を介してコンピュータ１００に導入することとしてもよい。
【００８２】
上述してきたように、本実施例では、メモリリーク検出装置のメモリ内容出力部１４が、ＨＴＭＬ情報処理プログラム１２ａを複数回実行した場合のメモリの内容を読み出して出力し、メモリリーク検出部１６が、出力したメモリの内容に基づいてメモリリークが発生したか否かを検出することとしたので、ＨＴＭＬ情報処理プログラム１２ａが複数回実行された場合にメモリリークが発生するとメモリの内容が変化することを利用して、検査対象となるＨＴＭＬ情報処理プログラム１２ａを変更することなく、メモリリークの発生を容易かつ効率的に検出することができる。
【００８３】
また、本実施例では、メモリ内容出力部１４が、ＨＴＭＬ情報処理プログラム１２ａをｐ1回実行した場合のコンピュータプログラムに割り当てられている範囲のメモリの内容と、ＨＴＭＬ情報処理プログラム１２ａをｐ2回実行した場合のコンピュータプログラムに割り当てられている範囲のメモリの内容とを読み出して出力することとしたので、ＨＴＭＬ情報処理プログラム１２ａの実行回数が異なる場合にメモリリーク時のメモリの内容が変化することを利用して、メモリリークの発生を容易かつ効率的に検出することができる。
【００８４】
また、本実施例では、同一パターン出現回数計測部１５が、ＨＴＭＬ情報処理プログラム１２ａをｐ1回実行した場合のメモリの内容から同一の引数の出現回数ａ1を計測し、また、ＨＴＭＬ情報処理プログラム１２ａをｐ2回実行した場合のメモリの内容から同一のパターンの出現回数ａ2を計測し、メモリリーク検出部１６が、当該同一の引数の出現回数ａ1およびａ2に基づいてメモリリークが発生したか否かを検出することとしたので、メモリリーク発生時にＨＴＭＬ情報処理プログラム１２ａの実行回数に応じて同一の引数の出現回数が異なることを利用して、メモリリークの発生を容易かつ効率的に検出することができる。
【００８５】
また、本実施例では、メモリリーク検出部１６が、同一の引数の出現回数ａ1およびａ2の差が、ＨＴＭＬ情報処理プログラム１２ａの実行回数ｐ1およびｐ2の差の整数倍である場合に、メモリリークが発生したことを検出することとしたので、メモリリーク発生時に同一の引数の出現回数ａ1およびａ2の差が、ＨＴＭＬ情報処理プログラム１２ａの実行回数ｐ1およびｐ2の差の整数倍となることを利用して、メモリリークの発生を容易かつ効率的に検出することができる。
【００８６】
また、本実施例では、メモリリーク原因情報出力部１７が、メモリリーク検出部１６によりメモリリークの発生が検出された場合に、上記引数に基づいてメモリリークの発生原因に係る情報を抽出し、抽出した情報を出力することとしたので、メモリリークを発生させるＨＴＭＬ情報処理プログラム１２ａの誤り部分を容易かつ効率的に検出することができる。
【００８７】
また、本実施例では、ＨＴＭＬ情報処理プログラム１２ａにおける関数の引数を表す文字列パターンの出現回数ａ1およびａ2を用いてメモリリークの発生を検出することとしたので、メモリリークの発生回数に応じて引数がメモリに格納されることを利用して、メモリリークの発生を容易かつ効率的に検出することができる。
【００８８】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、特許請求の範囲に記載した技術的思想の範囲内において種々の異なる実施例にて実施されてもよいものである。
【００８９】
たとえば、本実施例では、ＨＴＭＬ情報処理プログラム１２ａを１回目と２回目とに分けてｐ1回およびｐ2回実行し、文字列パターンの出現回数ａ1およびａ2が式１を満足するか否かを調べることによりメモリリークを検出することとしたが、本発明はこれに限定されるものではなく、ＨＴＭＬ情報処理プログラム１２ａをｐ1回実行した際、引数などの文字列パターンが、たとえば、（ｐ1の整数倍＋１）回だけコアファイルに書き出されることがあらかじめ判明しているような場合には、文字列パターンが（ｐ1の整数倍＋１）回コアファイルに出現するか否かを検出することによりメモリリークを検出することとしてもよい。
【００９０】
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。
【００９１】
この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９２】
また、図示したメモリリーク検出装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示のように構成されていることを要しない。すなわち、メモリリーク検出装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。
【００９３】
さらに、メモリリーク検出装置にて行なわれる処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【産業上の利用可能性】
【００９４】
以上のように、本発明に係るメモリリーク検出プログラム、メモリリーク検出装置およびメモリリーク検出方法は、検査対象となるコンピュータプログラムを変更することなく、メモリリークの発生を容易かつ効率的に検出することが必要なメモリリーク検出システムに有用である。
【図面の簡単な説明】
【００９５】
【図１】メモリリークを発生させるコンピュータプログラムの一例を示す図である。
【図２】memleak_func関数の実行回数を１，０２４に設定した場合のコアファイルに対して文字列パターンの出現回数の計測を実行した結果の一例を示す図である。
【図３】memleak_func関数の実行回数を１，２３４に設定した場合のコアファイルに対して文字列パターンの出現回数の計測を実行した結果の一例を示す図である。
【図４】ウェブサーバに搭載されるＨＴＭＬ情報処理プログラムの処理実行サイクルについて説明する図である。
【図５】本実施例に係るメモリリーク検出装置の機能構成を示す図である。
【図６】本実施例に係るメモリリーク検出処理の処理手順を示すフローチャートである。
【図７】メモリリーク検出処理を実現するコンピュータ１００のハードウェア構成を示すブロック図である。
【符号の説明】
【００９６】
１０    入力部
１１    表示部
１２    記憶部
１２ａ    ＨＴＭＬ情報処理プログラム
１２ｂ    第１コアファイル
１２ｃ    第２コアファイル
１２ｄ    第１同一パターン出現回数データ
１２ｅ    第２同一パターン出現回数データ
１２ｆ    メモリリーク検出結果
１２ｇ    メモリリーク原因データ
１３    プログラム実行処理部
１４    メモリ内容出力部
１５    同一パターン出現回数計測部
１６    メモリリーク検出部
１７    メモリリーク原因情報出力部
１８    制御部
【図１】
0004575252.tif 000002
【図２】
0004575252.tif 000003
【図３】
0004575252.tif 000004
【図４】
0004575252.tif 000005
【図５】
0004575252.tif 000006
【図６】
0004575252.tif 000007
【図７】
0004575252.tif 000008