(57)【要約】      （修正有）【課題】ログ取得対象アプリケーションが検出した、ログ取得ソフトウェアでの初期化処理の種別に対応した初期化を可能とする。【解決手段】第３のモジュールは、第１のモジュールから第２のモジュール内の初期化処理に関する前記関数の呼び出しを検出し、初期化処理に関する関数についての初期化処理の動作状態を識別するためのパラメータを取得し、本パラメータに基づいて、前記初期化処理の動作状態を判定する。判定の結果に基づく動作状態で、前記初期化処理に関する関数を実行させ、実行の結果を前記第１のモジュールへ通知する。【選択図】図１１
2006172204.tif 000002
【特許請求の範囲】
【請求項１】
第１のモジュールと、第２のモジュールと、前記第１のモジュールから前記第２のモジュール内の関数への呼び出しを仲介し、前記第２のモジュールにおける処理のログを取得するための第３のモジュールと、を実行する情報処理装置であって、
前記第３のモジュールは、
前記第１のモジュールから前記第２のモジュール内の初期化処理に関する前記関数の呼び出しを検出する検出手段と、
前記呼び出しが検出された場合に、前記初期化処理に関する関数についての初期化処理の動作状態を識別するためのパラメータを取得するパラメータ取得手段と、
取得した前記パラメータに基づいて、前記初期化処理の動作状態を判定する判定手段と、
前記判定の結果に基づく動作状態において、前記初期化処理に関する関数を実行させる実行手段と、
前記実行の結果を前記第１のモジュールへ通知する通知手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記動作状態は、シングルスレッド又はマルチスレッドのいずれかであることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
第１のモジュールから第２のモジュール内の関数への呼び出しを仲介し、前記第２のモジュールにおける処理のログを取得するための第３のモジュールを実行する情報処理方法であって、
前記第１のモジュールから前記第２のモジュール内の初期化処理に関する前記関数の呼び出しを検出する検出工程と、
前記呼び出しが検出された場合に、前記初期化処理に関する関数についての初期化処理の動作状態を識別するためのパラメータを取得するパラメータ取得工程と、
取得した前記パラメータに基づいて、前記初期化処理の動作状態を判定する判定工程と、
前記判定の結果に基づく動作状態において、前記初期化処理に関する関数を実行させる実行工程と、
前記実行の結果を前記第１のモジュールへ通知する通知工程と
を備えることを特徴とする情報処理方法。
【請求項４】
前記動作状態は、シングルスレッド又はマルチスレッドのいずれかであることを特徴とする請求項３に記載の情報処理方法。
【請求項５】
請求項３又は４に記載の情報処理方法をコンピュータに実行させるためのコンピュータプログラム。
【請求項６】
請求項５に記載のコンピュータプログラムを記憶したコンピュータで読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理方法、コンピュータプログラム及び記憶媒体に関する。
【背景技術】
【０００２】
再現率の低いソフトウェアの障害に対しては、ソフトウェアの処理ログを取得することによって対処している場合が多いが、従来、処理ログの取得はアプリケーションソフトウェアのモジュール自体に手を加えて、処理ログ取得ルーチンを追加することによって行なわれている。しかし、ログ取得コードを埋め込む等のアプリケーションソフトウェアの修正を必要とする上記の方式では、修正処理が煩雑化する。
【０００３】
そこで、複数にモジュール分けされているソフトウェアにおいて、アプリケーションソフトウェアに相当するモジュールから別のモジュール内に存在する関数への呼び出しを仲介し、当該呼び出しに応じた別モジュールにおける処理のログを取得するログ取得用モジュールを提供することにより、アプリケーションソフトウェア自体の煩雑な修正を行わずとも、処理ログを取得可能とする方法が提案されている（特許文献１参照）。
【０００４】
ここで所定のアプリケーション（ログ取得対象アプリケーション）における処理のログを取得するためのログ取得ソフトウェアは、ログ取得対象アプリケーションの関数の情報を定義するための情報設定ファイルを解析するために、初期化処理が必要である。この初期化処理は、シングルスレッド又はマルチスレッドのいずれか動作状態に対応している。
【０００５】
ログ取得ソフトウェアの初期化処理に併せてログ取得対象アプリケーションでも同様の初期化処理を行なおうとする場合、ログ取得ソフトウェアの初期化処理が先になされているため、ログ取得対象アプリケーションでの初期化処理が失敗する場合がある。初期化処理の失敗を防止するには、ログ取得対象アプリケーションが行なう初期化処理がシングルスレッド又はマルチスレッドのどちらの動作状態に対応した初期化を行なっているかをログ取得ソフトウェアに設定しておくとともに、ログ取得ソフトウェアで設定内容と同様の初期化処理を行なう必要がある。
【特許文献１】特開２００４−３８３１１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ログ取得対象アプリケーションが行う初期化処理の設定をログ取得ソフトウェアに設定するためには、ログ取得対象アプリケーションの内部構造を、ログ取得を行おうとするユーザが知っている必要がある。しかしながら、そのような予備知識を必要とする設定処理はユーザにとって煩雑であるだけでなく、全てのユーザがログ取得対象アプリケーションの内部構造に関する十分な知識を有している訳ではないため、初期化処理の失敗を確実に防ぐことは困難である。
【０００７】
そこで、本発明では、ログ取得ソフトウェアでの初期化処理の種別をログ取得対象アプリケーションが検出し、検出した初期化処理に対応した初期化を可能とすることを目的とする。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明においては、第１のモジュールと、第２のモジュールと、前記第１のモジュールから前記第２のモジュール内の関数への呼び出しを仲介し、前記第２のモジュールにおける処理のログを取得するための第３のモジュールと、を実行する情報処理装置であって、前記第３のモジュールは、前記第１のモジュールから前記第２のモジュール内の初期化処理に関する前記関数の呼び出しを検出する検出手段と、前記呼び出しが検出された場合に、前記初期化処理に関する関数についての初期化処理の動作状態を識別するためのパラメータを取得するパラメータ取得手段と、取得した前記パラメータに基づいて、前記初期化処理の動作状態を判定する判定手段と、前記判定の結果に基づく動作状態において、前記初期化処理に関する関数を実行させる実行手段と、前記実行の結果を前記第１のモジュールへ通知する通知手段とを備える。
【発明の効果】
【０００９】
本発明によれば、ログ取得ソフトウェアでの初期化処理の種別をログ取得対象アプリケーションが検出し、検出した初期化処理に対応した初期化が可能となる。
【発明を実施するための最良の形態】
【００１０】
以下、添付する図面を参照して本発明の実施形態を説明する。
【００１１】
図１は、本実施形態に対応する情報処理装置の構成の一例を示す図である。説明を簡略化するために、本実施形態では、情報処理システムが１台のPC内部に構築されるものとするが、本発明の特徴は１台のPC内部に構築されるか、あるいは複数のPCにネットワークシステムとして構築されるかによらず有効である。
【００１２】
本情報処理装置には、CPU１、チップセット２、RAM３、ハードディスクコントローラ４、ディスプレイコントローラ５、ハードディスクドライブ６、CD-ROMドライブ７、ディスプレイ８が搭載されている。また、CPU１とチップセット２とを繋ぐ信号線１１、チップセット２とRAM３とを繋ぐ信号線１２、チップセット２と各種周辺機器４、５とを繋ぐ周辺機器バス１３、ハードディスクコントローラ４とハードディスクドライブ６とを繋ぐ信号線１４、ハードディスクコントローラ４とCD-ROMドライブ７とを繋ぐ信号線１５、ディスプレイコントローラ５とディスプレイ８とを繋ぐ信号線１６が搭載されている。
【００１３】
本実施形態に対応する情報処理装置を説明するために、まず図２を参照して、複数のモジュールに分かれたソフトウェアが、通常の状態でどのようにメモリにロードされるかを説明する。図２は、RAMの内部構成の一例を示す図である。
【００１４】
通常、複数のモジュールに分割されたソフトウェアは、全体の制御を行なう実行ファイルEXE(２３)と、モジュールとして存在しEXEの補完的な役割を担うダイナミックリンクライブラリDLL(２７)とに分かれて存在する。そして、RAM３にはEXEとDLLの両方がロードされる。EXEはコードセグメント(２８)とデータセグメント(２９)、及び、インポート関数アドレステーブル(２２)で構成される。このうち、インポート関数アドレステーブルは、関数の所属するDLLによって更に分割されており(２１及び２４)、DLLごとにそれぞれの関数がロードされたアドレスが書かれている(３０〜３５)。
【００１５】
DLLの関数の実体は、DLLごとに分けて(２５,２６)ロードされ、それぞれの関数は該当するDLLの一部としてロードされる(３６〜４１)。この図では、１本のEXEがA.DLL及びB.DLLの２つのダイナミックリンクライブラリ内の関数を使用している例を示しており、実際に使用される関数はFunc AA, Func AB, Func AC, Func BA, Func BB, Func BCの６個となっている。
【００１６】
EXEのコードセグメント２８内にあるコードが関数Func AAを呼び出す場合には、まずインポート関数アドレステーブル内に書かれたFunc AAのアドレス(３０)が読み込まれる。ここには実際にはA.DLLの一部として読み込まれたFunc AAコード(３６)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはA.DLLのFunc AAを呼び出すことができる。
【００１７】
次に、ログ取得用のコードとしてIAT Patch(Import Address Table Patch)という手法を用いて関数呼び出しを仲介する場合の、情報処理装置のメモリ構成の一例を図３を参照して説明する。
【００１８】
ログ取得が開始されると、メモリ内にはIAT Patch用のDLLであるC.DLL(５８)がロードされる。C.DLLはインポート関数アドレステーブル(５２)内に書かれた関数のアドレスを、C.DLL内のログ取得コードであるFunc CAA, Func CAB, Func CAC, Func CBA, Func CBB, Func CBCのアドレスに書き換える(６１〜６６)。C.DLL内のFunc CAA, Func CAB, Func CAC, Func CBA, Func CBB, Func CBCのコード(７３〜７８)は、ログを記録すると共に、元々関数呼び出しを受けるべくメモリにロードされている、該当する関数であるFunc AA, Func AB, Func AC, Func BA, Func BB, Func BC(６７〜７２)を呼び出す。
【００１９】
図４は、図３におけるIAT Patchの処理をあらわすタイミングチャートである。説明を簡略化するために、この図ではEXEがA.DLL内のFunc AAを呼び出す際に、IAT Patchによるログ取得コードがどのように動作するかの例をあらわしている。他の関数の場合についても同様の処理が行われることはいうまでもない。
【００２０】
EXE(９１)がFunc AAをコールすると(９４)、C.DLL内にあるログ取得コードがDLL名/関数名をメモリに保存し、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、メモリに保存する(９５)。その後C.DLLは本来呼び出されるはずであった、A.DLL(９３)内のFunc AAをコールする(９６)。A.DLLのFunc AA処理(９７)が終了し、C.DLLに制御がリターンすると(９８)、C.DLLはリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、メモリに保存する(９９)。その後、C.DLLは保存したログ情報をファイルに書き込み(１００)、あたかもA.DLLのFunc AAが通常通りに終了したかのように、EXEにリターンする(１０１)。
【００２１】
図５は、本実施形態に対応する情報処理装置において実行形式ファイルＥＸＥが実行される場合の動作の一例を示す図である。通常は実行形式のEXE(１１３)が、DLL-１(１１６)やDLL-２(１１７)内の関数を呼び出すが、ここではAPIトレーサと呼ばれるログ取得コードを埋め込み(１１４)、処理ログを生成している(１１５)。APIトレーサは、DLL-１やDLL-２の関数定義を記述したファイル(１１１)と、どのDLLのどの関数のインポート関数テーブルを書き換えてログを取得するかの設定シナリオ(１１２)を元に動作する。
【００２２】
図６は、本実施形態に対応する情報処理装置において、実行ファイルEXE(１１８)がCOM(Component Object Model：コンポーネント・オブジェクト・モデル)サーバでエクスポートされているインターフェースのインスタンスを作成する場合の、メモリ構成の一例を示す図である。
【００２３】
通常、インターフェースのインスタンス作成を行うと、COMサーバ内で、要求されたインターフェース(１２１, １２２)と、そのメソッド(１３０〜１３５)が作成され、それらは共にメモリ上にロードされる。ここで、virtual address tableは作成された各インターフェース毎に作られ(１１８, １２０)、作成要求を行ったEXEに渡される。このvirtual address tableには各メソッドについて作成されたアドレスが書かれている(１２４〜１２９)。EXEはこれら情報を利用し、各インターフェースに対して呼び出しを行う。図６では、１本のEXEがInterface A及びInterface Bの２つのインターフェースのインスタンスを作成しており、そのインターフェース内部のメソッドを使用している例を示しており、実際に使用されているメソッドは、Method AA, Method AB, Method AC, Method BA, Method BB, Method BCとなっている。
【００２４】
EXEのコードが関数Method AAを呼び出す場合には、まずvirtual address table内に書かれたMethod AAのアドレス(１２４)が読み込まれる。このアドレス（１２４）にはCOMサーバのInterface Aの一部として作成されたMethod AAコード(１３０)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはInterface AのMethod AAを呼び出すことができる。
【００２５】
図７は、本実施形態に対応する情報処理装置のメモリ構成をあらわす図であり、図６とは、ログ取得用のコードとしてVTable Patch(virtual address table Patch)という手法を用いて、メソッド呼び出しを仲介しているという点で異なっている。
【００２６】
ログ取得が開始されると、メモリ内にはVTable Patch用のDLL(１４３)がロードされる。このDLLはvirtual address table(１３６, １３８)内に書かれたメソッドのアドレスを、DLL内のログ取得コードであるMethod A'A, Method A'B, Method A'C, Method B'A, Method B'B, Method B'Cのアドレスに書き換える(１４５〜１５０)。DLL内のMethod A'A, Method A'B, Method A'C, Method B'A, Method B'B, Method B'Cのコード(１５７〜１６２)は、ログを記録すると共に、元々のメソッド呼び出しを受けるべくメモリにロードされていたMethod AA, Method AB, Method AC, Method BA, Method BB, Method BC(１５７〜１６２)を呼び出す。
【００２７】
図８は、図７におけるVTable Patchの処理をあらわすタイミングチャートである。説明を簡略化するために、この図ではEXEがCOMサーバ内のInterface AのMethod AAを呼び出す際に、VTable Patchによるログ取得コードがどのように動作するかの例をあらわしている。他のメソッドの場合についても同様の処理が行われることはいうまでもない。
【００２８】
EXE(１６３)がMethod AAをコールすると(１６６)、DLL内にあるログ取得コードがモジュール名/インターフェース名/メソッド名をメモリに保存し、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、メモリに保存する(１６７)。その後DLLは本来呼び出されるはずであった、COMサーバ(１６５)内のMethod AAをコールする(１６８)。COMサーバのMethod AA処理(１６９)が終了し、DLLに制御がリターンすると(１７０)、DLLはリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、メモリに保存する(１７１)。その後、DLLは保存したログ情報をファイルに書き込み(１７２)、あたかもCOMサーバのMethod AAが通常通りに終了したかのように、EXEにリターンする(１７３)。
【００２９】
図９は、本実施形態に対応する情報処理装置において実行形式ファイルＥＸＥが実行される場合の動作の一例を示す図である。通常は実行形式のEXE(１７６)が、COMサーバ-１(１７９)やCOMサーバ-２(１８０)内のメソッドを呼び出すが、ここではAPIトレーサと呼ばれるログ取得コードを埋め込み(１７７)、処理ログを生成している(１７８)。APIトレーサは、COMサーバ-１(１７９)やCOMサーバ-２の関数定義を記述したファイル(１７４)と、どのCOMサーバのどのインターフェースのどのメソッドのvirtual address tableを書き換えてログを取得するかの設定シナリオ(１７５)を元に動作する。
【００３０】
図１０は、本実施形態に対応する情報処理装置において、ログ取得対象アプリケーションを起動し、ログ取得処理を開始する際の処理の一例を示すフローチャートである。
【００３１】
まず、ログ取得対象アプリケーションが起動される(Ｓ１００１)と、IAT Patch用のDLLが対象アプリケーションにロードされる(Ｓ１００２)。ロードされたDLLは対象アプリケーションのプロセス内でCOMをSingle Thread Apartment(STA)で初期化する(Ｓ１００３)。初期化後にCOMのメソッドを使用して、関数定義ファイルであるType Libraryを読み込み(Ｓ１００４)、設定に従ってログ取得準備処理をおこなう(Ｓ１００５)。さらに、DLLは対象アプリケーションでCOMの初期化関数の呼び出しがなされたか否かを取得するための準備を行ない(Ｓ１００６)、ログ取得対象アプリケーションを実行し(Ｓ１００７)、ログの取得を開始する(Ｓ１００８)。
【００３２】
このようにしてログ取得対象アプリケーションが起動され、ログの取得が開始されると、ログ取得対象アプリケーション側での初期化処理が行われることとなる。図１１は、ログ取得対象アプリケーションがCOM初期化関数の呼び出しを行なった場合の処理の一例に対応するフローチャートである。
【００３３】
ログ取得対象アプリケーションでCOMの初期化処理が呼び出されると(Ｓ１１０１)、IAT Patch用のDLLへ処理が移り、COM初期化関数のスレッド初期化パラメータを取得する(Ｓ１１０２)。このスレッド初期化パラメータは、ログ取得対象アプリケーションにおける初期化処理が、シングルスレッド又はマルチスレッドのいずれの動作状態において実行されるかの情報を含んでいる。
【００３４】
DLLは起動時に初期化を行なったCOMの解放処理を行ない、プロセスのCOM初期化状態を無効にする(Ｓ１１０３)。更に、ステップＳ１１０２において取得したスレッド初期化パラメータに基づいて、取得対象アプリケーションにおける初期化処理が、シングルスレッド（STA:Single Thread Apartment）かマルチスレッド(MTA:Multi Thread Apartment)のいずれの動作状態において実行されるかを判定し(Ｓ１１０４)、STAと判定されればDLLでCOMの初期化をSTAで行い(Ｓ１１０５)、MTAと判定されれば、COMの初期化をMTAで行なう(Ｓ１１０６)。COMの初期化が終了すると、呼び出されたCOM初期化関数に終了結果を設定し、ログ取得対象アプリケーションに値を返し(Ｓ１１０７)、ログの取得を継続する(Ｓ１１０８)。
【００３５】
以上のように、本発明によればログ取得ソフトウェアを用いることで、ログ取得対象ソフトウェアがCOMの初期化をシングルスレッド又はマルチスレッドのいずれの方法で行なっていても、ログ取得ソフトウェアが自動的にそのCOM初期化方法を判別することで、ログ取得対象ソフトウェアのCOM初期化に影響を受けずに、ログ取得が可能となる。
【００３６】
［その他の実施形態］
なお、本発明は、複数の機器（例えばホストコンピュータ、インタフェイス機器、リーダ、プリンタなど）から構成されるシステムに適用しても、一つの機器からなる装置（例えば、複写機、ファクシミリ装置など）に適用してもよい。
【００３７】
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体（または記録媒体）を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ（またはＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出し実行することによっても、達成されることは言うまでもない。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。また、コンピュータが読み出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているオペレーティングシステム（ＯＳ）などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【００３８】
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張カードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張カードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【図面の簡単な説明】
【００３９】
【図１】本発明の実施形態に対応する情報処理装置の構成の一例を示す図である。
【図２】本発明の実施形態に対応する情報処理装置のメモリに、複数のモジュールに分割されたソフトウェアがロードされる場合を説明する図である。
【図３】本発明の実施形態に対応する、ログ取得用のコードとしてIAT Patchを用いて関数呼び出しを仲介する場合の、情報処理装置のメモリ構成の一例を示す図である。
【図４】本発明の実施形態に対応する情報処理装置において、IAT Patchの処理を実行した場合のタイミングチャートの一例を示す図である。
【図５】本発明の実施形態に対応する情報処理装置において実行形式ファイルＥＸＥが実行される場合の動作の一例を示す図である。
【図６】本発明の実施形態に対応する情報処理装置において、実行ファイルEXEがCOMサーバでエクスポートされているインターフェースのインスタンスを作成する場合の、メモリ構成の一例を示す図である。
【図７】本発明の実施形態に対応する情報処理装置のメモリ構成をあらわす図である。
【図８】本発明の実施形態に対応する情報処理装置において、VTable Patchの処理を実行した場合のタイミングチャートの一例を示す図である。
【図９】本発明の実施形態に対応する情報処理装置において実行形式ファイルＥＸＥが実行される場合の動作の一例を示す図である。
【図１０】本発明の実施形態に対応する情報処理装置において、ログ取得対象アプリケーションを起動し、ログ取得処理を開始する際の処理の一例を示すフローチャートである。
【図１１】本発明の実施形態に対応する情報処理装置において、ログ取得対象アプリケーションがCOM初期化関数の呼び出しを行なった場合の処理の一例に対応するフローチャートである。
【図１】
2006172204.tif 000003
【図２】
2006172204.tif 000004
【図３】
2006172204.tif 000005
【図４】
2006172204.tif 000006
【図５】
2006172204.tif 000007
【図６】
2006172204.tif 000008
【図７】
2006172204.tif 000009
【図８】
2006172204.tif 000010
【図９】
2006172204.tif 000011
【図１０】
2006172204.tif 000012
【図１１】
2006172204.tif 000013