(57)【要約】【課題】  メモリの異常使用が発生したことを即座に検知できるメモリ異常使用検知装置を提供する。【解決手段】  メモリ異常使用検知装置１は、メモリ領域確保状態記録テーブル２に対し、テーブル設定回路３が、メモリ３００の領域を動的に確保／解放する関数動作の実行に伴ってターゲットＣＰＵ２００から要求レジスタ３１、先頭アドレスレジスタ３２、設定サイズレジスタ３３にそれぞれ書き込まれる機能停止要求、動的に確保／解放される領域の先頭アドレス、およびそのメモリサイズのデータに基づいて、メモリ３００のアドレスに１：１に対応したメモリ領域確保状態記録テーブル２のアドレスに、その領域のメモリ３００が動的に確保された状態であるか解放された状態であるかを示す識別情報を記録する。この識別情報は、要求レジスタ３１へ機能再開要求が書き込まれた後は、メモリ３００へのアクセスの度に出力制御部４を介して出力される。【選択図】  図１
2005338892.tif 000002
【特許請求の範囲】
【請求項１】
使用領域が動的に確保あるいは解放されるメモリの領域確保状態を記録するメモリ領域確保状態記録テーブルと、
プログラムの実行に伴い動的にメモリ領域を確保あるいは解放する処理が実行されたときに、前記メモリ領域が確保状態であるか解放状態であるかを識別する識別情報を前記メモリのアドレスごとに前記メモリ領域確保状態記録テーブルに書き込むテーブル設定回路と
を具備し、
動的に領域を確保あるいは解放する前記メモリ領域への読み出しアクセスがあったときに、前記メモリ領域確保状態記録テーブルから前記アクセスされたアドレスの前記識別情報を読み出すことを特徴とするメモリ異常使用検知装置。
【請求項２】
前記テーブル設定回路が、
前記メモリ領域確保状態記録テーブルの機能停止要求および機能再開要求、ならびに領域確保状態の記録要求および領域解放状態の記録要求が書き込まれる要求レジスタと、
前記メモリの動的に確保あるいは解放される領域の先頭アドレスが書き込まれる先頭アドレスレジスタと、
前記メモリを動的に確保するのに必要なメモリのサイズあるいは前記メモリの動的に解放されたメモリのサイズが書き込まれる設定サイズレジスタと
を有することを特徴とする請求項１に記載のメモリ異常使用検知装置。
【請求項３】
前記テーブル設定回路は、前記要求レジスタに領域確保状態の記録要求あるいは領域解放状態の記録要求が書き込まれたときに、前記先頭アドレスレジスタに書き込まれたアドレスから前記設定サイズレジスタに書き込まれた範囲のアドレスに亘って、前記識別情報を前記メモリ領域確保状態記録テーブルに書き込むことを特徴とする請求項２に記載のメモリ異常使用検知装置。
【請求項４】
前記テーブル設定回路は、前記要求レジスタに機能停止要求が書き込まれたときに前記メモリ領域確保状態記録テーブルの読み出しを禁止し、前記要求レジスタに機能再開要求が書き込まれたときに前記メモリ領域確保状態記録テーブルの読み出しを許可することを特徴とする請求項２に記載のメモリ異常使用検知装置。
【請求項５】
前記メモリ領域確保状態記録テーブルのアドレスが、前記メモリの動的に確保あるいは解放される領域のアドレスと１対１に対応していることを特徴とする請求項１乃至３のいずれか１項に記載のメモリ異常使用検知装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ異常使用検知装置に係り、特にプログラムの実行時に動的に領域が確保／解放されるメモリの異常使用を検知するメモリ異常使用検知装置に関する。
【背景技術】
【０００２】
動的なメモリ取得を行うプログラムにあっては、メモリの未取得や意図しないメモリの解放などのメモリの異常使用によってプログラムの実行に障害が発生する。ところが、このような障害の発生は、取得したはずのメモリのデータ値の異常によるデータ処理の異常や意図しないメモリへのアクセスなど、間接的な現象として表面化するだけである。また、このような表面化した現象は、メモリの異常使用が発生した箇所とは異なる箇所で現れることが多い。
【０００３】
そのため、メモリの異常使用がどこで発生したかを特定するためには多くの時間を必要とし、アプリケーションプログラムの開発に大きな影響を及ぼす。
【０００４】
そこでアプリケーションプログラムの開発にあたっては、エミュレータなどのデバッグ装置を用いて、動的に使用されるメモリ領域の確保／解放の状態を知ることが、メモリ異常使用と思われる障害が発生したときの原因解析に有効である。
【０００５】
そのため、従来、デバッグ対象のプログラムが呼び出すメモリ確保関数、メモリ解放関数の使用履歴をテーブルに記録して、メモリ異常使用問題発生時の調査に利用するメモリ割当トレース装置が提案されていた（例えば、特許文献１参照。）。
【０００６】
しかし、従来のメモリ割当トレース装置を利用する解析では、プログラム実行の終了後に上述のテーブルを調査して初めて問題の発生箇所が判明するものであり、プログラム実行時にはメモリの異常使用があったことがわからないという、デバッグのリアルタイム性に欠ける問題があった。
【特許文献１】特開平6−２４２９８９号公報  （第４ページ、図１）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
そこで、本発明の目的は、プログラムのデバッグ時にメモリの異常使用が発生したことを即座に検知できるメモリ異常使用検知装置を提供することにある。
【課題を解決するための手段】
【０００８】
本発明の一態様によれば、使用領域が動的に確保あるいは解放されるメモリの領域確保状態を記録するメモリ領域確保状態記録テーブルと、プログラムの実行に伴い動的にメモリ領域を確保あるいは解放する処理が実行されたときに、前記メモリ領域が確保状態であるか解放状態であるかを識別する識別情報を前記メモリのアドレスごとに前記メモリ領域確保状態記録テーブルに書き込むテーブル設定回路とを具備し、動的に領域を確保あるいは解放する前記メモリ領域への読み出しアクセスがあったときに、前記メモリ領域確保状態記録テーブルから前記アクセスされたアドレスの前記識別情報を読み出すことを特徴とするメモリ異常使用検知装置が提供される。
【発明の効果】
【０００９】
本発明によれば、プログラムのデバッグ時にメモリの異常使用が発生したことを即座に検知することができるので、プログラムの開発効率を向上させることができる。
【発明を実施するための最良の形態】
【００１０】
以下、本発明の実施例を図面を参照して説明する。
【実施例】
【００１１】
図１は、本発明の実施例に係るメモリ異常使用検知装置の構成の例を示すブロック図である。なお、図１では、本実施例のメモリ異常使用検知装置１が、ターゲットＣＰＵ２００のエミュレーションを実行するエミュレータ装置１００に組み込まれている例を示す。また、エミュレータ装置１００を用いてデバッグを行うときに、ターゲットＣＰＵ２００で実行されるプログラムは、ソースプログラムのコンパイル時にコンパイラ／リンカでデバッグ用ライブラリがリンクされ、メモリ３００の領域を動的に確保あるいは解放する関数は、本実施例のメモリ異常使用検知装置１へのコマンドやデータの送出なども併せて行うデバッグ専用動作を行うものとする。
【００１２】
メモリ異常使用検知装置１は、ターゲットＣＰＵ２００のプログラム実行により使用領域が動的に確保あるいは解放されるメモリ３００の領域確保状態を記録するメモリ領域確保状態記録テーブル２と、メモリ３００の領域を動的に確保／解放する関数動作の実行時にメモリ領域確保状態記録テーブル２に記録する情報がターゲットＣＰＵ２００からデータバスとアドレスバスを介して入力されるテーブル設定回路３と、テーブル設定回路３の指示に基づいてメモリ領域確保状態記録テーブル２の出力を外部へ出力するかしないかを制御する出力制御部４とを備える。
【００１３】
テーブル設定回路３は、要求レジスタ３１と、先頭アドレスレジスタ３２と、設定サイズレジスタ３３とを有している。
【００１４】
要求レジスタ３１へは、メモリ３００の領域を動的に確保／解放する関数動作の実行に伴って、メモリ領域確保状態記録テーブル２からのデータの読み出し禁止を要求する機能停止要求、メモリ領域確保状態記録テーブル２へ領域確保状態を反映させるための領域確保状態の記録要求、メモリ領域確保状態記録テーブル２へ領域解放状態を反映させるための領域解放状態の記録要求、および禁止したメモリ領域確保状態記録テーブル２からのデータの読み出しの再開を要求する機能再開要求が、ターゲットＣＰＵ２００から書き込まれる。
【００１５】
先頭アドレスレジスタ３２へは、メモリ３００の領域を動的に確保／解放する関数動作の実行に伴って、メモリ３００上に動的に確保される領域の先頭アドレスの値が、ターゲットＣＰＵ２００から書き込まれる。
【００１６】
設定サイズレジスタ３３へは、メモリ３００の領域を動的に確保／解放する関数動作の実行に伴って、メモリ３００上に動的に領域を確保するのに必要なメモリサイズ、あるいは動的に解放する領域のメモリサイズの値が、ターゲットＣＰＵ２００から書き込まれる。
【００１７】
これらの要求レジスタ３１、先頭アドレスレジスタ３２、設定サイズレジスタ３３には、それぞれ固有のアドレスが割り当てられており、書き込み対象のレジスタの指定は、アドレスバスを介して書き込み対象のレジスタのアドレスを指定することによって行われる。また、これらのレジスタへ書き込むデータは、データバスを介して送られる。
【００１８】
テーブル設定回路３は、メモリ３００の領域を動的に確保／解放する関数動作の実行に伴って要求レジスタ３１へ機能停止要求が書き込まれると、出力制御部４を制御して、メモリ領域確保状態記録テーブル２からのデータの読み出しを禁止する。
【００１９】
次いで、先頭アドレスレジスタ３２と設定サイズレジスタ３３へのデータの書き込み後、要求レジスタ３１へ領域確保状態の記録要求もしくは領域解放状態の記録要求が書き込まれると、テーブル設定回路３は、メモリ領域確保状態記録テーブル２へ、先頭アドレスレジスタ３２と設定サイズレジスタ３３に書き込まれたデータに基づいてメモリ３００の領域確保／解放状態の記録を行う。このメモリ領域確保状態記録テーブル２への領域確保／解放状態の記録についての詳細は後述する。
【００２０】
メモリ領域確保状態記録テーブル２への領域確保／解放状態の記録が終了し、要求レジスタ３１へ機能再開要求が書き込まれると、テーブル設定回路３は出力制御部４を制御して、メモリ領域確保状態記録テーブル２からのデータの読み出しを許可する。
【００２１】
ここで、メモリ領域確保状態記録テーブル２の構成と、その記録されるデータについて説明する。
【００２２】
図２（ａ）に、メモリ領域確保状態記録テーブル２の構成の例を示す。
【００２３】
メモリ領域確保状態記録テーブル２は、アドレス部と識別情報部から構成される。アドレス部には、メモリ３００の動的に確保／解放された領域のアドレスに１：１に対応するアドレスが設定されている。識別情報部には、メモリ３００の領域が動的に確保された状態であるか解放された状態であるかを識別する識別情報が記録される。例えば、識別情報を１ビットのデータとし、メモリ３００の領域が動的に確保された状態を‘１’、解放された状態を‘０’で表すとすると、識別情報部には、この１ビットの識別情報が記録される。
【００２４】
図２（ａ）は、メモリ３００の２箇所の領域が動的に確保されたときに、メモリ領域確保状態記録テーブル２へ識別情報が記録される様子を示している。
【００２５】
この識別情報の記録にあたっては、要求レジスタ３１に書き込まれた領域確保状態の記録要求が、テーブル設定回路３の先頭アドレスレジスタ３２と設定サイズレジスタ３３に書き込まれたデータに反映される。
【００２６】
例えば、メモリ３００の領域を動的に確保する動作のときに、先頭アドレスレジスタ３２へ書き込まれたアドレス値を先頭アドレス１、設定サイズレジスタ３３に書き込まれた値が４とすると、メモリ領域確保状態記録テーブル２の先頭アドレス１に相当するアドレスから４アドレス分の識別情報部に、要求レジスタ３１に書き込まれた領域確保状態の記録要求が反映されて、識別情報‘１’が記録される。また、メモリ３００の別の領域を動的に確保する動作で、先頭アドレスレジスタ３２へアドレス値として先頭アドレス２、設定サイズレジスタ３３へ値３が書き込まれると、メモリ領域確保状態記録テーブル２の先頭アドレス２に相当するアドレスから３アドレス分の識別情報部に、やはり要求レジスタ３１に書き込まれた領域確保状態の記録要求が反映されて、識別情報‘１’が記録される。
【００２７】
一方、図２（ｂ）は、メモリ３００の領域が動的に解放されたときに、メモリ領域確保状態記録テーブル２へ識別情報が記録される様子を示している。
【００２８】
ここでは、先頭アドレス１に相当するアドレスから４アドレス分確保されていた領域を解放する動作が行われて、要求レジスタ３１へ領域解放状態の記録要求が書き込まれ、先頭アドレスレジスタ３２へアドレス値として先頭アドレス１、設定サイズレジスタ３３へ値４が書き込まれたときの記録の様子を示す。
【００２９】
この場合、メモリ領域確保状態記録テーブル２の先頭アドレス１に相当するアドレスから４アドレス分の識別情報部に識別情報‘０’が記録される。
【００３０】
このメモリ領域確保状態記録テーブル２のアドレス部はアドレスバスに接続されており、メモリ３００の動的に確保／解放された領域のアドレスにアクセスが行われると、メモリ領域確保状態記録テーブル２の同じアドレスへのアクセスも行われ、そのアドレスの識別情報の読み出しが行われる。
【００３１】
このとき、メモリ領域が確保されているアドレスへのアクセスのときは、メモリ領域確保状態記録テーブル２から‘１’が出力される。ところが、メモリの使用が異常で、既にメモリ領域が解放されているアドレスへアクセスが行われると、メモリ領域確保状態記録テーブル２からは‘０’が出力される。すなわち、メモリ領域確保状態記録テーブル２から‘０’が出力されたときは、メモリの使用の異常を検知したものと判断することできる。
【００３２】
メモリ領域確保状態記録テーブル２から読み出された識別情報は、出力制御部４を介してエミュレータ装置１００の機能制御部１０１へ出力される。この機能制御部１０１は、ターゲットＣＰＵ２００の停止やトレースメモリ（図示せず）へのトレースデータの書き込みなどを制御する機能を有する。
【００３３】
そこで、出力制御部４を介してメモリ領域確保状態記録テーブル２から‘０’が入力されたときに、機能制御部１０１がターゲットＣＰＵ２００を停止させるようにしておけば、メモリの異常使用が発生したときに即座にターゲットＣＰＵ２００を停止させることができる。
【００３４】
なお、初期状態では、テーブル設定回路３へエミュレータ装置１００のエミュレータ制御部１０２からアドレスと初期データが送られ、メモリ領域確保状態記録テーブル２の識別情報は総て‘０’に初期設定される。
【００３５】
また、要求レジスタ３１へ機能停止要求が書き込まれてメモリ領域確保状態記録テーブル２からのデータの読み出しが禁止されている間は、出力制御部４から‘１’を出力するようにしておく。
【００３６】
次に、デバッグ中のプログラム実行に従って、メモリ領域確保状態記録テーブル２へ識別情報が書き込まれる様子を図３および図４を用いて説明する。
【００３７】
図３は、デバッグ対象のＣ言語で書かれたソースプログラムの例を示す図であり、図４は、図３に示すプログラムのデバッグの実行に伴ってメモリ領域確保状態記録テーブル２へ書き込まれる識別情報の変化を示す図である。
【００３８】
図３のプログラムの実行において、メモリ３００に対しては次のような動作が順次発生する。  
（１）メモリ領域の動的な確保
point1=malloc（sizeof（int［3］））；メモリ領域を動的に確保する関数mallocの使用によりメモリ領域の動的な確保が行われる。  
（２）メモリ領域の動的な確保
point2=malloc（sizeof（int［3］））；（１）と同じく、関数mallocの使用によりメモリ領域の動的な確保が行われる。  
（３）確保したメモリ領域へのアクセス
point1[0] = 1;
（４）確保したメモリ領域へのアクセス
point2[0] = point1[0];
（５）メモリ領域の動的な解放
free(point1); メモリ領域を動的に解放する関数freeの使用によりメモリ領域の動的な解放が行われる。  
（６）解放したメモリ領域へのアクセス
point1[0] = point2[0];   point1[0]は既に解放された領域にあるため、このアクセスは異常である。
【００３９】
このようなメモリ３００に対する動作に対して、メモリ領域確保状態記録テーブル２への識別情報の書き込みおよび読み出しは、次のように行われる。
【００４０】
図４（ａ）は、メモリ領域確保状態記録テーブル２の初期状態を示す。このとき総ての識別情報は‘０’とされている。
【００４１】
図４（ｂ）は、上述の（１）の動作が行われたときのメモリ領域確保状態記録テーブル２への識別情報の書き込みの様子を示す。このとき、メモリ３００のアドレス０から２の領域が確保されたとすると、メモリ領域確保状態記録テーブル２のアドレス０から２の識別情報に‘１’が書き込まれる。
【００４２】
図４（ｃ）は、上述の（２）の動作が行われたときのメモリ領域確保状態記録テーブル２への識別情報の書き込みの様子を示す。このとき、メモリ３００のアドレス４から６の領域が確保されたとすると、メモリ領域確保状態記録テーブル２のアドレス４から６の識別情報に‘１’が書き込まれる。
【００４３】
図４（ｄ）は、上述の（３）の動作が行われたときのメモリ領域確保状態記録テーブル２からの識別情報の読み出しの様子を示す。このとき、メモリ３００のアドレス０にpoint1[0]が記憶されているので、メモリ領域確保状態記録テーブル２のアドレス０から識別情報‘１’が読み出される。
【００４４】
図４（ｅ）は、上述の（４）の動作が行われたときのメモリ領域確保状態記録テーブル２からの識別情報の読み出しの様子を示す。このとき、メモリ３００のアドレス０にpoint1[0]、アドレス４にpoint2[0]が記憶されているので、メモリ領域確保状態記録テーブル２のアドレス０から識別情報‘１’、アドレス４から識別情報‘１’が読み出される。
【００４５】
図４（ｆ）は、上述の（５）の動作が行われたときのメモリ領域確保状態記録テーブル２への識別情報の書き込みの様子を示す。このとき、メモリ３００のアドレス０から２の領域が解放されるので、メモリ領域確保状態記録テーブル２のアドレス０から２の識別情報に‘０’が書き込まれる。
【００４６】
図４（ｇ）は、上述の（６）の動作が行われたときのメモリ領域確保状態記録テーブル２からの識別情報の読み出しの様子を示す。このとき、メモリ領域確保状態記録テーブル２のアドレス０から識別情報‘０’、アドレス４から識別情報‘１’が読み出される。ここでは、既に解放したメモリ領域であるアドレス０へのアクセスに対して、識別情報‘０’が読み出される。この識別情報‘０’がメモリ領域確保状態記録テーブル２から出力されることにより、この部分のプログラム動作におけるメモリの使用に異常があることを即座に知ることができる。
【００４７】
このような本実施例のメモリ異常使用検知装置によれば、プログラムのデバッグ時にメモリの異常使用が発生したことを即座に検知することができる。そのため、本実施例のメモリ異常使用検知装置をエミュレータ装置に組み込んで用いて、メモリの異常使用を検知したときに直ちにターゲットＣＰＵを停止させるなどのことを行えば、問題解析のためのデバッグ作業を行うことができる。これにより、プログラムの開発効率の向上を図ることができる。
【図面の簡単な説明】
【００４８】
【図１】本発明の実施例に係るメモリ異常使用検知装置の構成の例を示すブロック図。
【図２】本発明の実施例に係るメモリ異常使用検知装置のメモリ領域確保状態記録テーブルの構成の例を示す図。
【図３】デバッグ対象のソースプログラムの例を示す図。
【図４】デバッグ中のメモリ領域確保状態記録テーブルの書き込み状態の例を示す図。
【符号の説明】
【００４９】
１  メモリ異常使用検知装置
２  メモリ領域確保状態記録テーブル
３  テーブル設定回路
４  出力制御部
３１  要求レジスタ
３２  先頭アドレスレジスタ
３３  設定サイズレジスタ
【図１】
2005338892.tif 000003
【図２】
2005338892.tif 000004
【図３】
2005338892.tif 000005
【図４】
2005338892.tif 000006