JP4125169B2 - ログ取得方法 - Google Patents
ログ取得方法 Download PDFInfo
- Publication number
- JP4125169B2 JP4125169B2 JP2003099465A JP2003099465A JP4125169B2 JP 4125169 B2 JP4125169 B2 JP 4125169B2 JP 2003099465 A JP2003099465 A JP 2003099465A JP 2003099465 A JP2003099465 A JP 2003099465A JP 4125169 B2 JP4125169 B2 JP 4125169B2
- Authority
- JP
- Japan
- Prior art keywords
- log
- function
- log acquisition
- module
- calling
- 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.)
- Expired - Fee Related
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/3636—Software debugging by tracing the execution of the program
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)
Description
【発明の属する技術分野】
本発明は、複数にモジュール分けされたソフトウェアの処理ログを取得するための技術に関するものである。
【0002】
【従来の技術】
従来より、再現率の低いソフトウェアの障害に対しては、ソフトウェアの処理ログを取得し、当該処理ログを解析することによって、障害の原因をつきとめ、その対策を講じてきた(例えば、特許文献1を参照)。
【0003】
【特許文献1】
特開平11−296415号公報
【0004】
【発明が解決しようとする課題】
しかし、上記従来の処理ログの取得には以下のような問題点がある。
(1)ユーザの動作環境でも処理ログを取得しつづけるためには、ソフトウェアのモジュール自体に手を加え、処理ログ取得ルーチンを追加しなければならず、処理ログ取得のための作業負荷が大きかった。
(2)処理ログ取得はモジュール毎に行うため、生成された処理ログはモジュール単位のものとなってしまい、ソフトウェア全体の処理を、完全に時間順の処理ログとして取得するのが困難である。このため、全体の処理ログとしての見通しが悪く、処理ログを解析して障害の原因を発見するまでのプロセスに工数がかかっていた。
【0005】
本発明は、上記課題を鑑みてなされたものであり、複数にモジュール分けされたソフトウェアの処理ログを容易に取得でき、かつ、ソフトウェアの障害の原因の解析のための工数を削減することが可能なログ取得方法、ならびに該方法をコンピュータによって実現させるためのプログラム、および該プログラムを格納した記憶媒体を提供することを目的とする。
【0006】
【課題を解決するための手段】
上記の目的を達成するために本発明に係るログ取得方法は以下のような構成を備える。即ち、
関数を記憶したダイナミックリンクライブラリと、該関数のアドレスを記憶したインポート関数アドレステーブルと、該ダイナミックリンクライブラリ内の関数を呼び出して実行する対象プログラムとを記憶するプログラム記憶手段と、プログラムを記憶する記憶媒体と、ログが記録されるログ記録手段と、特定のモジュールのリストを記憶したリスト記憶手段と、プログラムを実行する実行手段とを有し、前記実行手段が前記記憶媒体に記憶されたプログラムを実行することにより実現される書き換え手段と、呼び出し手段とを備えた情報処理装置において、前記対象プログラムの実行中のログを取得するログ取得方法であって、
前記書き換え手段が、前記対象プログラムの実行前に、前記ダイナミックリンクライブラリ内の各関数に対応するログ取得のための関数を当該ダイナミックリンクライブラリ内にロードし、前記インポート関数アドレステーブル上に記憶された各関数のアドレスを、対応する前記ログ取得のための関数のアドレスに書き換える工程と、
前記呼び出し手段が、前記対象プログラムが呼び出そうとする呼び出し対象の関数に対する前記インポート関数アドレステーブル上の書き換え後の前記対応するログ取得のための関数のアドレスに基づいて、前記ログ取得のための関数を呼び出して前記実行手段に実行させることで実現されるログ取得手段を起動する工程と、
前記ログ取得手段が、呼び出し元のモジュールが前記特定のモジュールのリストに含まれているか否かを判断する工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記呼び出し手段による呼び出しに関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記呼び出し手段により呼び出された前記ログ取得のための関数に対応する前記呼び出し対象の関数を呼び出して、該呼び出し対象の関数を前記実行手段に実行させ、実行結果を受け取る工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記実行結果に関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記実行結果を前記対象プログラムに渡す工程とを備える。
【0007】
【発明の実施の形態】
【第1の実施形態】
本実施形態は、あるモジュールから別のモジュール内に存在する関数の呼び出しが行われる際の仕組みである、メモリに保持されたインポート関数アドレス、または仮想関数アドレステーブル(Virtual Address Table)を利用して、モジュール間の関数呼び出しをフックして処理ログに記録することで、ソフトウェアのモジュール自体に手を加えることなく、ソフトウエア全体の処理を、時間順の処理ログとして取得することを可能にするものである。以下に具体的に説明する。
【0008】
<システム構成>
図1は、本発明の各実施形態にかかるログ取得方法を実現するコンピュータ(ソフトウェア評価システム)の構成をあらわす図である。説明を簡略化するために、本実施形態では、本ソフトウェア評価システムが1台のPC内部に構築されるものとするが、本発明にかかるログ取得方法は1台のPC内部に構築されるか、あるいは複数のPCにネットワークシステムとして構築されるかによらず有効である。
【0009】
本ログ取得方法を実現するソフトウェア評価システムには、CPU1、チップセット2、RAM3、ハードディスクコントローラ4、ディスプレイコントローラ5、ハードディスクドライブ6、CD−ROMドライブ7、ディスプレイ8が搭載されている。また、CPU1とチップセット2とを繋ぐ信号線11、チップセット2とRAM3とを繋ぐ信号線12、チップセット2と各種周辺機器とを繋ぐ周辺機器バス13、ハードディスクコントローラ4とハードディスクドライブ6とを繋ぐ信号線14、ハードディスクコントローラ4とCD−ROMドライブ7とを繋ぐ信号線15、ディスプレイコントローラ5とディスプレイ8とを繋ぐ信号線16が搭載されている。
【0010】
<関数処理に対する処理ログ取得>
本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理を説明するために、まず図2によって、複数のモジュールに分かれたソフトウェアが、通常の状態でどのようにメモリにロードされるかを説明する。
【0011】
通常、複数のモジュールに分かれたソフトウェアは、全体の制御を行う実行ファイルEXE(23)と、モジュールとして存在しEXEの補完的な役割を担うダイナミックリンクライブラリDLL(27)とに分かれており、メモリにはEXEとDLLの両方がロードされる。EXEはコードセグメント(28)とデータセグメント(29)、そしてインポート関数アドレステーブル(22)とから成っている。更に、インポート関数アドレステーブル(22)は、関数の所属するDLLによって分かれており(21,24)、DLLごとにそれぞれの関数がロードされたアドレスが書かれている(30〜35)。DLLの関数の実体は、DLLごとに分かれて(25,26)ロードされ、それぞれの関数は該当するDLLの一部としてロードされる(36〜41)。この図では、1本のEXEがA.DLL及びB.DLLの2つのダイナミックリンクライブラリ内の関数を使用している例を示しており、実際に使用される関数はFunc AA, FuncAB, Func AC, Func BA, Func BB, Func BCの6個となっている。
【0012】
EXEのコードセグメント内にあるコードが関数Func AAを呼び出す場合には、まずインポート関数アドレステーブル(22)内に書かれたFunc AAのアドレス(30)が読み込まれる。ここには実際にはA.DLLの一部として読み込まれたFunc AAコード(36)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはA.DLLのFunc
AAを呼び出すことができる。
【0013】
図3は、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのメモリ構成をあらわす図であり、図2とは、ログ取得用のコードに対してIAT Patch(Import Address Table Patch)という手法を用いて、関数呼び出しをリダイレクトしているという点で異なっている。
【0014】
ログ取得が開始されると、メモリ内にはIAT Patch用のDLLであるC.DLL(58)がロードされる。C.DLL(58)はインポート関数アドレステーブル(52)内に書かれた関数のアドレスを、C.DLL(58)内のログ取得コードであるFunc CAA, Func CAB, Func CAC, Func CBA, Func CBB, Func CBCのアドレスに書き換える(61〜66)。C.DLL(58)内のFunc CAA, Func CAB, Func CAC, Func CBA, Func CBB, Func CBCのコード(73〜78)は、ログを記録すると共に、元々の関数呼び出しを受けるべくメモリにロードされている、該当する関数であるFunc AA, Func AB, Func AC, Func BA, Func BB, Func BC(67〜72)を呼び出す。
【0015】
図4Aは、図3におけるIAT Patchの処理をあらわす図であり、図4Bはログ取得処理の流れを示すフローチャートである。説明を簡略化するために、この図ではEXEがA.DLL(55)内のFunc AAを呼び出す際に、IAT Patchによるログ取得コードがどのように動作するかの例をあらわしている。
【0016】
EXE(図4Aの91)がFunc AAをコールすると(図4Aの94)、C.DLL(58)内にあるログ取得コードがDLL名(C.DLL)/関数名(Func AA)をメモリに保存し(図4BのステップS402)、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、別メモリに保存する(図4Aの95、図4BのステップS403)。その後C.DLLは本来呼び出されるはずであった、A.DLL(図4Aの93)内のFunc AAをコールする(図4Aの96、図4BのステップS404)。A.DLLのFunc AA処理(図4Aの97)が終了し、C.DLLに制御がリターンすると(図4Aの98)、C.DLLはリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、別メモリに保存する(図4Aの99)。その後、C.DLLは保存したログ情報をファイルに書き込み(図4Aの100、図4BのステップS405)、あたかもA.DLLのFunc AAが通常通りに終了したかのように、EXEにリターンする(101)。
【0017】
図5は、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの機能構成をあらわす図である。通常は実行形式のEXE(113)が、DLL−1(116)やDLL−2(117)内の関数を呼び出すが、ここではAPIトレーサと呼ばれるログ取得コードを埋め込み(114)、処理ログを生成している(115)。APIトレーサは、DLL−1やDLL−2の関数定義を記述したファイル(111)と、どのDLLのどの関数のインポート関数テーブルを書き換えてログを取得するかの設定シナリオ(トレースシナリオ112)を元に動作する。
【0018】
<メソッド処理に対する処理ログ取得>
次に、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、実行ファイルEXEがCOM(Component Object Model)サーバでエクスポートされているインターフェースのインスタンス作成時に、どのようにメモリにロードされるかを説明するために、まず、図6によって、通常の状態でどのようにメモリにロードされるかを説明する。
【0019】
通常、インターフェースのインスタンス作成を行うと、COMサーバ内で、要求されたインターフェース(121,122)と、そのメソッド(:オブジェクト指向プログラミングにおいて、オブジェクトの実行する手続きを記述したプログラム、130〜135)が作成され、それらは、メモリ上に両方がロードされる。ここで、virtual address table(仮想アドレステーブル)は作成された各インターフェース毎に作られ(118,120)、作成要求を行ったEXEに渡される。このvirtual addres tableには各メソッドの作成されたアドレスが書かれている(124〜129)。EXEはこれら情報を利用し、各インターフェースに対して呼び出しを行う。この図では、1本のEXEがInterface A及びInterface Bの2つのインターフェースのインスタンスを作成しており、そのインターフェース内部のメソッドを使用している例を示しており、実際に使用されているメソッドは、Method AA, Method AB, Method AC, Method BA, Method BB, Method BCとなっている。
【0020】
EXEのコードが関数Method AAを呼び出す場合には、まずvirtual address table内に書かれたMethod AAのアドレス(124)が読み込まれる。ここには実際にはCOMサーバのInterface Aの一部として作成されたMethod AAコード(130)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはInterface AのMethod AAを呼び出すことができる。
【0021】
図7は、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのメモリ構成をあらわす図であり、図6とは、ログ取得用のコードに対してVTable Patch(virtual address table Patch)という手法を用いて、メソッド呼び出しをリダイレクトしているという点で異なっている。
【0022】
ログ取得が開始されると、メモリ内にはVTable Patch用のDLL(143)がロードされる。このDLLはvirtual address table(136,138)内に書かれたメソッドのアドレスを、DLL内のログ取得コードであるMethod A'A, Method A'B, Method A'C, Method B'A, Method B'B, Method B'Cのアドレスに書き換える(145〜150)。DLL内のMethod A'A, Method A'B, Method A'C, Method B'A, Method B'B, Method B'Cのコード(157〜162)は、ログを記録すると共に、元々のメソッド呼び出しを受けるべくメモリにロードされている、該当するメソッドであるMethod AA, Method AB,Method AC, Method BA, Method BB, Method BC(157〜162)を呼び出す。
【0023】
図8Aは、図7におけるVTable Patchの処理をあらわす図、図8Bはログ取得処理の流れを示すフローチャートである。説明を簡略化するために、この図ではEXEがCOMサーバ内のInterface AのMethodAAを呼び出す際に、VTable Patchによるログ取得コードがどのように動作するかの例をあらわしている。
【0024】
EXE(図8Aの163)がMethod AAをコールすると(図8Aの166)、DLL内にあるログ取得コードがモジュール名/インターフェース名/メソッド名をメモリに保存し(図8BのステップS802)、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、別メモリに保存する(図8Aの167、図8BのステップS803)。その後DLLは本来呼び出されるはずであった、COMサーバ(図8Aの165)内のMethod AAをコールする(図8Aの168、図8BのステップS804)。COMサーバのMethod AA処理(図8Aの169)が終了し、DLLに制御がリターンすると(図8Aの170)、DLLはリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、別メモリに保存する(図8Aの171)。その後、DLLは保存したログ情報をファイルに書き込み(図8Aの172、図8BのステップS805)、あたかもCOMサーバのMethodAAが通常通りに終了したかのように、EXEにリターンする(図8Aの173)。
【0025】
図9は、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの機能構成をあらわす図である。通常は実行形式のEXE(176)が、COMサーバ1(179)やCOMサーバ2(180)内のメソッドを呼び出すが、ここではAPIトレーサと呼ばれるログ取得コードを埋め込み(177)、処理ログを生成している(178)。APIトレーサは、COMサーバ1(179)やCOMサーバ2の関数定義を記述したファイル(174)と、どのCOMサーバのどのインターフェースのどのメソッドのvirtual address tableを書き換えてログを取得するかの設定シナリオ(175)を元に動作する。
【0026】
<実施例>
図10は、本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムに対して、それぞれの関数及びメソッドのパラメータの形式や、戻り値の形式を指示する、関数定義ファイルの例を示す図である。DLL/インターフェース名及び関数/メソッド名を記述し(「関数/メソッド」とは、「関数またはメソッド」の意、以下同じ)、その関数/メソッドに対する、パラメータ及び戻り値の型が示されている。本実施形態にかかるログ取得方法を実現するソフトウェア評価システムは、この関数定義ファイルによって指示された内容を元に、それぞれの関数/メソッドがどのようなパラメータ/戻り値を有しているかを判断し、その内容をログとして取得する。
【0027】
図11は、図10に示した関数定義ファイルを用いて、本発明の実施形態にかかるソフトウェア評価システムで取得した、ログの一例を示す図である。それぞれの呼び出しに対して、関数/メソッドが呼び出された時刻(In時刻、Out時刻)、及びその際のパラメータ/戻り値が、ログとして生成される。
【0028】
以上の説明から明らかなように、本実施形態にかかるログ取得方法によれば、複数にモジュール分けされたソフトウエアの処理ログの取得において、モジュール自体に変更を加えることなく、モジュール内に用意された関数/メソッドの呼び出しを処理ログとして記録することが可能となり、処理ログ取得のための作業負荷を低減することが可能となる。また、生成される処理ログは、時間順の処理ログとして取得することができ、処理ログの解析が容易となるため、ソフトウェアの障害の原因の解析のための工数を削減することが可能となる。
【0029】
【第2の実施形態(その1)】
上記第1の実施形態では、EXEによって呼び出される関数/メソッドすべてについて処理ログを取得することとした。しかしながら、この場合、取得される処理ログの数が膨大になってしまうことも考えられる。そこで、本実施形態ではEXEによって呼び出される関数/メソッドのうち、処理ログの取得対象を限定する場合について述べる。
【0030】
一般にソフトウェアのモジュール構成は、OS SurfaceによってOS部分のDLLとアプリケーション部分のDLLとに分けられる。図12は、一般的なソフトウェアのモジュール構成の一例を示す図である。同図において、1200はAPP.EXEであり、1201〜1203はそれぞれ、ModuleA.dll、ModuleB.dll、ModuleC.dllであり、アプリケーション部分のDLLである。一方、1205〜1210はそれぞれ、User32.dll、GDI32.dll、Ntdll.dll、Ws2_32.dll、Unidrv.dllであり、OS部分のDLLである。
【0031】
そこで、本実施形態では、このようなモジュール構成を備えるソフトウェアにおいて、アプリケーション部分のDLL内の関数が呼び出された場合のみ処理ログを取得することで処理ログの収集対象を限定する。
【0032】
図13は、オペレーティング・システムのモジュールを定義する例を示す図である。このモジュール定義をもって、図14に示した処理が行なわれる。
【0033】
図14は、本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【0034】
ステップS1400で処理が開始されると、まず、図13で示したオペレーティング・システムのモジュール定義1300を取得し、OSモジュールリストを保持する(ステップS1401)。続いて、関数/メソッドの呼び出し元のモジュールが、そのOSモジュールリストに存在するか否かを判別し(ステップS1402、S1403)、存在する場合は呼び出し先のモジュールをOSモジュールリストに追加する(ステップS1409)だけで、そのまま元の関数/メソッドを呼び出す(ステップS1410)。このステップS1409の処理により、更にそのモジュール以下の呼び出しが行われた場合でも、その呼び出しの処理ログを取得しない手段が確立されている。
【0035】
一方、ステップS1403においてOSモジュールリストに存在しない場合は、DLL名/インターフェース名/関数名/メソッド名/呼び出し時の時刻をHDDに保存し(ステップS1404)、その呼び出しに対してのパラメータをHDDに保存する(ステップS1405)。
【0036】
続いて、本体の関数/メソッドを呼び出す(ステップS1406)。関数/メソッド内部の処理が終了すると、DLL名/インターフェース名/関数名/メソッド名/終了時の時刻をHDDに保存し(ステップS1407)、その呼び出しに対してのパラメータ及び戻り値をHDDに保存する(ステップS1408)。続いて、関数/メソッドのリターン処理を行なう(ステップS1411)。この処理は、評価対象となるプログラムが終了するまで続行される(ステップS1412)。
【0037】
図15Aは、図14における処理によって取得された処理ログの例である。なお、比較のために図15BにOS部分のDLL内の関数が呼び出された際にも処理ログを取得することとした場合の例を示す。図15Aと図15Bとを対比することで明らかなように、図13におけるオペレーティング・システムのモジュール定義1300により、図15AではKernel32.dllからNtdll.dllに対する呼び出し、あるいはUser32.dllからWs2_32.dllに対する呼び出しといった、オペレーティング・システムの内部の処理ログも含めた処理ログが取得されていないため、よりサイズの小さい処理ログで解析することが可能となっている。
【0038】
以上の説明から明らかなように、本実施形態によれば、関数定義ファイルにおいて「オペレーティング・システムのサーフェイス」を指定することで、ソフトウェアに対する適切な処理ログが取得可能となり、バグ原因特定などの解析が可能となる。
【0039】
【第2の実施形態(その2)】
上記第2の実施形態(その1)においては、オペレーティング・システムのサーフェイス以下すべての処理ログを取得しない例を挙げたが、実際はサーフェイス以下の一部(OS部分のDLL)に関しても、処理ログを取得したい場合がある。
【0040】
例えば、上記第1の実施形態において示したログ取得方法を実現するためのプログラム(以下、「ログ取得プログラム」と称す)は、ドライバSDK(SDK=Software Development Kit)に組み込んで利用する場合ことが考えられる。
【0041】
一般にドライバSDK(例えばプリンタSDK)は周辺機器メーカ(プリンタメーカ)により提供されるが、ドライバSDKを用いるソフトウェア(例えば、プリンタに印刷する文書や画像を生成、編集するためのソフトウェア)は他のメーカが作成することが多い。このため、ソフトウェアがドライバSDK(プリンタSDK)を使用した際に正常に動作しなかった時は、その原因がドライバSDK(プリンタSDK)側のバグによるものなのか、ソフトウェア側のバグによるものなのかを判別することが重要となってくる。このようなケースにおいてはログ取得プログラムにより、プリンタSDKの処理内容を処理ログとして取得しておくことが重要となってくる。そのためには、Unidrv.dll(1210)などのOS部分のDLL内の関数を呼び出した場合の処理ログも収集対象としておく必要がある。
【0042】
つまり、処理ログの取得対象を限定するにあたっては、ログ取得プログラムの使用目的に応じて、任意に選択できるようにしておくことが望ましい。本実施形態では、かかる点に考慮したログ取得プログラムについて説明する。
【0043】
図16は、このような必要性に鑑みて、オペレーティング・システムの除外モジュール(ログ取得対象外として定義されるオペレーティング・システムのモジュールから除外するモジュール、つまり、ログ取得対象となるモジュール)を定義する例を示す図である。この除外モジュール定義及び図13に示したサーフェイス定義をもって、図17にあらわした処理が行なわれる。本実施形態では、サーフェイスから除外の指定をユーザが行なうことにより、上記のケースにおいてドライバの処理ログをソフトウェアの処理ログと併せて取得する。
【0044】
図17は、本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【0045】
ステップS1700において処理が開始されると、まず本ログ取得プログラムは、図13で示したオペレーティング・システムのモジュール定義1300を取得し、OSモジュールリストを保持する(ステップS1701)。続いて、図16で示した除外モジュール定義を取得し、除外モジュールリストを保持する(ステップS1702)。続いて、関数/メソッドの呼び出し元のモジュールが存在するかどうかを、OSモジュールリスト及び除外モジュールリストの両リストから検索する(ステップS1703)。
【0046】
続いて、呼び出し元のモジュールがOSモジュールリストに存在するか否かを判別し(ステップS1704)、存在する場合は、呼び出し元が除外モジュールであるかどうかを判別する(ステップS1705)。OSモジュールリストに存在し、且つ除外モジュールリストに存在しない場合、本ログ取得プログラムは、呼び出し先のモジュールをOSモジュールリストに追加する(ステップS1711)だけで、そのまま元の関数/メソッドを呼び出す(ステップS1712)。
【0047】
呼び出し元のモジュールが、ステップS1704においてOSモジュールリストに存在しない場合、及びステップS1705において除外モジュールリストに存在する場合は、DLL名/インターフェース名/関数名/メソッド名/呼び出し時の時刻をHDDに保存し(ステップS1706)、その呼び出しに対してのパラメータをHDDに保存する(ステップS1707)。
【0048】
続いて、本体の関数/メソッドを呼び出す(ステップS1708)。関数/メソッド内部の処理が終了すると、DLL名/インターフェース名/関数名/メソッド名/終了時の時刻をHDDに保存し(ステップS1709)、その呼び出しに対してのパラメータ及び戻り値をHDDに保存する(ステップS1710)。続いて、関数/メソッドのリターン処理を行なう(ステップS1713)。
【0049】
この処理は、評価対象となるプログラムが終了するまで(ステップS1714)続行される。
【0050】
このように「オペレーティング・システムのサーフェイス」及び「サーフェイスからの除外モジュール」を指定可能なAPIトレーサにより、ソフトウェアに対する適切な処理ログが取得可能となり、バグ原因特定などの解析が可能となる。
【0051】
【第2の実施形態(その3)】
上記第2の実施形態(その1)、(その2)において、図14のステップS1401、図17のステップS1701では、OSモジュールリストの取得をオペレーティング・システムが提供した情報によって自動的に取得することとしたがこれに限られない。また、「オペレーティング・システムが提供した情報」は、オペレーティング・システムが用意したインターフェースから取得するものでも構わないし、例えばWindows(登録商標) OSの場合、レジストリ情報でも構わない。
【0052】
また、図14に示した処理を行なうか、図17に示した処理を行なうかを、ユーザが明示的に選択できるようにしてもよい。。
【0053】
さらに、上記第2の実施形態(その2)では、あらかじめオペレーティング・システムの除外モジュールの定義がなされていることとしたが、図17のステップS1702において、ユーザが任意に指定できるようにしてもよい。
【0054】
【第3の実施形態(その1)】
上記第1の実施形態では、関数定義ファイルとして、DLL名/インターフェース名/関数名/メソッド名と、その関数/メソッドに対するパラメータ及び戻り値の型とを記述することとしたが(図10参照)、本発明にかかるログ取得方法を実現するソフトウェア評価システムにおける関数定義ファイルの記述は、これに限られない。本実施形態では、特殊な構造体データを含む関数として、DEVMODEを含む関数のログを取得する場合の、関数定義ファイルの記述方法と当該関数定義ファイルにおけるログ取得方法とについて説明する。
【0055】
DEVMODEとは、プリンタドライバのユーザインタフェースで設定できる印刷設定がどのように設定されているかを示すWindows(登録商標)の構造体のことをいい、DEVMODEにはOSが共通で定義している部分と、プリンタベンダが拡張して使用できる部分(拡張領域)とがある。そして、DEVMODEの最初に「拡張領域サイズ」が指定されている。このように拡張領域のサイズが指定されている場合には、DEVMODE構造体へのポインタがAPIトレーサのパラメータとして入力された場合、DEVMODEの標準領域(サイズ固定)の最後のアドレスから指定サイズ分だけデータ内容を読み出してログとして取得するように、関数定義ファイルに書き込むことで、DEVMODEを含む関数の処理ログを取得することが可能となる。以下に詳細に説明する。
【0056】
図18は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義ファイルの一例であり、一般的に広く用いられているIDLにより記述されている。本ソフトウェア評価システムに於いては、このIDLをトークン化したタイプライブラリファイルを関数定義ファイルとして使用する。なお、本実施形態は付加バイナリ情報取得のための定義手段を提供することを特徴とするものであり、関数定義ファイルはIDLでなくても構わない。例えば、通常のテキストファイルを用いることも可能であり、XMLなどのマークアップ言語を用いることも可能である。
【0057】
図19は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義ファイルを示す図であり、構造体へのポインタに対して付加バイナリ情報取得を指定することで、ポインタ・データの実体を処理ログとして取得すべく、IDLにより記述されている。
【0058】
TESTSTRUCT_WITHEXTRA構造体の定義に於いて、longcExtraBinaryDataに対してcustum(PAT_PARAM_ATTR_ID,"structsizeextra_is()")と宣言している(1901)。ここで、PAT_PARAM_ATTR_ID(1900)はIDLの中で本ソフトウェア評価システムが利用するための識別子である。ここで、" structsizeextra_is ()"と定義しておき、FuncStructsizeextra_is関数に引数をTESTSTRUCT_WITHEXTRA* lpParamと定義しておく(1902)ことにより、FuncStructsizeextra_is関数が実際に呼び出された際に、TESTSTRUCT_WITHEXTRA構造体の置かれたメモリ領域の先頭から、cExtraBinaryDataが指すサイズ分だけの、付加情報としてのバイナリデータを処理ログとして保存する。
【0059】
図20は、図19に示された関数定義による構造体が、どのようにメモリ上に配置されるかを表す図である。
【0060】
この図では、TESTSTRUCT_WITHEXTRA構造体(2000)が置かれたメモリの先頭アドレスの0x01F7B000であるとして説明する。1byteのデータであるchParam1(2001)は0x01F7B000に置かれ、4byteのデータであるcExtraBinaryDataSize(2002)は0x01F7B001に置かれ、1byteのデータであるchParam2(2003)は0x01F7B005に置かれ、1byteのデータであるchParam3(2004)は0x01F7B006に置かれている。
【0061】
ここまでは通常の構造体メモリ配置と同一であるが、TESTSTRUCT_WITHEXTRA構造体はchParam3に続くメモリ、すなわち0x01F7B007からの領域にExtraBinaryData(2005)という付加データを持っており、そのサイズがcExtraBinaryDataSizeに応じて可変となっている。例えば、cExtraBinaryDataSizeの値として8が入っている場合には、ExtraBinaryDataは8byte存在することになるため、TESTSTRUCT_WITHEXTRA構造体の最後尾のメモリアドレスは0x01F7B00Eとなる。このため、TESTSTRUCT_WITHEXTRA構造体の指し示すすべてのデータをログに取得するためには、このExtraBinaryDataを、cExtraBinaryDataSizeの値の分だけバイナリデータとして取得する必要がある。図19におけるstructsizeextra_isの定義は、この必要を満たすために記述されている。
【0062】
図21は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図19に示すように関数定義ファイルが記述されている時の処理ログを取得する場合の処理の流れを示すフローチャートである。
【0063】
処理が開始されると(ステップS2100)、ログ取得を開始し、モジュール名/インターフェース名/関数名/メソッド名をHDDに保存する(ステップS2101)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS2102)。そして、関数定義にstructsizeextra_isの設定が存在するかどうか、すなわちstructsizeextra_isの定義を含んだ構造体がパラメータに存在するか否かを判別し(ステップS2103)、存在する場合には、まずその定義を含む構造体のサイズを計算する(ステップS2104)。
【0064】
続いて、構造体の先頭ポインタから計算した構造体サイズの分だけずれたメモリ領域から、structsizeextra_isで示されたメンバの値によって示されるサイズ分だけ、データをHDDに保存する(ステップS2105)。続いて、元の関数/メソッドを呼び出す(ステップS2106)。
【0065】
関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS2107)。そして、関数定義にstructsizeextra_isの設定が存在するかどうか、すなわちstructsizeextra_isの定義を含んだ構造体がパラメータ/戻り値に存在するか判別し(ステップS2108)、存在する場合には、その定義を含む構造体のサイズを計算する(ステップS2109)。続いて、構造体の先頭ポインタから計算した構造体サイズの分だけずれたメモリ領域から、structsizeextra_isで示されたメンバの値によって示されるサイズ分だけ、データをHDDに保存する(ステップS2110)。この処理はユーザから終了の命令により終了する(ステップS2111)。なお、structsizeextra_isで指定されたメンバが複数にわたる場合は、当然ステップS2104〜ステップS2105及びステップS2109〜ステップS2110の処理が指定された数すべてに対して行なわれる。
【0066】
図22は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図19の関数定義ファイルにより取得された処理ログを示す図である。
【0067】
ここでは処理ログはテキスト部分(2200)とバイナリ部分(2201)とに分けて表示しており、テキストデータに書き込まれたDataIDが、バイナリ部分に書き込まれたDataIDに対応している。例えば、一度目の呼び出しのログではDataIDが0x0001であるが、このIDがバイナリ部分に書き込まれた付加バイナリ情報、DataID=0x0001を指し示している。この場合、FuncStructsizeextraIsの1度目の呼び出しでは8バイト、2度目の呼び出しでは40バイト、3度目の呼び出しでは5バイト、4度目の呼び出しでは7バイトの付加バイナリデータが取得されている。structsizeextra_isの定義を行なわない場合には、chParam1及びcExtraBinaryDataSize及びchParam2及びchParam3のみが取得されるが、structsizeextra_isの定義を行なうことにより、付加バイナリデータであるExtraBinaryDataを、それぞれの呼び出しに応じたサイズ分、処理ログに取得することが可能となっている。
【0068】
このように、構造体のメンバに応じた処理ログ取得のための関数定義手段を設けることにより、通常では取得しきれないデータを、バイナリデータとして処理ログに取得することが可能となる。
【0069】
【第3の実施形態(その2)】
上記第3の実施形態(その1)では、特定の構造体の最後尾のアドレスから所定サイズ分のデータを処理ログとして取得するための関数定義ファイルの記述方法と、その場合のログ取得プログラムの処理について述べたが、本発明にかかるログ取得方法を実現するソフトウェア評価システムにおける関数定義ファイルの記述方法はこれに限られない。
【0070】
図23は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義ファイルを示す図であり、構造体へのポインタに対してメンバをオフセットとして指定することで、ポインタ・データの実体をログとして取得すべく、IDLにより記述されている。
【0071】
TESTSTRUCT_WITHPTRDIFF構造体の定義に於いて、LPSTR lpszString及びlong nNumberに対してcustum(PAT_PARAM_ATTR_ID, " ptrdiff ()")と宣言している(2301、2302)。ここで、PAT_PARAM_ATTR_ID(2300)はIDLの中で本ソフトウェア評価システムが利用するための識別子である。ここで、" ptrdiff ()"と定義しておき、FuncPtrdiff関数に引数をTESTSTRUCT_WITHPTRDIFF* lpParamと定義しておく(2303)ことにより、FuncPtrdiff関数が実際に呼び出された際に、TESTSTRUCT_WITHPTRDIFF構造体の置かれたメモリ領域の先頭から、lpszString及びnNumberの数値によって表されるオフセットだけずれたメモリ領域に格納された、LPSTR及びlongのデータを処理ログとして保存する。
【0072】
ptrdiff()の宣言は、以下の2つの条件定義を兼ねている。
(1)ptrdiff()で指定された引数は、実際には規定された型ではなく、構造体の先頭アドレスに対するオフセットを表す数値として扱われること。
(2)そのオフセットの指し示すメモリエリアに、規定された型のデータが保持されていること。
【0073】
図24は、図18に示された関数定義による構造体が、どのようにメモリ上に配置されるかを表す図である。
【0074】
この図では、TESTSTRUCT_WITHPTRDIFF構造体(2400)が置かれたメモリの先頭アドレスの0x01F7B000であるとして説明する。1byteのデータであるchParam1(2401)は0x01F7B000に置かれ、4byteのデータであるlpszStringへのオフセット(2402)は0x01F7B001に置かれ、4byteのデータであるnNumberへのオフセット(2403)は0x01F7B005に置かれ、1byteのデータであるchParam2(2404)は0x01F7B009に置かれている。TESTSTRUCT_WITHPTRDIFF構造体において、lpszStringの実体はオフセット(2402)によって示されたサイズ分、構造体の先頭アドレスからずらした領域に格納されており(2405)、nNumberの実体はオフセット(2403)によって示されたサイズ分、構造体の先頭アドレスからずらした領域に格納されている(2406)。このため、TESTSTRUCT_WITHPTRDIFF構造体の指し示すすべてのデータを処理ログに取得するためには、これらlpszString及びnNumberに関して、実体のデータをログとして取得する必要がある。図23におけるptrdiffの定義は、この必要を満たすために記述されている。
【0075】
図25は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図23に示すように関数が定義されている時のログを取得する場合の処理の流れを示すフローチャートである。
【0076】
処理が開始されると(ステップS2501)、ログ取得を開始し、モジュール名/インターフェース名/関数名/メソッド名をHDDに保存する(ステップS2502)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS2503)。そして、関数定義ファイルにptrdiffの設定が存在するかどうか、すなわちptrdiffの定義を含んだ構造体がパラメータに存在するか否かを判別し(ステップS2504)、存在する場合には、構造体の先頭アドレスとptrdiffで定義された構造体メンバのオフセットの値を合算し、ptrdiffで定義された構造体メンバがどのアドレスに格納されているかを計算する(ステップS2505)。続いて、計算したアドレスの指し示すメモリ領域から、ptrdiffで示されたメンバの型のデータをHDDに保存する(ステップS2506)。続いて、元の関数/メソッドを呼び出す(ステップS2507)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS2508)。そして、関数定義ファイルにptrdiffの設定が存在するかどうか、すなわちptrdiffの定義を含んだ構造体がパラメータ/戻り値に存在するか否かを判別し(ステップS2509)、存在する場合には、構造体の先頭アドレスとptrdiffで定義された構造体メンバのオフセットの値を合算し、ptrdiffで定義された構造体メンバがどのアドレスに格納されているかを計算する(ステップS2510)。続いて、計算したアドレスの指し示すメモリ領域から、ptrdiffで示されたメンバの型のデータをHDDに保存する(ステップS2511)。この処理はユーザから終了の命令により処理を終了する(ステップS2512)。なお、ptrdiffで指定されたメンバが複数に渡る場合は、当然ステップS2505〜ステップS2506及びステップS2510〜ステップS2511の処理が指定された数すべてに対して行なわれる。
【0077】
図26は、本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図23の関数定義ファイルにより取得された処理ログを示す図である。それぞれの呼び出しでオフセットが異なっているが、本ソフトウェア評価システムは、オフセットで指し示された実体を的確に処理ログとして取得している。
【0078】
以上の説明から明らかなように、本実施形態によれば、構造体のメンバに応じたログデータ取得のための定義手段を設けることにより、通常では取得しきれないデータを含む関数/メソッドであっても、処理ログを取得することが可能となる。
【0079】
【第4の実施形態(その1)】
上記第1の実施形態では、関数定義ファイルとして、DLL名/インターフェース名/関数名/メソッド名と、その関数/メソッドに対するパラメータ及び戻り値の型とを記述することとしたが(図10参照)、本発明にかかるログ取得方法を実現するソフトウェア評価システムにける関数定義ファイルの記述は、これに限られない。本実施形態では、特殊なCOMに対してログを取得する場合の、関数定義ファイルの記述方法について説明する。
【0080】
一般に、プリンタドライバには、OSに予め組み込まれているUNIDRIVER(ユニドライバ)を用いる場合と、モノレシックドライバを用いる場合とがある。そして、プリンタベンダーはモノレシックドライバ、またはユニドライバからの出力を受け取るプラグインモジュール(*.drv)を提供している。モノレシックドライバの場合は、GDI32.dllは一般的なDDI関数を用いる。
【0081】
ここで、DLL同士は、レジストリに登録されているAPIを用いてデータのやり取りを行うが、ユニドライバがプリンタベンダが提供するプラグインモジュールに出力する処理内容は、レジストリに登録されていないCOM(object−API)である。このため、上記第1の実施形態において示した関数定義ファイルでは、特殊なCOMについての処理ログを取得することができない。そこで、本実施形態ではユニドライバが吐き出すレジストリに登録されていないCOMを通常のCOMとして扱うように関数定義ファイルを記述することで適切なログを取得することとする。
【0082】
図27は、本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、それぞれの関数/メソッドのパラメータの形式や、戻り値の形式を指示する関数定義ファイルの例であり、一般的に広く用いられているIDLにより記述されている。DLL名/インターフェース名/関数名/メソッド名を記述し、その関数/メソッドに対する、パラメータ/戻り値の型が示されている。本発明の第4の実施形態にかかるソフトウェア評価システムに於いては、このIDLをトークン化したタイプライブラリファイルを関数定義ファイルとして使用する。なお、本実施形態は、より詳細な情報取得のための関数定義手段を提供することを特徴とするものであり、関数定義ファイルはIDLにより記述されていなくても構わない。例えば、通常のテキストファイルを用いることも可能であり、XMLなどのマークアップ言語を用いることも可能である。
【0083】
本発明の第4の実施形態にかかるソフトウェア評価システムは、この関数定義ファイルによって指示された内容を元に、それぞれの関数/メソッドがどのようなパラメータ/戻り値を有しているかを判断し、その内容をログとして取得する。なお、本実施形態では、Interface testに実装されたDllGetClassObjectという名前の関数が、以下のようなパラメータを持つ状態を例としている。
(1)入力パラメータの"rclsid"、すなわち「クラスID」をあらわすパラメータ。
(2)入力パラメータの"riid"、すなわち「リファレンス・インターフェースID」をあらわすパラメータ。
(3)出力パラメータの"ppv"、すなわち、上記2つの入力パラメータを元に得られた、実体としてのインターフェースポインタ。
【0084】
DLL内にコードとして記述されたInterface内のメソッドを、EXEが呼び出すためには、先にDllGetClassObject関数を用いて、クラスID及びリファレンス・インターフェースIDを元にしたInterfaceのインスタンスを生成し、そのインスタンスのメモリアドレスを知っておく必要がある。
【0085】
図27に示された"iid_is"(2703)が、本実施形態の特徴を最もよくあらわすものである。すなわち、iid_isに第二引数であるriidを指定することで「この出力パラメータは、実際にはvoid * ではなく、riidに指定された型のインターフェースである」という定義を行なっている。この定義をAPIトレーサが認識することにより、従来取得できなかった「ppvで返ってきたインターフェース内に実装されたメソッドの呼び出し」に関しても、詳細が処理ログとして取得できるようになっている。
【0086】
図28は、riidに指定するインターフェース型を定義した、関数定義ファイルの例である。ここでは、IUnknownという名前のインターフェースから派生した、IGetInfoというインターフェースを定義している。IGetInfoには、GetName及びFreeNameBufferという2つのメソッドが実装されている。
【0087】
図29は、本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【0088】
処理が開始されると(ステップS2900)、設定された関数/メソッドが呼び出される都度に、DLL名/インターフェース名/関数名/メソッド名/呼び出し時の時刻をHDDに保存し(ステップS2901)、その呼び出しに対してのパラメータをHDDに保存する(ステップS2902)。続いて、入力パラメータの関数定義ファイルに、図27によって説明したiid_is、すなわち「リファレンス・インターフェースIDの定義」があるかどうかを判別し(ステップS2903)、存在する場合は、そのリファレンス・インターフェースIDを、メモリ上の別のエリアに保存しておく(ステップS2904)。
【0089】
本体の関数/メソッドを呼び出し(ステップS2905)、メソッド内部の処理が終了すると、DLL名/インターフェース名/関数名/メソッド名/終了時の時刻をHDDに保存し(ステップS2906)、その呼び出しに対してのパラメータ及び戻り値をHDDに保存する(ステップS2907)。
【0090】
次に、出力パラメータがインターフェースへのポインタとして定義されているかどうかを、図27に示した関数定義ファイルに基づいて判断し(ステップS2908)、定義されている場合は、リファレンス・インターフェースIDがメモリ上に保存されているかどうかを判断する(ステップS2909、ステップS2910)。リファレンス・インターフェースIDが保存されていない場合には、その出力パラメータをインターフェースそのものへのポインタとして認識し、メモリ上にそのポインタに対するログ取得コードを生成して(ステップS2911)、該当するパラメータ/戻り値を、ログ取得コードのメモリアドレスに書き換える(ステップS2912)。リファレンス・インターフェースIDが保存されている場合、その出力パラメータを、リファレンス・インターフェースIDがあらわすインターフェースへ派生した形のポインタ、例えば図28に示したIGetInfoとして認識し、メモリ上にそのポインタに対するログ取得コードを生成して(ステップS2913)、該当するパラメータ乃至戻り値を、ログ取得コードのメモリアドレスに書き換える(ステップS2914)。
【0091】
ステップS2912またはステップS2914の処理が終了するか、もしくはステップS2908においてインターフェースポインタとして定義されていないことを判断した場合は、関数/メソッドのリターン処理を行なう(ステップS2915)。
【0092】
この処理は、評価対象となるプログラムが終了するまで(ステップS2916)続行される。
【0093】
図30は、図29における処理によって取得された処理ログの例である。図27におけるiid_isの定義により、DllGetClassObjectの出力パラメータppvをIGetInfo型のインターフェースとして認識した結果、DllGetClassObjectのログだけでなく、IGetInfoインターフェース内に実装されたメソッドの呼び出しに関しても、処理ログとして取得することが可能となっている。なお本実施形態は、リファレンス・インターフェースIDを認識することを特徴とするものであり、実際のリファレンス・インターフェースID(3001)とIGetInfoとの関連付けは、公知の技術を元に行なわれる。例えば、Windows(登録商標) OSにおいては、この情報はレジストリに置かれており、レジストリ情報を元に関連付けが可能である。ただし、他の方法を用いて関連付けを行なっても構わない。
【0094】
以上の説明から明らかなように、本実施形態によれば、関数定義ファイルとして、「ある入力パラメータが、出力パラメータの型をあらわす」ことを指定することにより、ソフトウェアに対する更に詳細な処理ログを取得することが可能となり、バグ原因特定など、より詳細な解析が可能となる。
【0095】
【第4の実施形態(その2)】
上記第4の実施形態(その1)においては、実体すなわちインスタンスとしてのインターフェースの解決を行なっているが、これだけでは「インスタンスを生成する元となっている情報」すなわち、オブジェクト指向プログラミングにおける「クラス情報」に基づいた情報を、処理ログとして取得できない。そこで本実施形態では、クラス情報を追加情報として処理ログに取得するために、クラスIDをインターフェースIDと関連付ける場合について説明する。
【0096】
本実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける関数定義ファイルでは、クラスIDは、図27におけるDllGetClassObjectのrclsidをもって定義し、その定義のために「clsid_is」という関数定義を用いる。この「clsid_is」とは、「このDllGetClassObjectにおいては、clsid_isで指定されたパラメータをクラスIDとするクラス情報を元にしてインターフェースのインスタンスが生成されている」ということを指定するための関数定義である。このように関数定義ファイルを記述することにより、本実施形態にかかるソフトウェア評価システムは、より詳細な情報をログとして取得することが可能となっている。
【0097】
図31及び図32は、本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートであり、図29とは別の一例である。
【0098】
処理が開始されると(ステップS3100)、設定された関数/メソッドが呼び出される都度に、DLL名/インターフェース名/関数名/メソッド名/呼び出し時の時刻をHDDに保存し(ステップS3101)、その呼び出しに対してのパラメータをHDDに保存する(ステップS3102)。続いて、入力パラメータの関数定義ファイルに、図27及び上記によって説明したclsid_is、すなわち「クラスIDの定義」があるかどうかを判別し(ステップS3103)、存在する場合は、そのクラスIDをメモリ上の別のエリアに保存しておく(ステップS3104)。続いて、入力パラメータの関数定義ファイルに、図27によって説明したiid_is、すなわち「リファレンス・インターフェースIDの定義」があるかどうかを判別し(ステップS3105)、存在する場合は、そのリファレンス・インターフェースIDをメモリ上の別のエリアに保存しておく(ステップS3106)。
【0099】
本体の関数/メソッドを呼び出し(ステップS3107)、メソッド内部の処理が終了すると、DLL名/インターフェース名/関数名/メソッド名/終了時の時刻をHDDに保存し(ステップS3108)、その呼び出しに対してのパラメータ/戻り値をHDDに保存する(ステップS3109)。次に、出力パラメータがインターフェースへのポインタとして定義されているかどうかを、図27に示した関数定義ファイルに基づいて判断し(ステップS3110)、定義されている場合は、リファレンス・インターフェースIDがメモリ上に保存されているかどうかを判断する(図32のステップS3200、S3201)。リファレンス・インターフェースIDが保存されていない場合、その出力パラメータを、インターフェースそのものへのポインタとして認識し、メモリ上にそのポインタに対するログ取得コードを生成して(ステップS3203)、該当するパラメータ/戻り値を、ログ取得コードのメモリアドレスに書き換える(ステップS3204)。リファレンス・インターフェースIDが保存されている場合、その出力パラメータをリファレンス・インターフェースIDがあらわすインターフェースへ派生した形のポインタ、例えば図28に示したIGetInfoとして認識し、メモリ上にそのポインタに対するログ取得コードを生成して(ステップS3205)、該当するパラメータ/戻り値を、ログ取得コードのメモリアドレスに書き換える(ステップS3206)。
【0100】
ステップS3204またはステップS3206の処理が終了すると、メモリにクラスIDが保存されているかを判別し(ステップS3207)、保存されている場合は、保存されたクラスIDをログ取得コードと関連付けてメモリに保持しておく(ステップS3208)。続いて、関数/メソッドのリターン処理を行なう(図31のステップS3112)。この処理は、評価対象となるプログラムが終了するまで(ステップS3113)続行される。
【0101】
ステップS3208においてクラスIDを保持しておくことにより、IGetInfo内の関数が呼ばれた際に、そのクラス情報を元に、ステップS3101においてより詳細な情報をログに取得することが可能となる。図33は、図30に対して、クラスIDを元にモジュール名が追加でログ取得可能となっていることをあらわしている(3303、3304、3305、3306)。
【0102】
なお本実施形態は、クラスIDをインターフェース・パラメータと関連付けつつ、リファレンス・インターフェースIDを認識することを特徴とするものであり、実際のクラスID(3000)と、モジュール名等詳細情報との関連付けは、公知の技術を元に行なわれる。例えば、Windows(登録商標) OSにおいては、この情報はレジストリに置かれており、レジストリ情報を元に関連付けが可能である。が、他の方法を用いて関連付けを行なっても構わない。
【0103】
以上の説明から明らかなように、本実施形態によれば、関数定義ファイルにおいて「ある入力パラメータが、出力パラメータの型をあらわす」ことを指定することにより、ソフトウェアに対する更に詳細な処理ログを取得することが可能となり、バグ原因特定など、より詳細な解析が可能となる。
【0104】
【第5の実施形態(その1)】
上記第4の実施形態によれば、特殊なCOMに対するログを取得することが可能となるが、かかる特殊なCOMの場合、処理ログの対象となるモジュール名がレジストリに定義されていないため、モジュール名に基づいて処理ログを取得することができない。そこで、本実施形態では個々のインターフェース名(COMの処理内容)に対するモジュール名を追加定義として用意し、処理ログを作成する際にインターフェース名からモジュール名を判断して書き込むこととする。
【0105】
図34は、本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける関数定義ファイルの一例であり、一般的に広く用いられているIDLにより記述されている。本ソフトウェア評価システムに於いては、このIDLをトークン化したタイプライブラリ・ファイルを関数定義ファイルとして使用する。
【0106】
IDLはインターフェースの定義に用いられるものであり、標準ではモジュール名の定義は不可能である。例えば、複数のモジュールが、同じインターフェース定義でインターフェースを提供しており、それらが選択的にプラグイン・モジュールとして用いられている場合、インターフェース定義を行なっても、それらのインターフェースがどのプラグイン・モジュールに属するものであるかは、それらプラグイン・モジュールを選択的に呼び出しているモジュールのみが知り得る。例えば、オペレーティング・システムが選択的にドライバ用のプラグイン・モジュールを呼び出している場合、オペレーティング・システムが選択を行なうアルゴリズムが公開されていない場合は、モジュール名を関連付けて呼び出しに関する詳細情報を処理ログに取得することは不可能である。具体的には、Microsoft Windows(登録商標)オペレーティング・システムに搭載されている、ユニバーサル・プリンタドライバのプラグイン・モジュールなどが考えられる。
【0107】
ただし、これらのプラグイン・モジュールは、ユーザの操作に関連付けられて選択的に呼び出されているケースが多い。例えば、プリンタドライバにおいては、複数搭載されたプリンタのうち、ユーザがどのプリンタで出力するのかを選択して、その選択操作に対して1対1に対応するプラグイン・モジュールが呼び出される。この場合、IDLによるインターフェース定義とは別途「今回の操作に対してはこのモジュールが呼び出される」ということを知り得て、尚且つその情報を、ログ取得プログラムに対し指示する手段があれば、その手段を用いて、上記プラグイン・モジュールのモジュール名も含めた形の処理ログを取得することが可能となる。
【0108】
図35は、ライブラリ名に対してモジュール名を定義した関数定義ファイルの例であり、3500でライブラリ名を、3501でモジュールの置かれているフォルダ名を、3502でモジュール名をそれぞれ定義している。
【0109】
図36は、インターフェース名に対してモジュール名を定義した関数定義ファイルの例であり、3600でインターフェース名を、3601でモジュールの置かれているフォルダ名を、3602でモジュール名をそれぞれ定義している。
【0110】
なお、本実施形態では、図35乃至図36におけるモジュール名の追加定義を、単なるテキストファイルで示しているが、本実施形態はIDLのような「DLL/インターフェース/関数/メソッドを定義するための標準フォーマット」に対して別のフォーマットの追加定義を行ない、それを元に関数/メソッドのログを取得することを特徴とするものであり、追加定義は単なるテキストファイルではなく、HTMLやXMLといったマークアップ言語で記述されていても構わない。
【0111】
図37は、本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートであり、本実施形態の特徴を最もよくあらわすものである。
【0112】
処理が開始されると(ステップS3700)、設定された関数/メソッドが呼び出される都度に、DLL名/インターフェース名/関数名/メソッド名/呼び出し時の時刻をHDDに保存し(ステップS3701)、その呼び出しに対してのパラメータをHDDに保存する(ステップS3702)。続いて、入力パラメータの関数定義ファイルに、図35乃至図36によって説明した、モジュール名の追加定義が存在するかどうかを判別し(ステップS3703)、存在する場合は、そのモジュール名をメモリ上の別のエリアに保存しておく(ステップS3704)。
【0113】
本体の関数/メソッドを呼び出し(ステップS3705)、メソッド内部の処理が終了すると、DLL名/インターフェース名/関数名/メソッド名/終了時の時刻をHDDに保存し(ステップS3706)、その呼び出しに対してのパラメータ及び戻り値をHDDに保存する(ステップS3707)。続いて、関数/メソッドのリターン処理を行なう(ステップS3708)。
【0114】
この処理は、評価対象となるプログラムが終了するまで(ステップS3709)続行される。
【0115】
このように、モジュール名を関数定義とは別のフォーマットで追加定義して、それを元に処理ログの取得を行なうことにより、例えばプラグイン・モジュールがユーザの操作に関連付けられて選択的に呼び出されているケースに対して、プラグイン・モジュールのモジュール名も含めた形の処理ログを取得することが可能となる。この機能を持つAPIトレーサにより、ソフトウェアに対してモジュール名を必ず含んだ形での処理ログが取得可能となり、バグ原因特定など、より詳細な解析が可能となる。
【0116】
【第5の実施形態(その2)】
上記第5の実施形態(その1)においては、モジュール名の追加定義をテキストファイルで行なっているが、これに限られず、モジュール定義をユーザが選択できるようなユーザー・インターフェースを備えてもよい。実現方法としては、図35乃至図36におけるPath及びModuleNameの設定を、ユーザが選択可能なユーザー・インターフェースを備えても構わないし、全体のモジュール名追加定義テキストファイルを複数用意して、それらのファイルを選択するユーザ・インターフェースを備えても構わない。
【0117】
【第5の実施形態(その3)】
上記第5の実施形態(その1)および(その2)においては、モジュール名の追加定義を、ユーザが指定乃至選択しているが、これに限られず、追加のモジュール定義をオペレーティング・システムが備えるインターフェースから取得しても構わない。例えば、Microsoftの.NET Frameworkでは、各モジュールがXML形式のモジュール定義データを含み、モジュール定義データをオペレーティング・システムのインターフェースで取得できる。また、この場合に、オペレーティング・システムから取得したモジュール定義に示されたモジュールに対して、インポート関数アドレステーブル及びエクスポート関数アドレステーブルなどの、モジュール内部に用意されたヘッダ情報を元に、メモリ上でそのモジュール内に実装された関数/メソッドをログ取得ルーチンにリダイレクトして、更にログ情報を詳細に取得することも可能である。例えば、MicrosoftのWindows(登録商標)オペレーティング・システムでは、この機能によって、通常のDLLに実装されたエクスポート関数の呼び出し、COMインターフェースに実装されたメソッドの呼び出し、.NETアセンブリに実装されたメソッドの呼び出しの3点について、1つのログデータ内に時系列ですべての情報を並べることが可能である。
【0118】
【他の実施形態】
なお、本発明は、複数の機器(例えばホストコンピュータ,インタフェイス機器、リーダ、プリンタなど)から構成されるシステムに適用しても、一つの機器からなる装置(例えば、複写機、ファクシミリ装置など)に適用してもよい。
【0119】
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ(またはCPUやMPU)が記憶媒体に格納されたプログラムコードを読出し実行することによっても、達成されることは言うまでもない。
【0120】
この場合、記憶媒体から読出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。
【0121】
プログラムコードを供給するための記憶媒体としては、例えば、フロッピ(登録商標)ディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、CD−R、磁気テープ、不揮発性のメモリカード、ROMなどを用いることができる。
【0122】
また、コンピュータが読出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているOS(オペレーティングシステム)などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【0123】
さらに、記憶媒体から読出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【0124】
以下に本発明の実施態様の例を示す。
【0125】
[実施態様1] 所定の処理を行う関数を備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に呼び出されるオペレーティングシステム内の関数のうち、指定された関数を識別する工程と、
ロードされた前記所定の処理を行う関数のアドレスと前記指定されたオペレーティングシステム内の関数のアドレスとを、ログ取得のための関数のアドレスに書き換える工程と、を備え、
前記ログ取得のための関数は、
前記所定の処理を行う関数および前記指定されたオペレーティングシステム内の関数を呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
前記所定の処理を行う関数および前記指定されたオペレーティングシステム内の関数を呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と
を備えることを特徴とするログ取得方法。
【0126】
[実施態様2] 前記所定の処理を行う関数および前記指定されたオペレーティングシステム内の関数を呼び出す際の所定の情報は、少なくとも、呼び出された関数の関数名、呼び出す際の時刻、呼び出す際のパラメータ、または呼び出す際のポインタ・パラメータの指すメモリ内容のいずれかを備えることを特徴とする実施態様1に記載のログ取得方法。
【0127】
[実施態様3] 前記実行結果を受け取った際の所定の情報は、少なくとも、受け取った際の時刻、受け取った際のパラメータ、受け取った際の戻り値、または受け取った際のポインタ・パラメータの指すメモリ内容のいずれかを備えることを特徴とする実施態様1に記載のログ取得方法。
【0128】
[実施態様4] 前記所定の処理を行う関数のアドレスは、該関数を提供するダイナミックリンクライブラリごとに、インポート関数アドレステーブルに記載されていることを特徴とする実施態様1に記載のログ取得方法。
【0129】
[実施態様5] 前記所定の処理を行う関数のアドレスのうち、前記ログ取得のための関数のアドレスに書き換えるアドレスを選択する工程を更に備え、
前記書き換える工程は、前記選択する工程により選択された関数のアドレスを書き換えることを特徴とする実施態様1に記載のログ取得方法。
【0130】
[実施態様6] 所定の1または複数のモジュールを定義する工程と、前記関数の呼び出しが当該定義したモジュールを経由したか否かを判別する工程とを更に備え、当該定義されたモジュールを経由した場合には、当該関数を呼び出す際の前記所定の情報を記録対象から除外することを特徴とする実施態様1のログ取得方法。
【0131】
[実施態様7] オペレーティング・システムに含まれる所定の1または複数のモジュールを定義する工程と、前記関数の呼び出しが経由したモジュールを判別する工程とを更に備え、当該定義されたモジュール以外のオペレーティング・システムに含まれるモジュールを経由した場合には、当該関数を呼び出す際の前記所定の情報を記録対象から除外することを特徴とする実施態様1のログ取得方法。
【0132】
[実施態様8] 前記所定の情報が構造体である場合に、当該構造体が置かれたメモリ領域の先頭から当該構造体のサイズ分だけ後のメモリ領域に格納されている情報を、当該構造体に指定されたサイズに応じて記録することを特徴とする実施態様1のログ取得方法。
【0133】
[実施態様9] 前記所定の情報が構造体である場合に、当該構造体が置かれたメモリ領域の先頭から当該構造体に対して指定されたオフセットより後のメモリ領域に格納されている情報を、定義されたデータ型のデータとして記録することを特徴とする実施態様1のログ取得方法。
【0134】
[実施態様10] 何れのモジュールの何れの関数の所定の情報の何れがオブジェクトの情報を表わし、何れがオブジェクトのクラスIDを表わすかを定義しておき、関数の呼び出しにおいて、オブジェクトのクラスIDに基づいて、その関数の所定の情報に格納されたオブジェクトの情報を記録することを特徴とする実施態様1のログ取得方法。
【0135】
[実施態様11] 何れのモジュールの何れの関数の所定の情報の何れがオブジェクトの情報を表わし、何れがオブジェクトのインターフェースIDを表わすかを定義しておき、関数の呼び出しにおいて、オブジェクトのインターフェースIDに基づいて、その関数の所定の情報に格納されたオブジェクトの情報を記録することを特徴とする実施態様1のログ取得方法。
【0136】
[実施態様12] ライブラリまたは各インタフェースに対するモジュール名の追加定義を用意しておき、関数を呼び出す際に、当該追加定義を参照してモジュール名を記録することを特徴とする実施態様1のログ取得方法。
【0137】
[実施態様13] 所定の処理を行う関数を備えるプログラムの実行中のログを取得するログ取得方法であって、
前記所定の処理を行う関数がロードされた場合のアドレスから所定のオフセットを有する領域であって、指定された領域を識別する工程と、
前記ロードされた前記所定の処理を行う関数のアドレスを、ログ取得のための関数のアドレスに書き換える工程と、を備え、
前記ログ取得のための関数は、
前記所定の処理を行う関数を呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
前記所定の処理を行う関数を呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と、
前記指定された領域のデータを読み出して記録する工程と
を備えることを特徴とするログ取得方法。
【0138】
[実施態様14] 所定の処理を行う第1の関数を備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に該プログラムの実行ファイルから直接呼び出された前記第1の関数によってのみ呼び出される第2の関数のうち、指定された第2の関数を識別する工程と、
前記第1の関数によって呼び出されることでロードされる前記指定された第2の関数のアドレスを、ログ取得のための関数のアドレスに書き換える工程と、を備え、
前記ログ取得のための関数は、
前記指定された第2の関数を呼び出し、該所定の処理を実行させ、実行結果を受け取る工程と、
前記指定された第2の関数を呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と
を備えることを特徴とするログ取得方法。
【0139】
[実施態様15] 所定の処理を行う第1の関数を備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に、該プログラムの実行ファイルから直接呼び出された前記第1の関数によってのみ呼び出される第2の関数に設定されたIDを識別する工程と、
前記第1の関数によって呼び出されることでロードされる前記IDが設定された第2の関数のアドレスを、ログ取得のための関数のアドレスに書き換える工程と、を備え、
前記ログ取得のための関数は、
前記IDが設定された第2の関数を呼び出し、該所定の処理を実行させ、実行結果を受け取る工程と、
前記IDが設定された第2の関数を呼び出す際の所定の情報を、前記設定されたIDとともに記録する工程と、
前記実行結果を受け取った際の所定の情報を、前記設定されたIDとともに記録する工程と
を備えることを特徴とするログ取得方法。
【0140】
[実施態様16] 所定の処理を行うメソッドを備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に呼び出されるオペレーティングシステム内のメソッドのうち、指定されたメソッドを識別する工程と、
ロードされた前記所定の処理を行うメソッドのアドレスと前記指定されたオペレーティングシステム内のメソッドのアドレスとを、ログ取得のためのメソッドのアドレスに書き換える工程と、を備え、
前記ログ取得のためのメソッドは、
前記所定の処理を行うメソッドおよび前記指定されたオペレーティングシステム内のメソッドを呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
前記所定の処理を行うメソッドおよび前記指定されたオペレーティングシステム内のメソッドを呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と
を備えることを特徴とするログ取得方法。
【0141】
[実施態様17] 前記所定の処理を行うメソッドおよび前記指定されたオペレーティングシステム内のメソッドを呼び出す際の所定の情報は、少なくとも、呼び出されたメソッドのメソッド名、呼び出す際の時刻、呼び出す際のパラメータ、または呼び出す際のポインタ・パラメータの指すメモリ内容のいずれかを備えることを特徴とする実施態様16に記載のログ取得方法。
【0142】
[実施態様18] 前記実行結果を受け取った際の所定の情報は、少なくとも、受け取った際の時刻、受け取った際のパラメータ、受け取った際の戻り値、または受け取った際のポインタ・パラメータの指すメモリ内容のいずれかを備えることを特徴とする実施態様16に記載のログ取得方法。
【0143】
[実施態様19] 前記所定の処理を行うメソッドのアドレスは、該メソッドを提供するインターフェースごとに、仮想アドレステーブルに記載されていることを特徴とする実施態様16に記載のログ取得方法。
【0144】
[実施態様20] 前記所定の処理を行うメソッドのアドレスのうち、前記ログ取得のためのメソッドのアドレスに書き換えるアドレスを選択する工程を更に備え、
前記書き換える工程は、前記選択する工程により選択されたメソッドのアドレスを書き換えることを特徴とする実施態様16に記載のログ取得方法。
【0145】
[実施態様21] 所定の処理を行うメソッドを備えるプログラムの実行中のログを取得するログ取得方法であって、
前記所定の処理を行うメソッドがロードされた場合のアドレスから所定のオフセットを有する領域であって、指定された領域を識別する工程と、
前記ロードされた前記所定の処理を行うメソッドのアドレスを、ログ取得のためのメソッドのアドレスに書き換える工程と、を備え、
前記ログ取得のためのメソッドは、
前記所定の処理を行うメソッドを呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
前記所定の処理を行うメソッドを呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と、
前記指定された領域のデータを読み出して記録する工程と
を備えることを特徴とするログ取得方法。
【0146】
[実施態様22] 所定の処理を行う第1のメソッドを備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に該プログラムの実行ファイルから直接呼び出された前記第1のメソッドによってのみ呼び出される第2のメソッドのうち、指定された第2のメソッドを識別する工程と、
前記第1のメソッドによって呼び出されることでロードされる前記指定された第2のメソッドのアドレスを、ログ取得のためのメソッドのアドレスに書き換える工程と、を備え、
前記ログ取得のためのメソッドは、
前記指定された第2のメソッドを呼び出し、該所定の処理を実行させ、実行結果を受け取る工程と、
前記指定された第2のメソッドを呼び出す際の所定の情報を記録する工程と、
前記実行結果を受け取った際の所定の情報を記録する工程と
を備えることを特徴とするログ取得方法。
【0147】
[実施態様23] 所定の処理を行う第1のメソッドを備えるプログラムの実行中のログを取得するログ取得方法であって、
前記プログラム実行時に、該プログラムの実行ファイルから直接呼び出された前記第1のメソッドによってのみ呼び出される第2のメソッドに設定されたIDを識別する工程と、
前記第1のメソッドによって呼び出されることでロードされる前記IDが設定された第2のメソッドのアドレスを、ログ取得のためのメソッドのアドレスに書き換える工程と、を備え、
前記ログ取得のためのメソッドは、
前記IDが設定された第2のメソッドを呼び出し、該所定の処理を実行させ、実行結果を受け取る工程と、
前記IDが設定された第2のメソッドを呼び出す際の所定の情報を、前記設定されたIDとともに記録する工程と、
前記実行結果を受け取った際の所定の情報を、前記設定されたIDとともに記録する工程と
を備えることを特徴とするログ取得方法。
【0148】
[実施態様24] 実施態様1乃至23のいずれか1つに記載のログ取得方法をコンピュータによって実現させるための制御プログラム。
【0149】
[実施態様25] 実施態様24に記載の制御プログラムを格納した記憶媒体。
【0150】
【発明の効果】
以上説明したように本発明によれば、複数にモジュール分けされたソフトウェアの処理ログを容易に取得でき、かつ、ソフトウェアの障害の原因の解析のための工数を削減することが可能となる。
【図面の簡単な説明】
【図1】本発明の第1の実施形態にかかるログ取得方法を実現するコンピュータ(ソフトウェア評価システム)の構成をあらわす図である。
【図2】本発明の第1の実施形態にかかるログ取得方法を説明するためにあらわした、関数ロード時の通常のメモリ構成をあらわす図である。
【図3】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのIAT Patch使用時のメモリ構成をあらわす図である。
【図4A】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのIAT Patchを使用時の状態を示す図である。
【図4B】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのログ取得処理の流れを示す図である。
【図5】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのIAT Patchを使用時の内部構成をあらわす図である。
【図6】本発明の第1の実施形態にかかるログ取得方法を説明するためにあらわした、COMサーバのインターフェースのインスタンス作成時の通常のメモリ構成をあらわす図である。
【図7】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのVTable Patch使用時のメモリ構成をあらわす図である。
【図8A】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのVTable Patchを使用時の状態を示す図である。
【図8B】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムのログ取得処理の流れを示す図である。
【図9】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの、内部構成をあらわす図である。
【図10】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムに対して、それぞれの関数及びメソッドのパラメータの形式や、戻り値の形式を指示する、関数定義ファイルの例を示す図である。
【図11】本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムで取得した、ログの一例を示す図である。
【図12】一般的なソフトウェアのモジュール構成の一例を示す図である。
【図13】本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、処理ログの収集対象となるオペレーティング・システムのモジュールを定義する例を示す図である。
【図14】本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【図15A】本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムで取得した処理ログの一例を示す図である。
【図15B】OS部分のDLL内の関数が呼び出された際にも、処理ログを取得することとした場合の処理ログの例を示す図である。
【図16】本発明の第2の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、処理ログの収集対象からオペレーティング・システムの除外モジュールを定義する例を示す図である。
【図17】本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【図18】本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義の一例を示す図であり、一般的に広く用いられているIDLにより、記述された図である。
【図19】本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義ファイルを示す図であり、構造体へのポインタに対して付加バイナリ情報取得を指定することで、ポインタ・データの実体をログとして取得すべく、IDLにより記述したファイルを示す図である。
【図20】図19に示された関数定義による構造体が、どのようにメモリ上に配置されるかを表す図である。
【図21】本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図19に示すように関数が定義されている時のログを取得する場合の処理の流れを示すフローチャートである。
【図22】本発明の第3の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図19の定義により取得されたログデータを示す図である。
【図23】本発明の一実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義ファイルを示す図であり、構造体へのポインタに対してメンバをオフセットとして指定することで、ポインタ・データの実体をログとして取得すべく、IDLにより記述したファイルを示す図である。
【図24】図18に示された関数定義による構造体が、どのようにメモリ上に配置されるかを表す図である。
【図25】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図18に示すように関数が定義されている時のログを取得する場合の処理の流れを示すフローチャートである。
【図26】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図18の定義により取得されたログデータを示す図である。
【図27】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムに対して、それぞれの関数及びメソッドのパラメータの形式や、戻り値の形式を指示する関数定義ファイルの例を示す図である。
【図28】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、riidに指定するインターフェース型を定義した、関数定義ファイルの例を示す図である。
【図29】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【図30】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図29における処理によって取得された処理ログの例を示す図である。
【図31】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【図32】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【図33】本発明の第4の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、図31および図32における処理によって取得された処理ログの例を示す図である。
【図34】本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの関数定義の一例を示す図である。
【図35】本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、ライブラリ名に対してモジュール名を定義する例を示す図である。
【図36】本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、インターフェース名に対してモジュール名を定義する例を示す図である。
【図37】本発明の第5の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおける処理の流れを示すフローチャートである。
【符号の説明】
1:CPU
2:チップセット
3:RAM
4:ハードディスクコントローラ
5:ディスプレイコントローラ
6:ハードディスクドライブ
7:CD−ROMドライブ
8:ディスプレイ
11:CPUとチップセットを繋ぐ信号線
12:チップセットとRAMを繋ぐ信号線
13:チップセットと各種周辺機器とを繋ぐ周辺機器バス
14:ハードディスクコントローラとハードディスクドライブを繋ぐ信号線
15:ハードディスクコントローラとCD−ROMドライブを繋ぐ信号線
16:ディスプレイコントローラとディスプレイを繋ぐ信号線
Claims (13)
- 関数を記憶したダイナミックリンクライブラリと、該関数のアドレスを記憶したインポート関数アドレステーブルと、該ダイナミックリンクライブラリ内の関数を呼び出して実行する対象プログラムとを記憶するプログラム記憶手段と、プログラムを記憶する記憶媒体と、ログが記録されるログ記録手段と、特定のモジュールのリストを記憶したリスト記憶手段と、プログラムを実行する実行手段とを有し、前記実行手段が前記記憶媒体に記憶されたプログラムを実行することにより実現される書き換え手段と、呼び出し手段とを備えた情報処理装置において、前記対象プログラムの実行中のログを取得するログ取得方法であって、
前記書き換え手段が、前記対象プログラムの実行前に、前記ダイナミックリンクライブラリ内の各関数に対応するログ取得のための関数を当該ダイナミックリンクライブラリ内にロードし、前記インポート関数アドレステーブル上に記憶された各関数のアドレスを、対応する前記ログ取得のための関数のアドレスに書き換える工程と、
前記呼び出し手段が、前記対象プログラムが呼び出そうとする呼び出し対象の関数に対する前記インポート関数アドレステーブル上の書き換え後の前記対応するログ取得のための関数のアドレスに基づいて、前記ログ取得のための関数を呼び出して前記実行手段に実行させることで実現されるログ取得手段を起動する工程と、
前記ログ取得手段が、呼び出し元のモジュールが前記特定のモジュールのリストに含まれているか否かを判断する工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記呼び出し手段による呼び出しに関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記呼び出し手段により呼び出された前記ログ取得のための関数に対応する前記呼び出し対象の関数を呼び出して、該呼び出し対象の関数を前記実行手段に実行させ、実行結果を受け取る工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記実行結果に関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記実行結果を前記対象プログラムに渡す工程と
を備えることを特徴とするログ取得方法。 - 前記呼び出しに関わるログは、少なくとも、前記呼び出し対象の関数の関数名、呼び出す際の時刻、呼び出す際のパラメータのいずれかを備えることを特徴とする請求項1に記載のログ取得方法。
- 前記実行結果に関わるログは、少なくとも、該実行結果を受け取った際の時刻、受け取った際のパラメータ、受け取った際の戻り値のいずれかを備えることを特徴とする請求項1に記載のログ取得方法。
- 前記情報処理装置は更に、設定シナリオを記憶するシナリオ記憶手段を備え、前記書き換える工程では、前記インポート関数アドレステーブル上に記憶された各関数のアドレスのうち、ログ取得の対象として当該設定シナリオに設定された関数のアドレスを書き換えることを特徴とする請求項1に記載のログ取得方法。
- 前記リスト記憶手段が、オペレーティング・システムに含まれる所定の1または複数のモジュールを記憶していることを特徴とする請求項1に記載のログ取得方法。
- 前記ログが構造体である場合に、前記記録する工程において、当該構造体が置かれたメモリ領域の先頭から当該構造体のサイズ分だけ後のメモリ領域に格納されている情報を、当該構造体に指定されたサイズに応じて前記ログ記録手段に記録することを特徴とする請求項1に記載のログ取得方法。
- 前記ログが構造体である場合に、前記記録する工程において、当該構造体が置かれたメモリ領域の先頭から当該構造体に対して指定されたオフセットより後のメモリ領域に格納されている情報を、定義されたデータ型のデータとして前記ログ記録手段に記録することを特徴とする請求項1に記載のログ取得方法。
- 何れのモジュールの何れの関数の所定の情報の何れがオブジェクトの情報を表わし、何れがオブジェクトのクラスIDを表わすかを定義した定義情報を定義情報記憶手段に記憶しておき、前記記録する工程において、オブジェクトのクラスIDに基づいて、当該定義情報を参照してその関数の所定の情報に格納されたオブジェクトの情報を記録することを特徴とする請求項1に記載のログ取得方法。
- 何れのモジュールの何れの関数の所定の情報の何れがオブジェクトの情報を表わし、何れがオブジェクトのインターフェースIDを表わすかを定義しておき、前記記録する工程において、オブジェクトのインターフェースIDに基づいて、その関数の所定の情報に格納されたオブジェクトの情報を記録することを特徴とする請求項1に記載のログ取得方法。
- ライブラリまたは各インターフェースに対するモジュール名の追加定義を用意しておき、前記記録する工程において、関数を呼び出す際に、当該追加定義を参照してモジュール名を記録することを特徴とする請求項1に記載のログ取得方法。
- メソッドを記憶したインターフェースと、該メソッドのアドレスを記憶した仮想アドレステーブルと、該インターフェース内のメソッドを呼び出して実行する対象プログラムとを記憶するプログラム記憶手段と、プログラムを記憶する記憶媒体と、ログが記録されるログ記録手段と、特定のモジュールのリストを記憶したリスト記憶手段と、プログラムを実行する実行手段とを有し、前記実行手段が前記記憶媒体に記憶されたプログラムを実行することにより実現される書き換え手段と、呼び出し手段とを備えた情報処理装置において、前記対象プログラムの実行中のログを取得するログ取得方法であって、
前記書き換え手段が、前記対象プログラムの実行前に、前記インターフェース内の各メソッドに対応するログ取得のためのメソッドをインターフェース内にロードし、前記仮想アドレステーブル上に記憶された各メソッドのアドレスを、対応する前記ログ取得のためのメソッドのアドレスに書き換える工程と、
前記呼び出し手段が、前記対象プログラムが呼び出そうとする呼び出し対象のメソッドに対する前記仮想アドレステーブル上の書き換え後の前記アドレスに基づいて、前記ログ取得のためのメソッドを呼び出して前記実行手段に実行させることで実現されるログ取得手段を起動する工程と、
前記ログ取得手段が、呼び出し元のモジュールが前記特定のモジュールのリストに含まれているか否かを判断する工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記呼び出し手段による呼び出しに関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記呼び出し手段により呼び出された前記ログ取得のためのメソッドに対応する前記呼び出し対象のメソッドを呼び出して、該呼び出し対象のメソッドを前記実行手段に実行させ、実行結果を受け取る工程と、
前記ログ取得手段が、前記呼び出し元のモジュールが前記特定のモジュールのリストに含まれていなければ、前記実行結果に関わるログを前記ログ記録手段に記録する工程と、
前記ログ取得手段が、前記実行結果を前記対象プログラムに渡す工程と
を備えることを特徴とするログ取得方法。 - 前記呼び出しに関わるログは、少なくとも、前記呼び出し対象のメソッドのメソッド名、呼び出す際の時刻、呼び出す際のパラメータのいずれかを備えることを特徴とする請求項11に記載のログ取得方法。
- 前記実行結果に関わるログは、少なくとも、該実行結果を受け取った際の時刻、受け取った際のパラメータ、受け取った際の戻り値のいずれかを備えることを特徴とする請求項11に記載のログ取得方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003099465A JP4125169B2 (ja) | 2003-04-02 | 2003-04-02 | ログ取得方法 |
US10/815,506 US7478282B2 (en) | 2003-04-02 | 2004-03-31 | Log acquisition method and its control program and storage medium |
CNB2004100333576A CN100334559C (zh) | 2003-04-02 | 2004-04-02 | 日志获取方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003099465A JP4125169B2 (ja) | 2003-04-02 | 2003-04-02 | ログ取得方法 |
Publications (3)
Publication Number | Publication Date |
---|---|
JP2004310203A JP2004310203A (ja) | 2004-11-04 |
JP2004310203A5 JP2004310203A5 (ja) | 2006-06-01 |
JP4125169B2 true JP4125169B2 (ja) | 2008-07-30 |
Family
ID=33095206
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003099465A Expired - Fee Related JP4125169B2 (ja) | 2003-04-02 | 2003-04-02 | ログ取得方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US7478282B2 (ja) |
JP (1) | JP4125169B2 (ja) |
CN (1) | CN100334559C (ja) |
Families Citing this family (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4125169B2 (ja) * | 2003-04-02 | 2008-07-30 | キヤノン株式会社 | ログ取得方法 |
US7266726B1 (en) | 2003-11-24 | 2007-09-04 | Time Warner Cable Inc. | Methods and apparatus for event logging in an information network |
US8302111B2 (en) | 2003-11-24 | 2012-10-30 | Time Warner Cable Inc. | Methods and apparatus for hardware registration in a network device |
US9213538B1 (en) | 2004-02-06 | 2015-12-15 | Time Warner Cable Enterprises Llc | Methods and apparatus for display element management in an information network |
US8078669B2 (en) | 2004-02-18 | 2011-12-13 | Time Warner Cable Inc. | Media extension apparatus and methods for use in an information network |
JP4886188B2 (ja) * | 2004-12-16 | 2012-02-29 | キヤノン株式会社 | 情報処理装置及びその制御方法、コンピュータプログラム及び記憶媒体 |
FR2882449A1 (fr) * | 2005-01-21 | 2006-08-25 | Meiosys Soc Par Actions Simpli | Procede non intrusif de rejeu d'evenements internes au sein d'un processus applicatif, et systeme mettant en oeuvre ce procede |
FR2881246B1 (fr) * | 2005-01-21 | 2007-03-23 | Meiosys Soc Par Actions Simpli | Procede perdictif de gestion, de journalisation ou de rejeu d'operations non deterministes au sein du deroulement d'un processus applicatif |
CN100472469C (zh) * | 2005-02-07 | 2009-03-25 | 佳能株式会社 | 运行日志获取方法 |
JP4681923B2 (ja) * | 2005-04-01 | 2011-05-11 | キヤノン株式会社 | 情報処理装置及びその制御方法、コンピュータプログラム、記憶媒体 |
US8370818B2 (en) | 2006-12-02 | 2013-02-05 | Time Warner Cable Inc. | Methods and apparatus for analyzing software interface usage |
CN101196848B (zh) * | 2006-12-04 | 2011-10-12 | 佳能株式会社 | 运行日志获取方法 |
WO2013091167A1 (zh) * | 2011-12-21 | 2013-06-27 | 华为技术有限公司 | 日志存储方法及系统 |
CN104636240B (zh) * | 2014-12-31 | 2018-09-04 | 广东欧珀移动通信有限公司 | 一种信息报表的获取方法及终端 |
US10810099B2 (en) * | 2017-09-11 | 2020-10-20 | Internatinal Business Machines Corporation | Cognitive in-memory API logging |
US11716558B2 (en) | 2018-04-16 | 2023-08-01 | Charter Communications Operating, Llc | Apparatus and methods for integrated high-capacity data and wireless network services |
CN108984409B (zh) * | 2018-07-13 | 2021-10-22 | 郑州云海信息技术有限公司 | 一种函数定位的方法及装置 |
US11129213B2 (en) | 2018-10-12 | 2021-09-21 | Charter Communications Operating, Llc | Apparatus and methods for cell identification in wireless networks |
CN109409040B (zh) * | 2018-10-31 | 2020-09-11 | 厦门市美亚柏科信息股份有限公司 | 一种操作系统时间可信度的判定方法及装置 |
US11129171B2 (en) | 2019-02-27 | 2021-09-21 | Charter Communications Operating, Llc | Methods and apparatus for wireless signal maximization and management in a quasi-licensed wireless system |
US11026205B2 (en) | 2019-10-23 | 2021-06-01 | Charter Communications Operating, Llc | Methods and apparatus for device registration in a quasi-licensed wireless system |
CN113141269B (zh) * | 2020-01-20 | 2022-12-27 | 北京华为数字技术有限公司 | 数据采集方法、装置及系统 |
CN113986517B (zh) * | 2021-12-28 | 2022-04-08 | 深圳市明源云科技有限公司 | Api调用日志采集方法、装置、电子设备及存储介质 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05173838A (ja) * | 1991-12-19 | 1993-07-13 | Nec Corp | 命令実行過程記録システム |
JPH0667942A (ja) * | 1992-08-17 | 1994-03-11 | Mitsubishi Electric Corp | ログ採取方式 |
JPH06314221A (ja) | 1993-05-06 | 1994-11-08 | Mitsubishi Electric Corp | コンパイル方式 |
JPH07141222A (ja) * | 1993-11-17 | 1995-06-02 | Nec Corp | サブルーチンの履歴をトレースするデータ処理装置 |
JPH08179964A (ja) | 1994-12-27 | 1996-07-12 | Fujitsu Ltd | プログラムチェック方法 |
JPH08314752A (ja) | 1995-05-17 | 1996-11-29 | Ricoh Co Ltd | オブジェクト指向システムの開発支援装置 |
US5812828A (en) * | 1995-06-01 | 1998-09-22 | Centerline Software, Inc. | Function simulation |
US5970245A (en) * | 1997-01-03 | 1999-10-19 | Ncr Corporation | Method for debugging shared procedures contained in dynamic link library files |
JPH1165885A (ja) * | 1997-08-12 | 1999-03-09 | Nec Corp | ソフトウェアディバッグ装置及びソフトウェアディバッグ方法 |
JPH11296415A (ja) | 1998-04-09 | 1999-10-29 | Toshiba Tec Corp | ログ出力制御方法及び装置並びにログ出力制御プログラムを記録した記録媒体 |
US6161216A (en) * | 1998-04-29 | 2000-12-12 | Emc Corporation | Source code debugging tool |
US6996808B1 (en) * | 2000-02-12 | 2006-02-07 | Microsoft Corporation | Function injector |
US7086034B2 (en) * | 2002-06-28 | 2006-08-01 | Canon Kabushiki Kaisha | Method, program, and storage medium for acquiring logs |
US7188279B2 (en) * | 2002-06-28 | 2007-03-06 | Canon Kabushiki Kaisha | Method, program, and storage medium for acquiring logs |
JP4125169B2 (ja) * | 2003-04-02 | 2008-07-30 | キヤノン株式会社 | ログ取得方法 |
CN100347669C (zh) * | 2003-12-30 | 2007-11-07 | 佳能株式会社 | 运行日志取得方法 |
-
2003
- 2003-04-02 JP JP2003099465A patent/JP4125169B2/ja not_active Expired - Fee Related
-
2004
- 2004-03-31 US US10/815,506 patent/US7478282B2/en not_active Expired - Fee Related
- 2004-04-02 CN CNB2004100333576A patent/CN100334559C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2004310203A (ja) | 2004-11-04 |
US7478282B2 (en) | 2009-01-13 |
CN1534470A (zh) | 2004-10-06 |
CN100334559C (zh) | 2007-08-29 |
US20040199903A1 (en) | 2004-10-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4125169B2 (ja) | ログ取得方法 | |
US7340726B1 (en) | Systems and methods for performing static analysis on source code | |
US9727436B2 (en) | Adding a profiling agent to a virtual machine to permit performance and memory consumption analysis within unit tests | |
US8156476B2 (en) | Debugging support for tasks in multithreaded environments | |
US9183114B2 (en) | Error detection on the stack | |
US7086034B2 (en) | Method, program, and storage medium for acquiring logs | |
CN113434131A (zh) | 编写程序方法、装置、计算机设备和存储介质 | |
EP1376365A2 (en) | Method for acquiring logs for program debugging | |
JP4280749B2 (ja) | ログ取得方法およびプログラム、記憶媒体 | |
US7194479B1 (en) | Data generator system and method | |
JP2009237610A (ja) | コード変換装置及びコード変換方法 | |
CN117076338A (zh) | 基于kprobe的linux内核动态调试方法及系统 | |
CN110806891A (zh) | 嵌入式设备软件版本的生成方法及装置 | |
JP4125055B2 (ja) | ログ取得方法 | |
US7975198B2 (en) | Test system and back annotation method | |
US8191050B2 (en) | Information processor, control method therefor, computer program and storage medium | |
US20050261857A1 (en) | System and method for linking and loading compiled pattern data | |
CN1982908A (zh) | 实时生成闪存测试向量的方法 | |
JP2004038314A (ja) | ログ取得方法およびプログラム、記憶媒体 | |
JP2004038311A (ja) | ログ取得方法およびプログラム、記憶媒体 | |
JP2006031248A (ja) | 関数呼び出しをフックしてログを生成するソフトウェア評価システム | |
JP3745968B2 (ja) | 試験システム及び試験方法及び試験プログラム及び試験プログラムを記録した計算機で読み取り可能な記録媒体 | |
CN117435171A (zh) | 一种面向risc-v架构处理器的集成开发方法 | |
CN116069302A (zh) | 编译器硬件后端的扩展方法、装置、设备及可读存储介质 | |
CN115016850A (zh) | 一种基于国产处理器平台的uefi固件启动模式切换方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060403 |
|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20060403 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20071001 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20071130 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20071225 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20080225 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20080414 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20080507 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 4125169 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110516 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120516 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120516 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130516 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140516 Year of fee payment: 6 |
|
LAPS | Cancellation because of no payment of annual fees |