JP2004164554A - プログラム実行監視装置および方法 - Google Patents
プログラム実行監視装置および方法 Download PDFInfo
- Publication number
- JP2004164554A JP2004164554A JP2003074805A JP2003074805A JP2004164554A JP 2004164554 A JP2004164554 A JP 2004164554A JP 2003074805 A JP2003074805 A JP 2003074805A JP 2003074805 A JP2003074805 A JP 2003074805A JP 2004164554 A JP2004164554 A JP 2004164554A
- Authority
- JP
- Japan
- Prior art keywords
- monitoring
- function
- program
- code
- execution
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
【課題】システムの運用時においても利用可能な低負荷で、容易に適用可能なプログラムへの監視用コードの挿入方法を提案する。
【解決手段】プログラムの読み込み時に監視対象の関数の実行コード中に監視コードを埋め込む。この際にスタブ関数を経由して実行することで、監視対象の関数以外の実行には負荷をかけることなく関数実行の監視を行うことが可能となる。
【選択図】 図1
【解決手段】プログラムの読み込み時に監視対象の関数の実行コード中に監視コードを埋め込む。この際にスタブ関数を経由して実行することで、監視対象の関数以外の実行には負荷をかけることなく関数実行の監視を行うことが可能となる。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明はコンピュータのプログラム実行に際してプログラム実行を効率良く監視する方法に関する。
【0002】
【従来の技術】
コンピュータで実行するプログラムの実行監視としては、例えばプログラムのソースに、ログの出力コードを埋め込んでコンパイルし、これを実行することで実行ログを得る方法は非常に一般的で、プログラム開発の基本手法である(特許文献1等)。
【0003】
また現在存在する殆どのデバッガはプログラムにデバッグ用コードを挿入することでその機能を実現している。例えばソフトウェア割り込みを発生させる命令をプログラム中に埋め込むことで、そのコードが実行されると割り込みが発生し、プログラムの実行を容易に検出することが可能となっている(特許文献2等)
プログラム実行のボトルネックを検出するために、プログラムのどの部分でどれだけ時間がかかっているか等を計測するためのプロフアイリングを行うツールも存在し、これらもプログラムの最適化工程ではしばしば利用されている。これらは、プログラムの読み込み時にプログラムに監視用のコードを挿入し、その監視用のコードが実行されることでプログラムの実行状態を監視する。
【0004】
【特許文献1】
特開平6−314221号公報
【特許文献2】
特開平11−184727号公報
【0005】
【発明が解決しようとする課題】
上記ログの出力コードを埋め込む方式は、実施にプログラムソースとこのコンパイル環境が必要であり、いずれかが欠けても実現不可能である。デバッガはプログラム開発時に利用することを念頭に開発されており、実行時に少ない負荷で利用することが難しい上、インタプリタのプログラム実行環境では使用できない。
また、プロフアイリングを行うツールでは、監視コードをプログラムの動作に影響を極力与えずに挿入するには、複雑な処理が必要となる(例えば、引数の監視を行うためにはスタックの操作が必要となる等)。本発明では、システムの運用時においても利用可能な低負荷で、容易に適用可能なプログラムヘの監視用コードの挿入方法を提案する。
【0006】
【発明を解決するための手段】
上記の課題を解決するために、複数の関数を含むプログラムを格納するプログラム記憶部と、該記憶部からプログラムを読み出して実行するプログラム実行部とを備えるコンピュータでプログラムを実行するに際し、記憶部から読み出したプログラムの関数が監視対象の関数であるかを判定し、監視対象の関数に対して監視処理が施されるように当該プログラムに監視コードを挿入する。
【0007】
このときに、監視コードを、監視する関数の先頭と、関数からの復帰をおこなう命令の直前に挿入しておく。監視コードを挿入された関数を、プログラムの実行部が実行することにより監視コードが実行されて関数実行の状況がわかるようになる。
【0008】
また、監視対象の関数を呼び出すためのアドレスあるいは関数の名称を変更し、名称の変更された関数を呼び出す命令を含む監視用関数と前述した監視コードとからなる監視用関数を生成し、プログラムに前記監視用関数を挿入するようにしてもよい。
【0009】
この場合にユーザが任意に作成した監視コードを、一旦コンパイラでコンパイルし、これを変形して監視用関数とすれば、ユーザの作成した任意のコードを監視コードとして使用することが出来るため、自由度の高い実行監視を実現できる。
【0010】
【発明の実施の形態】
以下、図面を用いて本発明の実施例を説明する。なお、本発明が実施例に限定されるものではない。
【0011】
図1は本発明の一実施例の全体構成を示す。本発明は、コンピュータ上で動作するプログラム実行部10が、プログラム格納部20に格納されたプログラムファイル50を読込み実行する一般的なプログラム実行装置に、監視命令挿入部11と監視命令挿入制御ファイル30、監視プログラム60を更に備える構成からなる。
【0012】
プログラム実行部10は、インタプリタ実行系と機械語を実行する通常の実行系とが考えられるいずれもCPUが実行主体となる。プログラム格納部20は、ディスク装置、メモリカード、磁気テープなどプログラムを記録可能な全ての装置である。監視命令挿入制御ファイル30は実行するプログラム中の関数が監視対象の関数であるかどうかを決める情報を格納する。単純なファイルで構成されてもよいが、他あるいは同一のコンピュータ上で動作する別のプログラムであってもよい。
【0013】
プログラム実行装置は、プログラム実行部10、プログラム格納部20のほかに、プログラム実行部10が実行するプログラム格納部等から読み出したプログラムやデータを一時格納するワークメモリ12、プログラムの実行等の指示を操作者が装置へ入力するための入力装置13、プログラムの実行経過、実行結果等を可視出力するためのディスプレイ14、通信路を介した他の装置との通信を制御する通信制御部15、監視プログラム、監視命令挿入制御ファイル等のデータがCD−ROM等の記憶媒体に格納されて取引される場合に、記憶媒体の内容を読み取ってプログラム格納部20ヘインストールするための媒体読み取り装置16を備え、それぞれが内部バスブリッジ17で接続される。なお、図中のバスブリッジ17はワークメモリ、入力装置、ディスプレイ等とのインターフェースコントローラも兼ねている。
【0014】
図2はプログラムファイル50の構成を示す。プログラムファイル50は任意個の関数510を持つ。関数は1つあるいは複数の実行コード520で構成される。実行コード520としては、通常のプログラム実行系では機械語が考えられ、インタブリタ実行系では中間コード(バイトコードとも呼ばれる)が考えられる。プログラムファイル50には関数テーブル530を持つ。関数テーブル530は関数がプログラムファイルのうちどの部分を構成しているか、どのような属性を持っているか等の関数に関する情報を持つ。なお、図2では、関数テーブル530をプログラムファイル50の中に持たせる構造としているが、例えば一般的なコンパイラで出力されるMAPファイルのように別のファイルとして存在させてもよい。
【0015】
図3は関数テーブルの構造の一例を示す。関数テーブル530は、インデックス531、関数名532、開始アドレス533、終了アドレス534、および属性535からなる。プログラムファイル内の関数の情報が格納される。
【0016】
図4は本発明のプログラム実行部10がプログラムファイル50を読み込みつつ監視コードを挿入する処理を示したフローチャートである。まずプログラム実行部10はプログラムファイル50から関数を1つ読み込み監視命令挿入部11に処理を譲る(ステップ1000)。監視命令挿入部11は監視命令挿入制御ファイル30の情報を元に、それが監視対象の関数かどうかを判定し(ステップ1010)、監視対象であればその関数に監視コードを挿入し(ステップ1020)、挿入したコードの長さだけ挿入部以降の実行コードのアドレス情報および、関数テーブル530を変更し(ステップ1030)、注目している監視対象向けの監視コードを全て挿入するまでステップ1020と1030を繰り返した後、その関数をプログラム実行部10に渡す(ステップ1040)。これを全ての関数について行う(ステップ1050)。プログラム実行部10はステップ1040で監視命令挿入部11から渡された関数を並行して実行する。
【0017】
図5は図4で示した監視コードの挿入方法によって監視コードが挿入された関数の構成を示した図である。図の上側が先に実行され、順番に下の命令が実行される。本方式ではまず関数の先頭部分に監視コード530を埋め込み、次に実行コードのうち関数終了のコード、つまりこのコードを実行することで関数を呼び出した箇所に戻るコード521、の直前に監視コード531を挿入する。
【0018】
プログラム実行部10は監視命令挿入部11によって監視コードが上記の通り挿入されたプログラムファイルを順次実行するので、関数に実行が移った直後と終了直前に監視コードを実行することになり、当該関数の実行時間、実行回数および呼出時に渡された引数などを監視することが可能となる。
【0019】
なお、監視コードは、それ自体が複数の実行コードで実装されたモジュールであってもよいし、他の監視コードライブラリを呼び出す関数呼出コードであってもよいし、機械語実行の場合ではソフトウェア割り込みを発生させるようなコードでもよい。監視コードの動作としては、外部のハードウェアの制御、ログの出力、変数の値の変更等が例として考えられる。また、監視コードは関数実行時のみ、あるいは関数実行終了前のいずれかに挿入するだけでも良い。
【0020】
次に図6を用いて監視コード挿入方式の他の例を説明する。この方法では、まず監視する関数(例えばここでは関数A)(610)をプログラム実行上において別の関数に見えるように変更する(615)。これは例えば関数をアドレスで呼び出す実行方式であれば、関数テーブルを(620)を参照して、利用可能な別のアドレスに関数を移動する方式が考えられる。インタブリタ言語で多く採用されている、関数テーブル(620)へのインデックスを指定して関数を呼び出す実行方式であれば、関数テーブル(620)に新たにエントリを追加して、別の名前を付け、その他の情報については元の情報をコピーすることで実現できる。次に、従来の関数Aとして呼び出した場合に呼び出されるスタブ関数(611)を挿入する。このスタプ関数(611)には改名された関数Aを呼び出すコード(613)を記述する。これにより、関数A(610)の呼出は、一旦スタブ関数(611)を経由してから「改名された関数A」(620)を呼び出すことになる。この際に、スタブ関数(611)の改名された関数Aの呼出コード(613)の前に監視コード(612)が存在すれば、改名された関数A(615)に先だって監視コード(612)の内容が実行され、同様に後ろの監視コード(614)は改名された関数A(615)の実行の後で呼び出されることになる。この監視コード中で、関数Aに渡されるはずである引数の値の監視や変更をしたり、関数Aからの戻り値を監視及び変更することも可能となる。
【0021】
図7は図6で示した方式の監視コード挿入処理のフローチャートである。図4で説明した処理と異なるのはステップ1015の部分だけであるので、その部分だけを抜き出して説明する。本フローではプログラム実行部10の関数の呼出方式が、関数テーブル530のインデックス531を使用して関数を実行する場合について説明する。読み込んだ関数を別名の関数にするために、ます関数テーブルにエントリを新規に作成する(ステップ2000)。次にその新規作成したエントリに図4のステップ1000で読み込んだ関数を、プログラム中で別の関数として見えるように登録する(ステップ2010)。次に、監視用のスタブ関数を挿入し(ステップ2020)、このスタプ関数からステップ2010で操作した監視対象の関数の呼出をするコードを挿入し(ステップ2030)、監視コードも挿入する(ステップ2040)。最後に、ステップ2020で挿入したスタブ関数が監視対象として機能するように関数テーブルを変更する。
【0022】
このような処理を行うことで、ステップ2020で挿入したスタブ関数を経由して監視対象の関数の実行を監視することが可能となる。
【0023】
図7のステップ2020から2040ではスタブ関数をプログラム的に生成した.この場合、利用者が監視コードの振る舞いを細かく制御するためには監視命令挿入部11にこれに対応する機能を実装する必要がある。一方、監視対象のスタブ関数に利用者が記述したコードを利用すればこれを変形して挿入するだけでよい。任意の監視コード挿入を容易に実現できる。
【0024】
この手順について図8のフローを用いて説明する。図7で示した処理と異なるのはステップ2015の部分だけであるので、その部分だけを抜き出して説明する。まず、監視対象の関数の呼出規約を取得する(ステップ3000)。呼出規約とは、関数がどのような引数、返値を持つかなど、関数を呼び出す際に必要な規約である。次に得られた呼出規約を元に、スタブ関数のソースコードを生成する(ステップ3010)。これはファイルに出力しても良いし、GUI上にウィンドウを生成して出力しても良い。使用者はこのソースを必要に応じて修正し(ステップ3020)、ソースをコンパイルする(ステップ3030)。コンパイルのタイミングは、監視命令挿入部11が使用者による変更を検出して行っても良いし、使用者が行っても良い。コンパイルが終了したらコンパイルされたコードからスタブ関数として作成、コンパイルして部分を抽出しこれをスタブ関数として挿入する(ステップ3040)。最後に挿入したスタブ関数ゐ内容がプログラム実行に矛盾しないかをチェックして、必要なら修正する(ステップ3050)
前述した手順ではスタブのソース出力(ステップ3010)からソースのコンパイル(ステップ3030)を挿入時に行うように記したが、この処理を利用者がプログラム実行の前にあらかじめ行っておき、どの監視コードを挿入するかという情報を監視命令挿入制御部30から取得して、挿入時にはステップ3040,3050の処理だけを行うことで、高速化する方法も考えられる。あるいは、ステップ3000から3030までの処理を行う部分だけを別のプログラムとして実装することも可能である。
【0025】
また、前述の実施例では、1つの監視対象の関数に対して様々な種類の監視操作を行う場合に、1つのスタブ関数にそれらの複数の処理を既述するように既述した。次に一つの監視対象関数に対して、複数の監視コードを挿入する方式について説明する。
【0026】
図9にこの方式の概要を示した。図6に監視コードの挿入方法を図示したが、これは、スタブ関数を1つ使用する方式し、その中に監視コードを実装する方式である。一方、図9で示したのは、複数のスタブ関数としてスタブ関数Bと、スタブ関数Cの複数の関数を挿入する方法である(図9では2つの関数を挿入する例を示した)。この状態ではAに改名されたスタブ関数C(700)を呼び出すと、まず監視コードZ(612)が実行され、スタブ関数Bの呼出(704)が起こる。さらに、スタブ関数B(701)は改名された関数Aを呼び出し(705)、終了後に監視コードY(703)を実行する。このような構成でスタブ関数を入れ子で呼び出すことで複数の監視コードを1つの呼出で実行できる。
【0027】
図10にはこの関数Aに対して、どのスタブ関数を挿入するかを監視命令挿入制御部30に入力するテーブルの例である。この図では、監視対象の関数(801)と、挿入する関数の対応(802)が一行になっており、同一の監視対象関数に対して、複数の関数を挿入することが可能である。図では、関数Aに対して、スタブ関数Bとスタブ関数Cを挿入する場合の例を示した。この行の既述順序が挿入順、呼出順に反映するように実装することで、監視の精度を高めることが出来る。例えば、関数の実行時間の測定は出来るだけ監視対象の直前で行う必要があり、このような利用者の意図を反映できることで、監視の精度を高めることが可能となる。
【0028】
挿入処理は、一旦、監視対象の関数名に改名されたスタブを次の処理では監視対象と見なすことで、図4と図8のフローチャートがそのまま適用可能である。
【0029】
上記実施例では、ソースを生成してコンパイルする方法を示したが、より容易な方法として、例えばアセンブラ言語を使用してアセンブラで実行可能形式に変換してもよい。また、機械語あるいはインタブリタのバイトコードをユーザが入力し、このコードで監視実行する方式も考えられる。
【0030】
【発明の効果】
本発明によれば、監視するプログラムのソースコードやコンパイル作業をすることなくプログラム中の特定のあるいは全ての関数の実行を監視することができる。本発明を用いて(監視の必要な)特定の関数にだけ監視コードを挿入する場合には他の関数実行に負荷をかけずに監視を行うことができる。スタブ関数を挿入する方式を採用した場合には利用者の記述した任意の監視コードを挿入することができ、自由度の高い実行監視が可能となる。
【図面の簡単な説明】
【図1】本発明の一実施例における全体構成を示すブロック図。
【図2】プログラムファイルの構成を示す図。
【図3】関数テーブルの構成を示す図。
【図4】監視コード挿入の手順を示したフローチャート。
【図5】監視コードが挿入された関数の構成を示す図。
【図6】監視コード挿入の他の例を説明する図。
【図7】スタブ関数挿入方式による監視コード導入の手順を示すフローチャート
【図8】スタブ関数挿入方式による他の例の手順を示すフローチャート。
【図9】複数のスタブ関数を使用する場合の構成を示す図。
【図10】複数のスタブ関数を使用する場合の挿入順序指定方式を示す図。
【符号の説明】
10…プログラム実行部、11・‥監視命令挿入部、20…プログラム格納部、30…監視命令挿入制御部、41‥・監視コード、50・・・プログラムファイル、510…関数、520…実行コード、530…関数テーブル。
【発明の属する技術分野】
本発明はコンピュータのプログラム実行に際してプログラム実行を効率良く監視する方法に関する。
【0002】
【従来の技術】
コンピュータで実行するプログラムの実行監視としては、例えばプログラムのソースに、ログの出力コードを埋め込んでコンパイルし、これを実行することで実行ログを得る方法は非常に一般的で、プログラム開発の基本手法である(特許文献1等)。
【0003】
また現在存在する殆どのデバッガはプログラムにデバッグ用コードを挿入することでその機能を実現している。例えばソフトウェア割り込みを発生させる命令をプログラム中に埋め込むことで、そのコードが実行されると割り込みが発生し、プログラムの実行を容易に検出することが可能となっている(特許文献2等)
プログラム実行のボトルネックを検出するために、プログラムのどの部分でどれだけ時間がかかっているか等を計測するためのプロフアイリングを行うツールも存在し、これらもプログラムの最適化工程ではしばしば利用されている。これらは、プログラムの読み込み時にプログラムに監視用のコードを挿入し、その監視用のコードが実行されることでプログラムの実行状態を監視する。
【0004】
【特許文献1】
特開平6−314221号公報
【特許文献2】
特開平11−184727号公報
【0005】
【発明が解決しようとする課題】
上記ログの出力コードを埋め込む方式は、実施にプログラムソースとこのコンパイル環境が必要であり、いずれかが欠けても実現不可能である。デバッガはプログラム開発時に利用することを念頭に開発されており、実行時に少ない負荷で利用することが難しい上、インタプリタのプログラム実行環境では使用できない。
また、プロフアイリングを行うツールでは、監視コードをプログラムの動作に影響を極力与えずに挿入するには、複雑な処理が必要となる(例えば、引数の監視を行うためにはスタックの操作が必要となる等)。本発明では、システムの運用時においても利用可能な低負荷で、容易に適用可能なプログラムヘの監視用コードの挿入方法を提案する。
【0006】
【発明を解決するための手段】
上記の課題を解決するために、複数の関数を含むプログラムを格納するプログラム記憶部と、該記憶部からプログラムを読み出して実行するプログラム実行部とを備えるコンピュータでプログラムを実行するに際し、記憶部から読み出したプログラムの関数が監視対象の関数であるかを判定し、監視対象の関数に対して監視処理が施されるように当該プログラムに監視コードを挿入する。
【0007】
このときに、監視コードを、監視する関数の先頭と、関数からの復帰をおこなう命令の直前に挿入しておく。監視コードを挿入された関数を、プログラムの実行部が実行することにより監視コードが実行されて関数実行の状況がわかるようになる。
【0008】
また、監視対象の関数を呼び出すためのアドレスあるいは関数の名称を変更し、名称の変更された関数を呼び出す命令を含む監視用関数と前述した監視コードとからなる監視用関数を生成し、プログラムに前記監視用関数を挿入するようにしてもよい。
【0009】
この場合にユーザが任意に作成した監視コードを、一旦コンパイラでコンパイルし、これを変形して監視用関数とすれば、ユーザの作成した任意のコードを監視コードとして使用することが出来るため、自由度の高い実行監視を実現できる。
【0010】
【発明の実施の形態】
以下、図面を用いて本発明の実施例を説明する。なお、本発明が実施例に限定されるものではない。
【0011】
図1は本発明の一実施例の全体構成を示す。本発明は、コンピュータ上で動作するプログラム実行部10が、プログラム格納部20に格納されたプログラムファイル50を読込み実行する一般的なプログラム実行装置に、監視命令挿入部11と監視命令挿入制御ファイル30、監視プログラム60を更に備える構成からなる。
【0012】
プログラム実行部10は、インタプリタ実行系と機械語を実行する通常の実行系とが考えられるいずれもCPUが実行主体となる。プログラム格納部20は、ディスク装置、メモリカード、磁気テープなどプログラムを記録可能な全ての装置である。監視命令挿入制御ファイル30は実行するプログラム中の関数が監視対象の関数であるかどうかを決める情報を格納する。単純なファイルで構成されてもよいが、他あるいは同一のコンピュータ上で動作する別のプログラムであってもよい。
【0013】
プログラム実行装置は、プログラム実行部10、プログラム格納部20のほかに、プログラム実行部10が実行するプログラム格納部等から読み出したプログラムやデータを一時格納するワークメモリ12、プログラムの実行等の指示を操作者が装置へ入力するための入力装置13、プログラムの実行経過、実行結果等を可視出力するためのディスプレイ14、通信路を介した他の装置との通信を制御する通信制御部15、監視プログラム、監視命令挿入制御ファイル等のデータがCD−ROM等の記憶媒体に格納されて取引される場合に、記憶媒体の内容を読み取ってプログラム格納部20ヘインストールするための媒体読み取り装置16を備え、それぞれが内部バスブリッジ17で接続される。なお、図中のバスブリッジ17はワークメモリ、入力装置、ディスプレイ等とのインターフェースコントローラも兼ねている。
【0014】
図2はプログラムファイル50の構成を示す。プログラムファイル50は任意個の関数510を持つ。関数は1つあるいは複数の実行コード520で構成される。実行コード520としては、通常のプログラム実行系では機械語が考えられ、インタブリタ実行系では中間コード(バイトコードとも呼ばれる)が考えられる。プログラムファイル50には関数テーブル530を持つ。関数テーブル530は関数がプログラムファイルのうちどの部分を構成しているか、どのような属性を持っているか等の関数に関する情報を持つ。なお、図2では、関数テーブル530をプログラムファイル50の中に持たせる構造としているが、例えば一般的なコンパイラで出力されるMAPファイルのように別のファイルとして存在させてもよい。
【0015】
図3は関数テーブルの構造の一例を示す。関数テーブル530は、インデックス531、関数名532、開始アドレス533、終了アドレス534、および属性535からなる。プログラムファイル内の関数の情報が格納される。
【0016】
図4は本発明のプログラム実行部10がプログラムファイル50を読み込みつつ監視コードを挿入する処理を示したフローチャートである。まずプログラム実行部10はプログラムファイル50から関数を1つ読み込み監視命令挿入部11に処理を譲る(ステップ1000)。監視命令挿入部11は監視命令挿入制御ファイル30の情報を元に、それが監視対象の関数かどうかを判定し(ステップ1010)、監視対象であればその関数に監視コードを挿入し(ステップ1020)、挿入したコードの長さだけ挿入部以降の実行コードのアドレス情報および、関数テーブル530を変更し(ステップ1030)、注目している監視対象向けの監視コードを全て挿入するまでステップ1020と1030を繰り返した後、その関数をプログラム実行部10に渡す(ステップ1040)。これを全ての関数について行う(ステップ1050)。プログラム実行部10はステップ1040で監視命令挿入部11から渡された関数を並行して実行する。
【0017】
図5は図4で示した監視コードの挿入方法によって監視コードが挿入された関数の構成を示した図である。図の上側が先に実行され、順番に下の命令が実行される。本方式ではまず関数の先頭部分に監視コード530を埋め込み、次に実行コードのうち関数終了のコード、つまりこのコードを実行することで関数を呼び出した箇所に戻るコード521、の直前に監視コード531を挿入する。
【0018】
プログラム実行部10は監視命令挿入部11によって監視コードが上記の通り挿入されたプログラムファイルを順次実行するので、関数に実行が移った直後と終了直前に監視コードを実行することになり、当該関数の実行時間、実行回数および呼出時に渡された引数などを監視することが可能となる。
【0019】
なお、監視コードは、それ自体が複数の実行コードで実装されたモジュールであってもよいし、他の監視コードライブラリを呼び出す関数呼出コードであってもよいし、機械語実行の場合ではソフトウェア割り込みを発生させるようなコードでもよい。監視コードの動作としては、外部のハードウェアの制御、ログの出力、変数の値の変更等が例として考えられる。また、監視コードは関数実行時のみ、あるいは関数実行終了前のいずれかに挿入するだけでも良い。
【0020】
次に図6を用いて監視コード挿入方式の他の例を説明する。この方法では、まず監視する関数(例えばここでは関数A)(610)をプログラム実行上において別の関数に見えるように変更する(615)。これは例えば関数をアドレスで呼び出す実行方式であれば、関数テーブルを(620)を参照して、利用可能な別のアドレスに関数を移動する方式が考えられる。インタブリタ言語で多く採用されている、関数テーブル(620)へのインデックスを指定して関数を呼び出す実行方式であれば、関数テーブル(620)に新たにエントリを追加して、別の名前を付け、その他の情報については元の情報をコピーすることで実現できる。次に、従来の関数Aとして呼び出した場合に呼び出されるスタブ関数(611)を挿入する。このスタプ関数(611)には改名された関数Aを呼び出すコード(613)を記述する。これにより、関数A(610)の呼出は、一旦スタブ関数(611)を経由してから「改名された関数A」(620)を呼び出すことになる。この際に、スタブ関数(611)の改名された関数Aの呼出コード(613)の前に監視コード(612)が存在すれば、改名された関数A(615)に先だって監視コード(612)の内容が実行され、同様に後ろの監視コード(614)は改名された関数A(615)の実行の後で呼び出されることになる。この監視コード中で、関数Aに渡されるはずである引数の値の監視や変更をしたり、関数Aからの戻り値を監視及び変更することも可能となる。
【0021】
図7は図6で示した方式の監視コード挿入処理のフローチャートである。図4で説明した処理と異なるのはステップ1015の部分だけであるので、その部分だけを抜き出して説明する。本フローではプログラム実行部10の関数の呼出方式が、関数テーブル530のインデックス531を使用して関数を実行する場合について説明する。読み込んだ関数を別名の関数にするために、ます関数テーブルにエントリを新規に作成する(ステップ2000)。次にその新規作成したエントリに図4のステップ1000で読み込んだ関数を、プログラム中で別の関数として見えるように登録する(ステップ2010)。次に、監視用のスタブ関数を挿入し(ステップ2020)、このスタプ関数からステップ2010で操作した監視対象の関数の呼出をするコードを挿入し(ステップ2030)、監視コードも挿入する(ステップ2040)。最後に、ステップ2020で挿入したスタブ関数が監視対象として機能するように関数テーブルを変更する。
【0022】
このような処理を行うことで、ステップ2020で挿入したスタブ関数を経由して監視対象の関数の実行を監視することが可能となる。
【0023】
図7のステップ2020から2040ではスタブ関数をプログラム的に生成した.この場合、利用者が監視コードの振る舞いを細かく制御するためには監視命令挿入部11にこれに対応する機能を実装する必要がある。一方、監視対象のスタブ関数に利用者が記述したコードを利用すればこれを変形して挿入するだけでよい。任意の監視コード挿入を容易に実現できる。
【0024】
この手順について図8のフローを用いて説明する。図7で示した処理と異なるのはステップ2015の部分だけであるので、その部分だけを抜き出して説明する。まず、監視対象の関数の呼出規約を取得する(ステップ3000)。呼出規約とは、関数がどのような引数、返値を持つかなど、関数を呼び出す際に必要な規約である。次に得られた呼出規約を元に、スタブ関数のソースコードを生成する(ステップ3010)。これはファイルに出力しても良いし、GUI上にウィンドウを生成して出力しても良い。使用者はこのソースを必要に応じて修正し(ステップ3020)、ソースをコンパイルする(ステップ3030)。コンパイルのタイミングは、監視命令挿入部11が使用者による変更を検出して行っても良いし、使用者が行っても良い。コンパイルが終了したらコンパイルされたコードからスタブ関数として作成、コンパイルして部分を抽出しこれをスタブ関数として挿入する(ステップ3040)。最後に挿入したスタブ関数ゐ内容がプログラム実行に矛盾しないかをチェックして、必要なら修正する(ステップ3050)
前述した手順ではスタブのソース出力(ステップ3010)からソースのコンパイル(ステップ3030)を挿入時に行うように記したが、この処理を利用者がプログラム実行の前にあらかじめ行っておき、どの監視コードを挿入するかという情報を監視命令挿入制御部30から取得して、挿入時にはステップ3040,3050の処理だけを行うことで、高速化する方法も考えられる。あるいは、ステップ3000から3030までの処理を行う部分だけを別のプログラムとして実装することも可能である。
【0025】
また、前述の実施例では、1つの監視対象の関数に対して様々な種類の監視操作を行う場合に、1つのスタブ関数にそれらの複数の処理を既述するように既述した。次に一つの監視対象関数に対して、複数の監視コードを挿入する方式について説明する。
【0026】
図9にこの方式の概要を示した。図6に監視コードの挿入方法を図示したが、これは、スタブ関数を1つ使用する方式し、その中に監視コードを実装する方式である。一方、図9で示したのは、複数のスタブ関数としてスタブ関数Bと、スタブ関数Cの複数の関数を挿入する方法である(図9では2つの関数を挿入する例を示した)。この状態ではAに改名されたスタブ関数C(700)を呼び出すと、まず監視コードZ(612)が実行され、スタブ関数Bの呼出(704)が起こる。さらに、スタブ関数B(701)は改名された関数Aを呼び出し(705)、終了後に監視コードY(703)を実行する。このような構成でスタブ関数を入れ子で呼び出すことで複数の監視コードを1つの呼出で実行できる。
【0027】
図10にはこの関数Aに対して、どのスタブ関数を挿入するかを監視命令挿入制御部30に入力するテーブルの例である。この図では、監視対象の関数(801)と、挿入する関数の対応(802)が一行になっており、同一の監視対象関数に対して、複数の関数を挿入することが可能である。図では、関数Aに対して、スタブ関数Bとスタブ関数Cを挿入する場合の例を示した。この行の既述順序が挿入順、呼出順に反映するように実装することで、監視の精度を高めることが出来る。例えば、関数の実行時間の測定は出来るだけ監視対象の直前で行う必要があり、このような利用者の意図を反映できることで、監視の精度を高めることが可能となる。
【0028】
挿入処理は、一旦、監視対象の関数名に改名されたスタブを次の処理では監視対象と見なすことで、図4と図8のフローチャートがそのまま適用可能である。
【0029】
上記実施例では、ソースを生成してコンパイルする方法を示したが、より容易な方法として、例えばアセンブラ言語を使用してアセンブラで実行可能形式に変換してもよい。また、機械語あるいはインタブリタのバイトコードをユーザが入力し、このコードで監視実行する方式も考えられる。
【0030】
【発明の効果】
本発明によれば、監視するプログラムのソースコードやコンパイル作業をすることなくプログラム中の特定のあるいは全ての関数の実行を監視することができる。本発明を用いて(監視の必要な)特定の関数にだけ監視コードを挿入する場合には他の関数実行に負荷をかけずに監視を行うことができる。スタブ関数を挿入する方式を採用した場合には利用者の記述した任意の監視コードを挿入することができ、自由度の高い実行監視が可能となる。
【図面の簡単な説明】
【図1】本発明の一実施例における全体構成を示すブロック図。
【図2】プログラムファイルの構成を示す図。
【図3】関数テーブルの構成を示す図。
【図4】監視コード挿入の手順を示したフローチャート。
【図5】監視コードが挿入された関数の構成を示す図。
【図6】監視コード挿入の他の例を説明する図。
【図7】スタブ関数挿入方式による監視コード導入の手順を示すフローチャート
【図8】スタブ関数挿入方式による他の例の手順を示すフローチャート。
【図9】複数のスタブ関数を使用する場合の構成を示す図。
【図10】複数のスタブ関数を使用する場合の挿入順序指定方式を示す図。
【符号の説明】
10…プログラム実行部、11・‥監視命令挿入部、20…プログラム格納部、30…監視命令挿入制御部、41‥・監視コード、50・・・プログラムファイル、510…関数、520…実行コード、530…関数テーブル。
Claims (14)
- 複数の関数を含むプログラムを格納するプログラム記憶手段と、
上記記憶部から読み出したプログラムの関数が監視対象の関数であるかを判達する手段と、
監視対象の関数に対して監視処理が施されるようにプログラムに監視コードを挿入する監視コード挿入手段と、
監視コードが挿入された関数を実行して当該関数及び当該関数に対する監視処理を実行するプログラム実行手段とを備えたプログラム実行監視装置。 - 請求項1において、前記監視コード挿入手段は、監視する関数の先頭と、関数からの復帰をおこなう命令の直前に監視コードを挿入することを特徴とするプログラム実行監視装置。
- 請求項1において、前記監視コード挿入手段は、監視対象の関数を呼び出すためのアドレスあるいは関数の名称を変更し、前記監視コードと、名称の変更された関数を呼び出す命令を含む監視用関数を生成し、プログラムに前記監視用関数を挿入することを特徴とするプログラム実行監視装置。
- 請求項3において、前記監視コード挿入手段は、監視用に生成する関数のひな形のソースを生成して、利用者の修正を許した後コンパイルして得られるプログラムコードから監視用の関数を取り出し、これを監視用関数として使用することを特徴とするプログラム実行監視装置。
- 請求項1において、前記監視コードは複数の実行コードからなる監視用モジュール、他の監視コードライブラリを呼び出す関数呼び出しコードであることを特徴とするプログラム実行監視装置。
- 複数の関数を含むプログラムを格納するプログラム記憶部と、該記憶部からプログラムを読み出して実行するプログラム実行部とを備えるコンピュータにおけるプログラムの実行監視方法であって、
記憶部から読み出したプログラムの関数が監視対象の関数であるかを判定し、監視対象の関数に対して監視処理が施されるように当該プログラムに監視コードを挿入することを特徴とするプログラムの実行監視方法。 - 請求項6において、前記監視コードを挿入するステップにおいて、監視する関数の先頭と、関数からの復帰をおこなう命令の直前に監視コードを挿入することを特徴とするプログラム実行監視方法。
- 請求項6において、前記監視コードを挿入するステップは、監視対象の関数を呼び出すためのアドレスあるいは関数の名称を変更し、前記監視コードと、名称の変更された関数を呼び出す命令を含む監視用関数を生成し、プログラムに前記監視用関数を挿入することを特徴とするプログラム実行監視方法。
- 請求項8において、前記監視コードを挿入するステップは、監視用に生成する関数のひな形のソースを生成して、利用者の修正を許した後コンパイルして得られるプログラムコードから監視用の関数を取り出し、これを監視用関数として使用することを特徴とするプログラム実行監視方法。
- 請求項6において、前記監視コードは複数の実行コードからなる監視用モジュール、他の監視コードライブラリを呼び出す関数呼び出しコードであることを特徴とするプログラム実行監視方法。
- 請求項8において、前記監視コードを挿入するステップは、複数の監視用の関数を入れ子にして順番に呼び出すように挿入することで、複数の監視コードを1つの呼出で実行することを特徴とするプログラム実行監視方法。
- 請求項11において、監視用の関数を入れ子で挿入する際の順序を指定可能であることを特徴とするプログラム実行監視方法。
- 請求項3において、前記監視コードを挿入するステップは、複数の監視用の関数を入れ子にして順番に呼び出すように挿入することで、複数の監視コードを1つの呼出で実行することを特徴とするプログラム実行監視装置。
- 請求項13において、監視用の関数を入れ子で挿入する際の順序を指定可能であることを特徴とするプログラム実行監視装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003074805A JP2004164554A (ja) | 2002-09-24 | 2003-03-19 | プログラム実行監視装置および方法 |
US10/637,268 US7016807B2 (en) | 2002-09-24 | 2003-08-08 | Device and method for monitoring a program execution |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002276556 | 2002-09-24 | ||
JP2003074805A JP2004164554A (ja) | 2002-09-24 | 2003-03-19 | プログラム実行監視装置および方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004164554A true JP2004164554A (ja) | 2004-06-10 |
Family
ID=32774261
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003074805A Pending JP2004164554A (ja) | 2002-09-24 | 2003-03-19 | プログラム実行監視装置および方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US7016807B2 (ja) |
JP (1) | JP2004164554A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006004082A1 (ja) * | 2004-07-05 | 2006-01-12 | Infocom Corporation | ソフトウエアの一時的な修正方法およびプログラム |
JP2006268833A (ja) * | 2005-03-24 | 2006-10-05 | Microsoft Corp | 制限的な呼び出し規約を有するコードをインストルメントする方法 |
JP2007265190A (ja) * | 2006-03-29 | 2007-10-11 | Fujitsu Ltd | モジュール組込プログラム、モジュール組込装置およびモジュール組込方法 |
KR101441999B1 (ko) | 2009-07-30 | 2014-09-24 | 에스케이플래닛 주식회사 | 분리 실행 기반의 컨텐츠 분리 장치, 그 방법 및 그 방법이 기록된 컴퓨터로 판독 가능한 기록매체 |
CN110147324A (zh) * | 2019-04-28 | 2019-08-20 | 北京航空航天大学 | 一种嵌入式软件时间特性的在线测试设备及在线测试方法 |
Families Citing this family (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4123914B2 (ja) | 2002-11-26 | 2008-07-23 | 株式会社日立製作所 | プログラムの動作状態の監視方法及び監視プログラム |
US7620937B2 (en) * | 2004-08-20 | 2009-11-17 | Sap Ag | System and method for debugging programs |
GB0517357D0 (en) * | 2005-08-25 | 2005-10-05 | Corizon Ltd | User interface generation |
US7549085B2 (en) * | 2006-04-28 | 2009-06-16 | Hewlett-Packard Development Company, L.P. | Method and apparatus to insert special instruction |
US20090193392A1 (en) * | 2008-01-29 | 2009-07-30 | Michael David Downen | Dynamic intermediate language modification and replacement |
KR101126797B1 (ko) * | 2008-12-15 | 2012-03-29 | 한국전자통신연구원 | 센서 노드의 업데이트를 수행하는 업데이트 서버 및 센서 노드, 센서 노드의 업데이트 방법 |
US9355004B2 (en) | 2010-10-05 | 2016-05-31 | Red Hat Israel, Ltd. | Installing monitoring utilities using universal performance monitor |
US9256488B2 (en) * | 2010-10-05 | 2016-02-09 | Red Hat Israel, Ltd. | Verification of template integrity of monitoring templates used for customized monitoring of system activities |
US9524224B2 (en) | 2010-10-05 | 2016-12-20 | Red Hat Israel, Ltd. | Customized monitoring of system activities |
CN102650964B (zh) | 2011-02-28 | 2016-03-09 | 国际商业机器公司 | 用于监控面向对象的应用的方法、系统和自监控系统 |
CN102750135B (zh) * | 2011-04-20 | 2015-01-21 | 卡斯柯信号有限公司 | 一种基于隔离的软件设计方法 |
CN104641353B (zh) | 2012-09-21 | 2018-03-06 | 惠普发展公司,有限责任合伙企业 | 在连续部署的情况下可用的监视器 |
CN103516561B (zh) * | 2013-09-13 | 2017-11-28 | 汉柏科技有限公司 | 一种网络系统的调试方法 |
US9515901B2 (en) | 2013-10-18 | 2016-12-06 | AppDynamics, Inc. | Automatic asynchronous handoff identification |
US9535811B2 (en) | 2014-10-31 | 2017-01-03 | AppDynamics, Inc. | Agent dynamic service |
US9529691B2 (en) * | 2014-10-31 | 2016-12-27 | AppDynamics, Inc. | Monitoring and correlating a binary process in a distributed business transaction |
US9535666B2 (en) | 2015-01-29 | 2017-01-03 | AppDynamics, Inc. | Dynamic agent delivery |
FR3047585B1 (fr) * | 2016-02-09 | 2018-03-09 | Stmicroelectronics (Rousset) Sas | Procede et dispositif de surveillance de l'execution d'un code programme |
CN110781060A (zh) * | 2019-09-20 | 2020-02-11 | 平安普惠企业管理有限公司 | 函数监控方法、装置、计算机设备及存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH06314221A (ja) | 1993-05-06 | 1994-11-08 | Mitsubishi Electric Corp | コンパイル方式 |
JPH11184727A (ja) | 1997-12-24 | 1999-07-09 | Canon Inc | 情報処理装置及びその方法、コンピュータ可読メモリ |
JP3284956B2 (ja) * | 1998-01-26 | 2002-05-27 | 日本電気株式会社 | プログラム変換方法、プログラム変換装置及びプログラム変換プログラムを記憶した記憶媒体 |
US6718378B1 (en) * | 1999-04-30 | 2004-04-06 | Canon Kabushiki Kaisha | Device management information processing apparatus method and storage medium |
JP4267261B2 (ja) * | 2002-06-19 | 2009-05-27 | 富士通株式会社 | ストレージサービス方法、ストレージサービスプログラムおよびストレージ装置 |
-
2003
- 2003-03-19 JP JP2003074805A patent/JP2004164554A/ja active Pending
- 2003-08-08 US US10/637,268 patent/US7016807B2/en not_active Expired - Fee Related
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006004082A1 (ja) * | 2004-07-05 | 2006-01-12 | Infocom Corporation | ソフトウエアの一時的な修正方法およびプログラム |
JP2006268833A (ja) * | 2005-03-24 | 2006-10-05 | Microsoft Corp | 制限的な呼び出し規約を有するコードをインストルメントする方法 |
KR101247062B1 (ko) | 2005-03-24 | 2013-03-26 | 마이크로소프트 코포레이션 | 제한적인 호출 규칙을 갖춘 코드의 검사 방법 |
JP2007265190A (ja) * | 2006-03-29 | 2007-10-11 | Fujitsu Ltd | モジュール組込プログラム、モジュール組込装置およびモジュール組込方法 |
KR101441999B1 (ko) | 2009-07-30 | 2014-09-24 | 에스케이플래닛 주식회사 | 분리 실행 기반의 컨텐츠 분리 장치, 그 방법 및 그 방법이 기록된 컴퓨터로 판독 가능한 기록매체 |
CN110147324A (zh) * | 2019-04-28 | 2019-08-20 | 北京航空航天大学 | 一种嵌入式软件时间特性的在线测试设备及在线测试方法 |
Also Published As
Publication number | Publication date |
---|---|
US20040153825A1 (en) | 2004-08-05 |
US7016807B2 (en) | 2006-03-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2004164554A (ja) | プログラム実行監視装置および方法 | |
JP4901075B2 (ja) | コンピュータ読取可能な媒体、方法及びコンピューティングデバイス | |
US5987250A (en) | Transparent instrumentation for computer program behavior analysis | |
US8423982B2 (en) | Speculative compilation | |
US6161216A (en) | Source code debugging tool | |
KR101247062B1 (ko) | 제한적인 호출 규칙을 갖춘 코드의 검사 방법 | |
US7478366B2 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
JP2749528B2 (ja) | エラー解析用のトレーサシステム | |
Schlich et al. | Model checking C source code for embedded systems | |
US6874140B1 (en) | Debug annotations | |
US20040205720A1 (en) | Augmenting debuggers | |
US20130086424A1 (en) | Debugging analysis in running multi-user systems | |
US8527961B2 (en) | Expression-level debugging without format changes | |
Valente et al. | A semi-automatic approach for extracting software product lines | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
US6701518B1 (en) | System and method for enabling efficient processing of a program that includes assertion instructions | |
JP2004287869A (ja) | プログラム実行監視装置および方法 | |
Sousa et al. | Preventing atomicity violations with contracts | |
JP4055197B2 (ja) | プログラムに含まれる手続きの解析装置 | |
JP2009258796A (ja) | プログラム開発装置及びプログラム開発方法 | |
JP3745968B2 (ja) | 試験システム及び試験方法及び試験プログラム及び試験プログラムを記録した計算機で読み取り可能な記録媒体 | |
JP2007004516A (ja) | 組込みシステムのプログラムデバッグ方法 | |
JPH11110256A (ja) | プログラムデバッグ装置、プログラムデバッグ方法及びその方法を記録したコンピュータ読取り可能な記録媒体 | |
JPH1165885A (ja) | ソフトウェアディバッグ装置及びソフトウェアディバッグ方法 | |
JP2009064125A (ja) | サーバ装置、そのプログラム |