(57)【要約】【課題】より高精度に異常を検出することができる異常検出方法、及び異常検出装置を提供する。【解決手段】ソフトウェア（１９）を実行して処理データをメモリ（１６）上に展開し、前記メモリのメモリステータスを所定時間毎に記憶し、前記記憶したメモリステータスを所定の容量の複数のブロックに分割し、前記分割したブロック毎にメモリステータスの時間変化を解析し、前記解析の結果に基づいて異常を検出する。【選択図】      図５
2011028711.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアを実行して処理データをメモリ上に展開するソフトウェア実行部と、
前記メモリのメモリステータスを所定時間毎に記憶する記憶部と、
前記記憶部により記憶したメモリステータスを所定の容量の複数のブロックに分割する分割部と、
前記分割部により分割したブロック毎にメモリステータスの時間変化を解析する解析部と、
前記解析部による解析の結果に基づいて異常を検出する異常検出部と、
を具備することを特徴とする異常検出装置。
【請求項２】
前記ソフトウェア実行部は、前記ソフトウェアを実行する場合、メモリ上のアドレスとソフトウェアにおけるソースコードを示す情報とを対応付けてシンボルファイルを生成し、
前記異常検出部は、異常を検出したブロックのアドレスに基づいて前記シンボルファイルを参照し、ソースコードを示す情報を抽出する、
ことを特徴とする請求項１に記載の異常検出装置。
【請求項３】
入力部をさらに具備し、
前記記憶部は、前記入力部により入力される情報に基づいて保存時間を設定し、設定した保存時間毎に前記メモリステータスを記憶することを特徴とする請求項２に記載の異常検出装置。
【請求項４】
前記解析部は、前記入力部により入力される情報に基づいて観測時間を設定し、前記ソフトウェア実行部によりソフトウェアを実行してから前記設定した観測時間が経過した場合、解析を行うことを特徴とする請求項３に記載の異常検出装置。
【請求項５】
前記異常検出部は、前記解析部によりメモリステータスの増加が継続していると判断した場合、カウンタにおける異常を検出することを特徴とする請求項４に記載の異常検出装置。
【請求項６】
前記解析部は、前記入力部により入力される情報に基づいてメモリステータスの上限値を設定し、
前記異常検出部は、前記解析部による解析の結果、メモリステータスの値が前記上限値を超える場合、オーバーフローを検出することを特徴とする請求項５に記載の異常検出装置。
【請求項７】
前記異常検出部は、前記解析部による解析の結果、メモリステータスの値が所定時間変化しない場合、メモリリークを検出することを特徴とする請求項６に記載の異常検出装置。
【請求項８】
前記ソフトウェア実行部によりソフトウェアを実行してから前記設定した保存時間が経過した場合、解析を行うことを特徴とする請求項３に記載の異常検出装置。
【請求項９】
前記解析部は、前記メモリのメモリステータスと、前記記憶部に記憶されているメモリステータスとを各ブロック毎に比較し、前記比較の結果に応じてカウンタの値を増減することを特徴とする請求項８に記載の異常検出装置。
【請求項１０】
前記解析部は、前記入力部により入力される情報に基づいて閾値を設定し、前記カウンタの値が前記設定した閾値に達する場合、異常を検出することを特徴とする請求項９に記載の異常検出装置。
【請求項１１】
前記解析部は、前記メモリのメモリステータスが前記記憶部に記憶されているメモリステータスより大きい場合、前記カウンタの値を増加させることを特徴とする請求項９に記載の異常検出装置。
【請求項１２】
前記解析部は、前記メモリのメモリステータスと前記記憶部に記憶されているメモリステータスとが同じ値である場合、前記カウンタの値を維持することを特徴とする請求項９に記載の異常検出装置。
【請求項１３】
前記解析部は、前記メモリのメモリステータスが前記記憶部に記憶されているメモリステータスより小さい場合、前記カウンタの値をリセットすることを特徴とする請求項９に記載の異常検出装置。
【請求項１４】
ソフトウェアを実行して処理データをメモリ上に展開し、
前記メモリのメモリステータスを所定時間毎に記憶し、
前記記憶したメモリステータスを所定の容量の複数のブロックに分割し、
前記分割したブロック毎にメモリステータスの時間変化を解析し、
前記解析の結果に基づいて異常を検出する、
ことを特徴とする異常検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば、ソフトウェアにおける異常を検出するに基づいて異常検出方法、及び異常検出装置に関する。
【背景技術】
【０００２】
コンピュータのプログラムを実行し、正しく動作するか否かを確認するソフトウェアテストが一般的に行われている。ソフトウェアテストは、プログラム中のバグ（欠陥）をできる限り多く発見することを目的として行われる。
【０００３】
ソフトウェアによる処理を行う場合、ソフトウェアのプログラムは、プロセス毎にメモリ領域を確保する。また、プログラムは、プロセスの処理を終了する場合、当該プロセスの処理用に確保したメモリ領域を開放する。しかし、プログラムにおけるバグにより、プロセスを終了したにも係らず、メモリ領域を開放しないメモリリークが発生する場合がある。メモリリークが発生する場合、メモリ不足による異常終了、及び処理速度の低下などが発生する。
【０００４】
特許文献１には、予め登録したメモリの監視領域を定期的に読み出すことにより、メモリ内容の時間的な変化を把握する技術が開示されている。
【０００５】
また、特許文献２には、メモリリーク監視タイミングにおいて、現期間のメモリ増加量の平均値と、過去期間のメモリの値の平均値とに基づいて、メモリリークによる増加率を検出する技術が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平０７−１９１８８号公報
【特許文献２】特開２００５−２５０７５１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記の特許文献１に記載されている技術は、メモリ領域の時間的変化に基づいて、異常か否かを判断することができない。この為、表示されるメモリ領域の時間的変化に基づいて人が目視で異常の有無を確認する必要がある。この結果、異常を見逃す、手間がかかるなどの問題がある。
【０００８】
また、特許文献２に記載されている技術は、プロセス単位でしかメモリリークによるメモリ領域の増加率を確認することができない。この為、異常が発生しているメモリの領域を特定することが出来ないという問題がある。
【０００９】
また、カウンタが正常に終了されない為に、加算が継続されて行われる場合、または、メモリの値のオーバーフロー（桁あふれ）などを検知することが出来ないという問題がある。
【００１０】
そこで、本発明の目的は、より高精度に異常を検出することができる異常検出方法、及び異常検出装置を提供することにある。
【課題を解決するための手段】
【００１１】
本発明の一実施形態としての異常検出装置は、ソフトウェアを実行して処理データをメモリ上に展開するソフトウェア実行部と、前記メモリのメモリステータスを所定時間毎に記憶する記憶部と、前記記憶部により記憶したメモリステータスを所定の容量の複数のブロックに分割する分割部と、前記分割部により分割したブロック毎にメモリステータスの時間変化を解析する解析部と、前記解析部による解析の結果に基づいて異常を検出する異常検出部と、を具備する。
【００１２】
また、本発明の一実施形態としての異常検出方法は、ソフトウェアを実行して処理データをメモリ上に展開し、前記メモリのメモリステータスを所定時間毎に記憶し、前記記憶したメモリステータスを所定の容量の複数のブロックに分割し、前記分割したブロック毎にメモリステータスの時間変化を解析し、前記解析の結果に基づいて異常を検出する。
【発明の効果】
【００１３】
この発明の一形態によれば、より高精度に異常を検出することができる異常検出方法、及び異常検出装置を提供することができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、本発明の第１の実施形態に係るソフトウェアのテストを行う端末装置１の構成例について説明するためのブロック図である。
【図２】図２は、図１に示す記憶部に記憶されるファイルの例について説明するための説明図である。
【図３】図３は、図２に示すメモリステータス格納部に格納されるメモリステータスの例について説明するための説明図である。
【図４】図４は、図３に示すメモリステータスの時間的変化について説明するための説明図である。
【図５】図５は、図１及び図２に示す端末装置において行われる処理について概略的に説明するための説明図である。
【図６】図６は、図１及び図２に示す端末装置において行われる異常検出処理について概略的に説明するためのフローチャートである。
【図７】図７は、図１及び図２に示す端末装置において行われる異常検出処理について概略的に説明するためのフローチャートである。
【図８】図８は、本発明の第２の実施形態におけるメモリステータス格納部に格納されるメモリステータスの例について説明するための説明図である。
【図９】図９は、図８に示すデータに基づいて行われる異常検出処理の例について概略的に説明するためのフローチャートである。
【図１０】図１０は、図８に示すデータに基づいて行われる異常検出処理の例について概略的に説明するためのフローチャートである。
【発明を実施するための形態】
【００１５】
以下、図面を参照しながら、本発明の第１の実施形態に係る異常検出方法、及び異常検出装置について詳細に説明する。
【００１６】
図１は、本発明の第１の実施形態に係るアプリケーションのテストを行う端末装置１の構成例について説明するためのブロック図である。  
図１に示すように、端末装置１は、ＣＰＵ１１、入出力部１２、ディスプレイ１３、キーボード１４、ＲＯＭ１５、ＲＡＭ１６、記憶部１７、及びデバッグＩ／Ｆ１８など備える。
【００１７】
ＣＰＵ１１は、端末装置１全体の制御を司る制御部として機能する。ＣＰＵ１１は、ＲＯＭ１５あるいは記憶部１７に記憶されている制御プログラム及び制御データに基づいて種々の処理を行う。
【００１８】
入出力部１２は、例えばＬＡＮなどを介して外部の機器と通信を行うためのインタフェース、または、記憶媒体を接続可能なインタフェースにより構成される。  
ディスプレイ１３は、ＣＰＵ１１の制御により種々の情報を表示する。キーボード１４は、端末装置１の操作者による操作を操作信号として受け取る。
【００１９】
ＲＯＭ１５は、予め制御用のプログラム及び制御データなどを記憶する不揮発性のメモリである。ＣＰＵ１１は、ＲＯＭ１５、または記憶部１７に記憶されているプログラムを実行することにより、種々の処理を実現することができる。
【００２０】
ＲＡＭ１６は、ワーキングメモリとして機能する揮発性のメモリである。ＲＡＭ１６は、ＣＰＵ１１の処理中のデータなどを一時的に格納する。例えば、ＲＡＭ１６は、入出力部１２を介して受信したデータを一時的に格納する。また、ＲＡＭ１６は、ＣＰＵ１１が実行するプログラムを一時的に格納する。
【００２１】
記憶部１７は、例えば、ＥＥＰＲＯＭまたはＨＤＤなどのデータの書き込み及び書換えが可能な不揮発性のメモリにより構成される。
【００２２】
デバッグＩ／Ｆ１８は、ソフトウェア１９とのデータの送受信を行うためのインタフェースである。デバッグＩ／Ｆ１８は、ソフトウェア１９のデータの入出力を管理する。ソフトウェア１９は、操作入力のデータに対して処理結果を出力するソフトウェアである。ＣＰＵ１１は、ソフトウェア実行部として機能する。ＣＰＵ１１は、ソフトウェア１９を実行することにより、所定の処理を行う。
【００２３】
また、記憶部１７は、例えば図２に示すようなファイルを記憶する。  
図２は、図１に示す記憶部１７に記憶されているファイルの例について説明するための説明図である。
【００２４】
図２に示すように、記憶部１７は、シンボルファイル１７１、記録用プログラム１７２、メモリステータス格納部１７３、及び解析用プログラム１７４などを記憶する。なお、ＣＰＵ１１は、記録用プログラム１７２を実行することにより、記憶処理を行う。また、ＣＰＵ１１は、解析用プログラム１７４を実行することにより、解析処理を行う。
【００２５】
シンボルファイル１７１は、ソフトウェア１９のソースコード及びそのアドレスとＲＡＭ１６上のアドレスとを対応付けるファイルである。ＣＰＵ１１は、ソフトウェア１９をＲＡＭ１６上にコンパイルする場合、シンボルファイル１７１を生成し、記憶部１７に記憶する。ＣＰＵ１１は、ＲＡＭ１６上のアドレスに基づいて、ソフトウェア１９におけるソースコード及びそのアドレスを認識することができる。
【００２６】
記録用プログラム１７２は、ＲＡＭ１６のステータスを所定時間（保存時間）毎にメモリステータス格納部１７３に格納する為のプログラムである。ＣＰＵ１１は、ソフトウェア１９を実行する場合、同時に記録用プログラム１７２を実行する。
【００２７】
ＣＰＵ１１は、記録用プログラム１７２を実行する場合、ソフトウェア１９により使用されるＲＡＭ１６上の全ての領域の値を保存時間毎にメモリステータス格納部１７３に記憶する。なお、ＣＰＵ１１は、キーボード１４などにより入力される情報に基づいて、記録用プログラム１７２における保存時間を設定する。
【００２８】
メモリステータス格納部１７３は、記録用プログラム１７２により記憶される各時間毎のメモリステータスを保持する。即ち、メモリステータス格納部１７３は、ＲＡＭ１６における同一のアドレスであり、且つ、異なる時間に記憶される複数のメモリステータスを保持する。
【００２９】
解析用プログラム１７４は、メモリステータス格納部１７３に格納される複数のメモリステータスを解析するためのプログラムである。ＣＰＵ１１は、ソフトウェア１９を実行してから所定時間（観測時間）が経過した場合、解析用プログラム１７４を実行する。ＣＰＵ１１は、解析用プログラム１７４を実行する場合、解析部として機能する。なお、ＣＰＵ１１は、キーボード１４などの入力部により入力される情報に基づいて、解析用プログラム１７４における観測時間を設定する。
【００３０】
ＣＰＵ１１は、解析用プログラム１７４を実行する場合、メモリステータス格納部１７３に記憶される複数のメモリステータスをそれぞれ所定容量（例えば４バイト）単位のブロックに分割する。この場合、ＣＰＵ１１は、分割部として機能する。ＣＰＵ１１は、異なる時間に記憶したメモリステータスにおける各ブロックのメモリの値を抽出し、アドレス毎に対応付ける。
【００３１】
これにより、ＣＰＵ１１は、分割したブロック毎に、ブロック内のメモリの値の時間変化を確認する。即ち、ＣＰＵ１１は、あるソースコードにより用いられるＲＡＭ１６上のメモリの領域の時間変化をチェックする。
【００３２】
図３は、メモリステータス格納部１７３に格納されるメモリステータスの例について説明するための説明図である。  
図３に示すように、メモリステータス格納部１７３は、複数の異なる時間に記憶されたメモリステータス１７３１乃至１７３５を格納する。
【００３３】
メモリステータス１７３１は、ＣＰＵ１１がソフトウェア１９を実行してから１時間後に記憶されたＲＡＭ１６の値である。メモリステータス１７３２は、ＣＰＵ１１がソフトウェア１９を実行してから２時間後に記憶されたＲＡＭ１６の値である。メモリステータス１７３３は、ＣＰＵ１１がソフトウェア１９を実行してから３時間後に記憶されたＲＡＭ１６の値である。メモリステータス１７３４は、ＣＰＵ１１がソフトウェア１９を実行してから４時間後に記憶されたＲＡＭ１６の値である。メモリステータス１７３５は、ＣＰＵ１１がソフトウェア１９を実行してから５時間後に記憶されたＲＡＭ１６の値である。
【００３４】
ＣＰＵ１１は、各メモリステータスを４バイト単位のブロックに分割する。ＣＰＵ１１は、分割したブロック毎に、メモリの値の時間的な変化を確認する。
【００３５】
例えば、図３に示す第１のブロックは、メモリステータス１７３１において「１００」、メモリステータス１７３２において「２０１」、メモリステータス１７３３において「２０８」、メモリステータス１７３４において「１００」、メモリステータス１７３５において「２０１」、と変化する。
【００３６】
また、例えば、図３に示す第２のブロックは、メモリステータス１７３１において「１００」、メモリステータス１７３２において「２０１」、メモリステータス１７３３において「２９８」、メモリステータス１７３４において「３８８」、メモリステータス１７３５において「５０１」、と変化する。
【００３７】
ＣＰＵ１１は、各ブロック毎の時間に対するメモリの値の変化に基づいて、異常を検出する。即ち、ＣＰＵ１１は、異常検出部として機能する。
【００３８】
図４は、メモリのブロック毎の値と時間との関係を表すグラフである。  
図４に示すように、第１のブロックの値は、通常の動作において生じる程度の増減が行われている。この為、ＣＰＵ１１は、異常が無いと判断する。
【００３９】
また、第２のブロックの値は、増加が継続している。この為、ＣＰＵ１１は、第２のブロックに関連するソースコードにおいて異常が存在すると判断する。
【００４０】
また、例えば、ブロックの値が予め設定される上限値を超える場合、オーバーフローが発生したと判断する。なお、ＣＰＵ１１は、キーボード１４などにより入力される情報に基づいて、解析用プログラム１７４における上限値を設定する。
【００４１】
図５は、図１及び図２に示す端末装置１において行われる処理について概略的に説明するための説明図である。  
まずＣＰＵ１１は、デバッグＩ／Ｆ１８を介してソフトウェア１９を読み込み、ＲＡＭ１６上にコンパイルする。この場合、ＣＰＵ１１は、ＲＡＭ１６のアドレスと、ソフトウェア１９のソースコードとを対応付けてシンボルファイル１７１を生成し、記憶部１７に格納する。
【００４２】
ソフトウェア１９の実行から記録用プログラム１７２において設定される保存時間が経過した場合、ＣＰＵ１１は、ソフトウェア１９により使用されるＲＡＭ１６のメモリ領域の値をメモリステータス格納部１７３に記憶する記憶処理を行う。ＣＰＵ１１は、この記憶処理を保存時間経過毎に行う。
【００４３】
ソフトウェア１９の実行から解析用プログラム１７４により設定される観測時間が経過した場合、ＣＰＵ１１は、メモリステータス格納部１７３に格納される各時間毎のメモリステータスの解析処理を行う。即ち、解析用プログラム１７４は、各メモリステータスを４バイト単位のブロックに分割し、分割したブロック毎に、メモリの値の時間的な変化を確認する。
【００４４】
解析用プログラム１７４は、メモリの値が増加を続ける場合、メモリの値が予め設定される上限値を超える場合、または、所定時間以上メモリの値が変化しない場合、カウンタの暴走、桁あふれ、またはメモリリークなどの異常が発生している可能性があると判断する。解析用プログラム１７４は、ＣＰＵ１１に対して、異常を示す情報と、メモリのブロックのアドレスとを通知する。
【００４５】
ＣＰＵ１１は、異常が検知されたメモリのブロックのアドレスに基づいてバグを含む可能性のあるソースコードを特定する。即ち、ＣＰＵ１１は、シンボルファイル１７１を参照し、受信するアドレスを検索し、検索したアドレスに対応付けられているソースコードに関する情報を抽出する。
【００４６】
図６及び図７は、図１及び図２に示す端末装置において行われる異常検出処理について概略的に説明するためのフローチャートである。  
まずＣＰＵ１１は、デバッグＩ／Ｆ１８を介してソフトウェア１９を読み込み、ＲＡＭ１６上にコンパイルする。この場合、ＣＰＵ１１は、ＲＡＭ１６のアドレスと、ソフトウェア１９のソースコードとを対応付けてシンボルファイル１７１を生成し、記憶部１７に格納する。
【００４７】
ＣＰＵ１１は、まず、記憶処理を行う。ＣＰＵ１１は、記録用プログラム１７２の内容に基づいて、保存時間を設定する（ステップＳ１１）。また、ＣＰＵ１１は、解析用プログラム１７４の内容に基づいて、観測時間を設定する（ステップＳ１２）。さらに、ＣＰＵ１１は、解析用プログラム１７４の内容に基づいて、メモリの値の上限値を設定する（ステップＳ１３）。
【００４８】
ＣＰＵ１１は、ソフトウェア１９を実行してから観測時間が経過したか否か判断する（ステップＳ１４）。観測時間が経過していない場合（ステップＳ１４、ＮＯ）、ＣＰＵ１１は、ソフトウェア１９により使用されるＲＡＭ１６のメモリステータスをメモリステータス格納部１７３に記憶する（ステップＳ１５）。さらに、ＣＰＵ１１は、メモリステータスを記憶する処理を行ってから保存時間の経過を待ち（ステップＳ１６）、保存時間経過後、ステップＳ１４に移行する。
【００４９】
ステップＳ１４において、ソフトウェア１９の実行から観測時間が経過した場合（ステップＳ１４、ＹＥＳ）、図７に示す解析処理に移行する。
【００５０】
ＣＰＵ１１は、メモリステータス格納部１７３に記憶される複数のメモリステータスをそれぞれ所定容量のブロックに分割し、総ブロック数を確認する（ステップＳ２１）。ＣＰＵ１１は、全てのブロックに対して解析処理を行ったか否か判定する（ステップＳ２２）。
【００５１】
未解析のブロックが存在する場合（ステップＳ２２、ＮＯ）、ＣＰＵ１１は、１つのアドレスのブロックについて、値の時間的変化を確認する（ステップＳ２３）。即ち、ＣＰＵ１１は、異なる時間に記憶したメモリステータスにおける所定のアドレスに記憶されているブロックのメモリの値を抽出する。
【００５２】
ＣＰＵ１１は、抽出した複数の値に基づいて、増加が継続している状態か否か判断する（ステップＳ２４）。即ち、ＣＰＵ１１は、図４に示すようにメモリの値が単調増加を続けている状態か否かを判断する。
【００５３】
増加が継続している場合（ステップＳ２４、ＹＥＳ）、ＣＰＵ１１は、異常の可能性が有ると判断する（ステップＳ２５）。即ち、ＣＰＵ１１は、例えば、カウンタの異常などの為にメモリの値が増加を続けていると判断する。この場合、ＣＰＵ１１は、異常の可能性を検出したメモリのアドレスを保持する。
【００５４】
また、ＣＰＵ１１は、メモリの値が予め設定される上限値を超えるか否か判定する（ステップＳ２６）。メモリの値が予め設定される上限値を超える場合（ステップＳ２６、ＹＥＳ）、ＣＰＵ１１は、異常が発生したと判断し（ステップＳ２７）、ステップＳ２２に移行し、次のブロックの解析に移行する。即ち、ＣＰＵ１１は、例えば、メモリの値がオーバーフローしたと判断する。この場合、ＣＰＵ１１は、異常の可能性を検出したメモリのアドレスを保持する。
【００５５】
増加が継続していない場合（ステップＳ２４、ＮＯ）、または、メモリの値が予め設定される上限値を超えない場合（ステップＳ２６、ＮＯ）、ＣＰＵ１１は、ステップＳ２２に移行し、次のブロックの解析に移行する。
【００５６】
ステップＳ２２において、全てのブロックに対して解析処理を行ったと判断した場合（ステップＳ２２、ＹＥＳ）、ＣＰＵ１１は、解析処理を終了する。
【００５７】
ＣＰＵ１１は、上記の解析処理の結果において、異常が発生したと判断したブロックのアドレスに基づいて、シンボルファイル１７１を参照する。ＣＰＵ１１はシンボルファイル１７１から異常が発生したと判断したブロックのアドレスを検索し、検索したアドレスに対応付けられているソースコードに関する情報を抽出する。これにより、ＣＰＵ１１は、バグを含む可能性のあるソースコードを特定することができる。
【００５８】
上記したように、本実施形態に係る異常検出方法は、所定時間毎に展開されるメモリの値を記憶し、記憶したメモリ領域を所定単位のブロックに分割し、メモリの値の時間的変化をブロック毎に確認する。例えば、メモリの値が増加を続ける場合、メモリの値が予め設定される上限値を超える場合、または、所定時間以上メモリの値が変化しない場合、異常を検出する。
【００５９】
これにより、バグを含む可能性のあるソースコードを特定することができる。また、長時間運用した場合と同等のテスト結果を得ることができる。この結果、より高精度に異常を検出することができる異常検出方法、及び異常検出装置を提供することができる。
【００６０】
次に、第２の実施形態について説明する。なお、第２の実施形態は、記録処理及び解析処理の他の例である。第１の実施形態において説明した構成と同様の構成については、詳細な説明を省略する。
【００６１】
第２の実施形態に係る記憶部１５は、第１の実施形態と同様に、シンボルファイル１７１、記録用プログラム１７２、メモリステータス格納部１７３、及び解析用プログラム１７４などを記憶する。
【００６２】
記録用プログラム１７２は、ＲＡＭ１６のステータス（メモリの値）を所定時間（保存時間）毎にメモリステータス格納部１７３に格納する為のプログラムである。ＣＰＵ１１は、ソフトウェア１９を実行する場合、同時に記録用プログラム１７２を実行する。
【００６３】
ＣＰＵ１１は、記録用プログラム１７２を実行する場合、ソフトウェア１９により使用されるＲＡＭ１６上の全ての領域（ブロック）の値を保存時間毎にメモリステータス格納部１７３に記憶する。この場合、ＣＰＵ１１は、前回メモリステータス格納部１７３に記憶した情報に上書きする。なお、ＣＰＵ１１は、例えば、キーボード１４などにより入力される情報に基づいて、記録用プログラム１７２における保存時間を設定する。
【００６４】
メモリステータス格納部１７３は、記録用プログラム１７２により記憶されるメモリステータスと、解析処理の結果に応じた情報を対応付けて保持する。
【００６５】
解析用プログラム１７４は、メモリステータス格納部１７３に格納されるメモリステータスと、ＲＡＭ１６のステータスとに基づいて解析処理を行うプログラムである。ＣＰＵ１１は、ソフトウェア１９を実行してから所定時間が経過した場合、解析用プログラム１７４を実行する。ＣＰＵ１１は、解析用プログラム１７４を実行する場合、解析部として機能する。
【００６６】
メモリステータス格納部１７３に記憶される複数のメモリステータスをそれぞれ所定容量（例えば４バイト）単位のブロックに分割する。この場合、ＣＰＵ１１は、分割部として機能する。
【００６７】
ＣＰＵ１１は、解析用プログラム１７４を実行する場合、ＲＡＭ１６のステータスとメモリステータス格納部１７３に記憶されるメモリステータスとを対応するブロック毎に比較する。即ち、ＣＰＵ１１は、ＲＡＭ１６のステータスとメモリステータス格納部１７３に記憶されるメモリステータスとで同じアドレスのブロック毎に、メモリの値の比較を行う。
【００６８】
ＣＰＵ１１は、記録用プログラム１７２により記録処理を行う場合、上記の比較に用いたＲＡＭ１６上のメモリの値を、メモリステータス格納部１７３に格納されているメモリの値に上書きする。即ち、ＣＰＵ１１は、メモリステータス格納部１７３に格納されている前回のメモリの値に、今回のメモリの値を上書きする。
【００６９】
即ち、ＣＰＵ１１は、解析用プログラム１７４により解析処理を行う場合、前回記録したＲＡＭ１６の各ブロック毎のメモリの値と、今回記録するＲＡＭ１６の各ブロック毎のメモリの値とを比較する。
【００７０】
ＣＰＵ１１は、メモリの値が連続して増加する回数を各ブロック毎にカウントする機能を有する。ＣＰＵ１１は、カウントした値を解析処理の結果に応じた情報として各ブロックの値に対応付けてメモリステータス格納部１７３に記憶する。
【００７１】
ＣＰＵ１１は、前回記録したＲＡＭ１６の各ブロック毎のメモリの値と、今回記録するＲＡＭ１６の各ブロック毎のメモリの値とを比較し、今回記録するＲＡＭ１６の各ブロック毎のメモリの値が前回記録したＲＡＭ１６の各ブロック毎のメモリの値より大きい場合、メモリの値が増加したと判断する。ＣＰＵ１１は、メモリの値が増加したと判断したブロックのカウント（増加回数）を「１」加算する。
【００７２】
また、ＣＰＵ１１は、今回記録するＲＡＭ１６の各ブロック毎のメモリの値と、前回記録したＲＡＭ１６の各ブロック毎のメモリの値とが等しい場合、メモリの値が変化していないと判断する。この場合、ＣＰＵ１１は、メモリの値が変化していないと判断したブロックのカウントを変更しない。
【００７３】
またさらに、ＣＰＵ１１は、今回記録するＲＡＭ１６の各ブロック毎のメモリの値が前回記録したＲＡＭ１６の各ブロック毎のメモリの値より小さい場合、メモリの値が減少したと判断する。この場合、ＣＰＵ１１は、メモリの値が減少したと判断したブロックのカウントをリセットする。即ち、「０」にする。
【００７４】
ＣＰＵ１１は、例えば、キーボード１４などにより入力される情報に基づいて、予め警告条件を設定する。即ち、ＣＰＵ１１は、メモリの値が連続して増加する回数（増加回数）に閾値を設定する。
【００７５】
ＣＰＵ１１は、各ブロック毎にカウントした値の何れかが予め設定される閾値を超える場合、異常を検出する。ＣＰＵ１１は、異常を検出する場合、操作者に警告を報知する。これにより、メモリにおいて発生する異常を操作者に報知することができる。
【００７６】
なお、ＣＰＵ１１は、例えば、キーボード１４などにより入力される情報に基づいて、解析用プログラム１７４により分割するブロックの容量、及び警告方式などを設定する。
【００７７】
これにより、ＣＰＵ１１は、分割したブロック毎に、ブロック内のメモリの値の時間変化を解析することができる。即ち、ＣＰＵ１１は、あるソースコードにより用いられるＲＡＭ１６上のメモリの領域の時間変化をチェックする。
【００７８】
ＣＰＵ１１は、解析処理及び記録処理完了後、保存時間が経過する場合、上記の解析処理と記録処理とを再び行う。
【００７９】
なお、ＲＡＭ１６のステータスを所定時間（保存時間）毎にメモリステータス格納部１７３に格納するとして説明したが、この構成に限定されない。例えば、ＲＡＭ１６のステータスをメモリステータス格納部１７３に格納する時刻を予め設定する構成であってもよい。
【００８０】
図８に示す例によると、ＣＰＵ１１は、ＲＡＭ１６のメモリ領域を、第１のブロックから第６のブロックの６つのブロックに分割している。
【００８１】
ＣＰＵ１１は、テスト開始から保存時間経過後において一回目の処理を行う。この場合、ＣＰＵ１１は、ＲＡＭ１６のメモリの値を各ブロック毎にメモリステータス格納部１７３に格納する。また、この場合、ＣＰＵ１１は、比較の対象が存在しないため、解析用プログラム１７４を実行しない。
【００８２】
この結果、図８に示す保存データ１７３６−１と増加回数１７３６−１とがメモリステータス格納部１７３に格納される。
【００８３】
一回目の処理から予め設定される保存時間経過後、ＣＰＵ１１は、二回目の処理を行う。この場合、ＣＰＵ１１は、ＲＡＭ１６の各ブロックの値と、メモリステータス格納部１７３に格納されている保存データ１７３６−１とで各ブロック毎に値の比較を行う。ＣＰＵ１１は、比較結果に応じて各ブロック毎の増加回数を示す情報を生成する。
【００８４】
図８に示す例では、第１のブロック、第５のブロック、及び第６のブロックにおいて今回のメモリの値が前回のメモリの値より大きい為、増加回数が加算されている。
【００８５】
ＣＰＵ１１は、比較に用いたＲＡＭ１６の各ブロックの値を保存データ１７３６−１に上書きする。また、ＣＰＵ１１は、各ブロック毎の増加回数を示す情報を増加回数１７３６−１に上書きする。
【００８６】
この結果、図８に示す保存データ１７３６−２と増加回数１７３６−２とがメモリステータス格納部１７３に格納される。
【００８７】
二回目の処理から予め設定される保存時間経過後、ＣＰＵ１１は、三回目の処理を行う。この場合、ＣＰＵ１１は、ＲＡＭ１６の各ブロックの値と、メモリステータス格納部１７３に格納されている保存データ１７３６−２とで各ブロック毎に値の比較を行う。ＣＰＵ１１は、比較結果に応じて各ブロック毎の増加回数を示す情報を生成する。
【００８８】
図８に示す例では、第１のブロック、第２のブロック、及び第４のブロックにおいて今回のメモリの値が前回のメモリの値より大きい為、増加回数が加算されている。また、第５のブロックにおいて今回のメモリの値が前回のメモリの値より小さい為、増加回数がリセットされている。また、今回の第６のブロックのメモリの値は、前回のメモリの値と同じ値である為、増加回数が変更されていない。
【００８９】
ＣＰＵ１１は、比較に用いたＲＡＭ１６の各ブロックの値を保存データ１７３６−２に上書きする。また、ＣＰＵ１１は、各ブロック毎の増加回数を示す情報を増加回数１７３６−２に上書きする。
【００９０】
この結果、図８に示す保存データ１７３６−３と増加回数１７３６−３とがメモリステータス格納部１７３に格納される。ＣＰＵ１１は、上記の処理を記録用プログラム１７２及び解析用プログラム１７４が終了されるまで繰り返し行う。
【００９１】
ここで、カウンタの値、即ち増加回数が大きい値の場合、減少することなく連蔵してメモリの値が増加したと判断することができる。ここから、今後もメモリの値が増加する可能性が高いと予想することができる。そこで、上記したように閾値を設定することにより、異常を検出し、操作者に対して警告を行うことができる。
【００９２】
ＣＰＵ１１は、各ブロック毎にカウントした値の何れかが予め設定される閾値を超える場合、異常を検出する。ＣＰＵ１１は、異常を検出する場合、予め設定される警告方式により操作者に警告を報知する。これにより、メモリにおいて発生する異常を操作者に報知することができる。端末装置１は、ディスプレイ１３に異常の内容を表示する、警告音を発する、または、メールを送信するなどにより操作者に対して警告を報知する。
【００９３】
なお、ＣＰＵ１１は、閾値を各ブロック毎に設けてもよい。閾値を各ブロック毎に設ける場合、ブロックに対応するソフトウェア１９の構文の特性に応じて閾値を設定することができる。これにより、例えば、常に一定値であるブロックに対して閾値を低く設定することができる。また、例えば、加算処理の結果が書き込まれるブロックに対して閾値を高く設定することができる。
【００９４】
図９及び図１０は、図８に示すデータに基づいて行われる異常検出処理の例について概略的に説明するためのフローチャートである。  
まずＣＰＵ１１は、デバッグＩ／Ｆ１８を介してソフトウェア１９を読み込み、ＲＡＭ１６上にコンパイルする。この場合、ＣＰＵ１１は、ＲＡＭ１６のアドレスと、ソフトウェア１９のソースコードとを対応付けてシンボルファイル１７１を生成し、記憶部１７に格納する。
【００９５】
ＣＰＵ１１は、まず、種々の設定を行う。ＣＰＵ１１は、例えばキーボード１４により入力される情報に基づいて、読み取り単位を設定する（ステップＳ３１）。即ち、ＣＰＵ１１は、メモリステータス格納部１７３に記憶されるメモリステータスを分割する単位を設定する。この場合、ＣＰＵ１１は、総ブロック数を確認する。ＣＰＵ１１は、例えばキーボード１４により入力される情報に基づいて、保存時間を設定する（ステップＳ３２）。
【００９６】
さらに、ＣＰＵ１１は、例えばキーボード１４により入力される情報に基づいて、警告条件を設定する（ステップＳ３３）。即ち、ＣＰＵ１１は、メモリの値の増加回数に対して閾値を設定する。またさらに、ＣＰＵ１１は、例えばキーボード１４により入力される情報に基づいて、警告方式を設定する（ステップＳ３４）。
【００９７】
ＣＰＵ１１は、ソフトウェア１９を実行してから保存時間の経過を待つ状態を維持する（ステップＳ３５）。保存時間が経過した場合（ステップＳ３５、ＹＥＳ）、ＣＰＵ１１は、ソフトウェア１９により使用されるＲＡＭ１６のメモリステータス、即ち、今回のメモリの値を確認する（ステップＳ３６）。
【００９８】
さらに、ＣＰＵ１１は、メモリステータス格納部１７３に記憶されているメモリステータス、即ち、前回のメモリの値を読み出す（ステップＳ３７）。
【００９９】
ＣＰＵ１１は、読み出した前回のメモリの値と、今回のメモリの値とを比較する（ステップＳ３８）。
【０１００】
ＣＰＵ１１は、今回のメモリの値が前回のメモリの値より大きい場合、メモリの値が増加したと判断する。この場合、ＣＰＵ１１は、メモリの値が増加したと判断したブロックのカウンタを「１」加算する（ステップＳ３９）。
【０１０１】
また、ＣＰＵ１１は、今回のメモリの値と、前回のメモリの値とが等しい場合、メモリの値が変化していないと判断する。この場合、ＣＰＵ１１は、メモリの値が変化していないと判断したブロックのカウンタを変更しない（ステップＳ４０）。
【０１０２】
またさらに、ＣＰＵ１１は、今回のメモリの値が前回のメモリの値より小さい場合、メモリの値が減少したと判断する。この場合、ＣＰＵ１１は、メモリの値が減少したと判断したブロックのカウンタをリセットする（ステップＳ４１）。
【０１０３】
ＣＰＵ１１は、今回のＲＡＭ１６のメモリの値と、変更後のカウンタの値とを対応付けてメモリステータス格納部１７３に記憶する（ステップＳ４２）。
【０１０４】
ＣＰＵ１１は、全てのブロックに対して上記の解析処理及び記憶処理を行ったか否か判定する（ステップＳ４３）。未処理のブロックが存在する場合（ステップＳ４３、ＮＯ）、ＣＰＵ１１は、ステップＳ３６に移行し、次のアドレスのブロックについてステップＳ３６乃至ステップＳ４２の処理を行う。
【０１０５】
未処理のブロックが存在しない場合（ステップＳ４３、ＹＥＳ）、ＣＰＵ１１は、各ブロック毎のカウンタの値と、予め設定される閾値とを比較する（ステップＳ４４）。ＣＰＵ１１は、この比較の結果、予め設定される閾値以上のカウンタが存在するか否か判定する（ステップＳ４５）。
【０１０６】
予め設定される閾値以上のカウンタが存在しない場合（ステップＳ４５、ＮＯ）、ＣＰＵ１１は、ステップＳ３５に移行し、保存時間の経過を待つ状態に遷移する。予め設定される閾値以上のカウンタが存在する場合（ステップＳ４５、ＹＥＳ）、ＣＰＵ１１は、異常の可能性が有ると判断する（ステップＳ４６）。即ち、ＣＰＵ１１は、例えば、カウンタの異常などの為にＲＡＭ１６の値が増加を続けていると判断する。
【０１０７】
ＣＰＵ１１は、上記の解析処理の結果において、異常が発生したと判断したブロックのアドレスに基づいて、シンボルファイル１７１を参照する。ＣＰＵ１１はシンボルファイル１７１から異常が発生したと判断したブロックのアドレスを検索し、検索したアドレスに対応付けられているソースコードに関する情報を抽出する。これにより、ＣＰＵ１１は、バグを含む可能性のあるソースコードを特定することができる。
【０１０８】
ＣＰＵ１１は、以上を検出したブロック、アドレス、及びソースコードなどを含む警告を、予め設定される警告方式により操作者に報知する（ステップＳ４７）。
【０１０９】
上記したように、本実施形態に係る異常検出方法は、異なる時間におけるメモリの値を比較し、各ブロック毎に増加、変化無し、あるいは減少などの値の変化を解析する。メモリの値の変化に応じてカウンタの値を増減し、カウンタの値が予め設定される閾値に達する場合、異常を検出する。
【０１１０】
これにより、バグを含む可能性のあるソースコードを特定することができる。特に、メモリの値が単調増加する異常を効率的に検出することができる。また、少なくとも前回のメモリの値とカウンタとを記憶しておくことにより実現可能である為、使用するメモリの容量を抑える事ができる。さらに、リアルタイムで解析を行う為、異常をより迅速に検出することができる。この結果、より高精度に異常を検出することができる異常検出方法、及び異常検出装置を提供することができる。
【０１１１】
なお、この発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具現化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合わせてもよい。
【符号の説明】
【０１１２】
１…端末装置、１１…ＣＰＵ、１２…入出力部、１３…ディスプレイ、１４…キーボード、１５…ＲＯＭ、１６…ＲＡＭ、１７…記憶部、１８…デバッグＩ／Ｆ、１９…ソフトウェア、１７１…シンボルファイル、１７２…記録用プログラム、１７３…メモリステータス格納部、１７４…解析用プログラム。
【図１】
2011028711.tif 000003
【図２】
2011028711.tif 000004
【図３】
2011028711.tif 000005
【図４】
2011028711.tif 000006
【図５】
2011028711.tif 000007
【図６】
2011028711.tif 000008
【図７】
2011028711.tif 000009
【図８】
2011028711.tif 000010
【図９】
2011028711.tif 000011
【図１０】
2011028711.tif 000012