JP2005196779A - ログ取得方法およびプログラム、記憶媒体 - Google Patents

ログ取得方法およびプログラム、記憶媒体 Download PDF

Info

Publication number
JP2005196779A
JP2005196779A JP2004377887A JP2004377887A JP2005196779A JP 2005196779 A JP2005196779 A JP 2005196779A JP 2004377887 A JP2004377887 A JP 2004377887A JP 2004377887 A JP2004377887 A JP 2004377887A JP 2005196779 A JP2005196779 A JP 2005196779A
Authority
JP
Japan
Prior art keywords
log
function
log acquisition
acquisition method
interface
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.)
Granted
Application number
JP2004377887A
Other languages
English (en)
Other versions
JP4155583B2 (ja
JP2005196779A5 (ja
Inventor
Xinxia Chen
ジンジア チェン
Jin Han
ジン ハン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Canon Inc
Original Assignee
Canon Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Canon Inc filed Critical Canon Inc
Publication of JP2005196779A publication Critical patent/JP2005196779A/ja
Publication of JP2005196779A5 publication Critical patent/JP2005196779A5/ja
Application granted granted Critical
Publication of JP4155583B2 publication Critical patent/JP4155583B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

【課題】ソフトウェアの処理ログを容易に取得でき、バグの解析のための構成を削減することが可能なログ取得方法を提供する。
【解決手段】所定の処理を実行するための少なくとも1つの関数116を備えるプログラム113の実行中のログを取得するための方法は、少なくとも1つの関数116のアドレスをログ取得のための関数114のアドレスに書き換える工程を備え、該ログ取得のための関数114は、少なくとも1つの関数116を呼び出し、所定の処理を実行させ、実行結果を受け取り、受け取った該実行結果をプログラム113に受け渡し、所定の方法でその形式を指定可能なポインタ・パラメータが、前記プログラムの関数定義111において定義されているか否かを判断し、定義されている場合には、ポインタ・パラメータにより指定されたメモリの内容を、指定されたデータ形式のデータとして記録115することを特徴とする。
【選択図】図5

Description

本発明は、複数にモジュール分けされたソフトウェアの処理ログを取得するための技術に関するものである。
従来より、再現率の低いソフトウェアの障害に対しては、ソフトウェアの処理ログを取得し、当該処理ログを解析することによって、障害の原因をつきとめ、その対策を講じてきた。
しかし、上記従来の処理ログの取得には以下のような問題点がある。
(1)ユーザの動作環境でもログを取得しつづけるためには、ソフトウェアのモジュール自体に手を加え、処理ログ取得ルーチンを追加しなければならず、処理ログ取得のための作業負荷が大きかった。
(2)処理ログ取得はモジュール毎に行うため、生成されたログはモジュール単位のものとなってしまい、ソフトウェア全体の処理を、完全に時間順のログとして取得するのが困難である。このため、全体の処理ログとしての見通しが悪く、ログを解析して障害の原因を発見するまでのプロセスに工数がかかっていた。
しかし、上記従来の処理ログの取得には以下のような問題点がある。
(1)ユーザの動作環境でもログを取得しつづけるためには、ソフトウェアのモジュール自体に手を加え、処理ログ取得ルーチンを追加しなければならず、処理ログ取得のための作業負荷が大きかった。
(2)処理ログ取得はモジュール毎に行うため、生成されたログはモジュール単位のものとなってしまい、ソフトウェア全体の処理を、完全に時間順のログとして取得するのが困難である。このため、全体の処理ログとしての見通しが悪く、ログを解析して障害の原因を発見するまでのプロセスに工数がかかっていた。
本発明は、上記課題を鑑みてなされたものであり、複数にモジュール分けされたソフトウェアの処理ログを容易に取得でき、かつ、ソフトウェアの障害の原因の解析のための工数を削減することが可能なログ取得方法、ならびに該方法をコンピュータによって実現させるためのプログラム、および該プログラムを格納した記憶媒体を提供することを目的とする。
上記の目的を達成するために本発明に係るログ取得方法は、所定の処理を行う少なくとも1つの関数を備えるプログラムの実行中のログを取得するための方法であって、
ロードされた前記所定の処理を行う少なくとも1つの関数のアドレスを、ログ取得のための関数のアドレスに書き換える工程を備え、前記ログ取得のための関数は、前記所定の処理を行う少なくとも1つの関数を呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
前記プログラム内の関数定義において、ポインタ・パラメータが所定の定義方法で定義されているか否かを判断する工程と、
ポインタ・パラメータが所定の定義方法で定義されていた場合、該定義方法に基づいて該ポインタ・パラメータの指すメモリの内容を特定のデータ形式のデータとして記録する工程とを備える。
好適には、ポインタ・パラメータの種類はインデックス構造(index structure)により定義され、上記判断工程は当該インデックス構造の指定されたメンバーを参照することにより該ポインタ・パラメータの種類を判断する工程を備える。当該インデックス構造のメンバーの種類としては、様々な種類の非エクスポート関数を適用することができ、また様々な種類の構造を適用することができる。
本発明の好適な実施形態について、図面を参照しながら以下に詳細を説明する。
[第1の実施形態]
本実施形態は、あるモジュールから別のモジュール内に存在する関数の呼び出しが行われる際の仕組みである、メモリに保持されたインポート関数アドレス、または仮想関数アドレステーブル(virtual address table)を利用して、モジュール間の関数呼び出しをフックしてログに記録することで、ソフトウェアのモジュール自体に手を加えることなく、ソフトウエア全体の処理を、時間順のログとして取得することを可能にするものである。以下に具体的に説明する。
<システム構成>
図1は、本発明の各実施形態にかかるログ取得方法を実現するコンピュータ(ソフトウェア評価システム)の構成をあらわす図である。説明を簡略化するために、本実施形態では、本ソフトウェア評価システムが1台のPC内部に構築されるものとするが、本発明のログ取得方法の特徴は1台のPC内部に構築されるか、あるいは複数のPCにネットワークシステムとして構築されるかによらず有効である。
本ソフトウェア評価システムを搭載するコンピュータには、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が設けられている。
<関数処理に対する処理ログ取得>
本発明の第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムを説明するために、まず図2によって、複数のモジュールに分かれたソフトウェアが、通常の状態でどのようにメモリにロードされるかを説明する。
通常、複数のモジュールに分かれたソフトウェアは、全体の制御を行う実行ファイルEXE(23)と、モジュールとして存在しEXEの補完的な役割を担うダイナミックリンクライブラリDLL(27)とに分かれており、メモリにはEXEとDLLの両方がロードされる。EXEはコードセグメント(28)とデータセグメント(29)、そしてインポート関数アドレステーブル(22)から成っている。更に、インポート関数アドレステーブルは、関数の所属するDLLによって分かれており(21, 24)、DLLごとにそれぞれの関数がロードされたアドレスが書かれている(30〜35)。DLLの関数の実体は、DLLごとに分かれて(25, 26)ロードされ、それぞれの関数は該当するDLLの一部としてロードされる(36〜41)。この図では、1本のEXEがA.DLL及びB.DLLの2つのダイナミックリンクライブラリ内の関数を使用している例を示しており、実際に使用される関数はFunc AA, Func AB, Func AC, Func BA, Func BB, Func BCの6個となっている。
EXEのコードセグメント内にあるコードが関数Func AAを呼び出す場合には、まずインポート関数アドレステーブル内に書かれたFunc AAのアドレス(30)が読み込まれる。ここには実際にはA.DLLの一部として読み込まれたFunc AAコード(36)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはA.DLLのFunc AAを呼び出すことができる。
図3は、第1の実施形態にかかるメモリ構成をあらわす図であり、図2とは、ログ取得用のコードに対してIAT Patch(Import Address Table Patch)という手法を用いて、関数呼び出しをリダイレクトしているという点で異なっている
ログ取得が開始されると、メモリ内にはIAT Patch用のDLLであるC.DLL(58)がロードされる。C.DLLはインポート関数アドレステーブル(52)内に書かれた関数のアドレスを、C.DLL内のログ取得コードであるFunc CAA, Func CAB, Func CAC, Func CBA, Func CBB, Func CBCのアドレス(61〜66)に書き換える。C.DLL内の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)を呼び出す。
図4Aは、図3におけるIAT Patchの処理をあらわす図、図4Bはログ取得処理の流れを示すフローチャートである。説明を簡略化するために、この図ではEXEがA.DLL内のFunc AAを呼び出す際に、IAT Patchによるログ取得コードがどのように動作するかの例をあらわしている。
EXE(91)がFunc AAをコールすると(94)、C.DLL内にあるログ取得コードがDLL名/関数名をメモリに保存し(ステップS402)、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、別メモリに保存する(95、ステップS403)。その後C.DLLは本来呼び出されるはずであった、A.DLL(93)内のFunc AAをコールする(96、ステップS404)。A.DLLのFunc AA処理(97)が終了し、C.DLLに制御がリターンすると(98)、C.DLLはリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、別メモリに保存する(99)。その後、C.DLLは保存したログ情報をファイルに書き込み(100、ステップS405)、あたかもA.DLLのFunc AAが通常通りに終了したかのように、EXEにリターンする(101)。
図5は、第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムの内部構成をあらわす図である。
通常は実行形式のEXE(113)が、DLL−1(116)やDLL−2(117)内の関数を呼び出すが、ここではAPIトレーサ(114)と呼ばれるログ取得コードを埋め込み、処理ログ(115)を生成している。APIトレーサ(114)は、DLL−1やDLL−2の関数定義を記述したファイル(111)と、どのDLLのどの関数のインポート関数テーブルを書き換えてログを取得するかの設定シナリオ(トレースシナリオ112)を元に動作する。
<メソッド処理に対する処理ログ取得>
次に、第1の実施形態にかかるログ取得方法を実現するソフトウェア評価システムにおいて、実行ファイルEXE(113)がCOM(Component Object Model)サーバでエクスポートされているインターフェースのインスタンス作成時に、どのようにメモリにロードされるかを説明するために、まず、図6によって、通常の状態でどのようにメモリにロードされるかを説明する。
通常、インターフェースのインスタンス作成を行うと、COMサーバ内で、要求されたインターフェース(121, 122)と、そのメソッド(:オブジェクト指向プログラミングにおいて、オブジェクトの実行する手続きを記述したプログラム、130〜135)が作成され、それらは、メモリ上に両方がロードされる。ここで、virtual address table(仮想アドレステーブル118、120)は作成された各インターフェース毎に作られ、作成要求を行ったEXEに渡される。このvirtual addres tableには各メソッドの作成されたアドレス(124〜129)が書かれている。EXEはこれら情報を利用し、各インターフェースに対して呼び出しを行う。この図では、1本のEXE(119)がInterface A(121)及びInterface B(122)の2つのインターフェースのインスタンスを作成しており、そのインターフェース内部のメソッドを使用している例を示しており、実際に使用されているメソッドは、Method AA, Method AB, Method AC, Method BA, Method BB, Method BC(130〜135)となっている。
EXEのコードが関数Method AAを呼び出す場合には、まずvirtual address table内に書かれたMethod AAのアドレス(124)が読み込まれる。ここには実際にはCOMサーバのInterface Aの一部として作成されたMethod AAコード(130)のアドレスが書かれており、そのアドレスをコールすることによって、EXEのコードはInterface AのMethod AAを呼び出すことができる。
図7は、第1の実施形態にかかるソフトウェア評価システムのメモリ構成をあらわす図であり、図6とは、ログ取得用のコードに対してVTable Patch(virtual address table Patch)という手法を用いて、メソッド呼び出しをリダイレクトしているという点で異なっている。
ログ取得が開始されると、メモリ内には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(143)内の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)を呼び出す。
図8Aは、図7におけるVTable Patchの処理をあらわす図、図8Bはログ取得処理の流れを示すフローチャートである。説明を簡略化するために、この図ではEXEがCOMサーバ内のInterface AのMethod AAを呼び出す際に、VTable Patchによるログ取得コードがどのように動作するかの例をあらわしている。
EXE(163)がMethod AAをコールすると(166)、DLL(164)内にあるログ取得コードがモジュール名/インターフェース名/メソッド名をメモリに保存し(ステップS802)、呼び出し時刻をメモリに保存し、呼び出し時のパラメータをメモリに保存し、呼び出し時のポインタパラメータの指すメモリ内容を、別メモリに保存する(167、ステップS803)。その後DLL(164)は本来呼び出されるはずであった、COMサーバ(165)内のMethod AAをコールする(168、ステップS804)。COMサーバ(165)のMethod AA処理(169)が終了し、DLL(164)に制御がリターンすると(170)、DLL(164)はリターン時の時刻をメモリに保存し、戻り値をメモリに保存し、リターン時にポインタパラメータが指すメモリ内容を、別メモリに保存する(171)。その後、DLLは保存したログ情報をファイルに書き込み(172、ステップS805)、あたかもCOMサーバ(165)のMethod AAが通常通りに終了したかのように、EXE(163)にリターンする(173)。
図9は、第1の実施形態にかかるソフトウェア評価システムの内部構成をあらわす図である。通常は実行形式のEXE(176)が、COMサーバ1(179)やCOMサーバ2(180)内のメソッドを呼び出すが、ここではAPIトレーサ(177)と呼ばれるログ取得コードを埋め込み、処理ログを生成している(178)。APIトレーサ(177)は、COMサーバ1(179)やCOMサーバ2(180)の関数定義を記述したファイル(174)と、どのCOMサーバのどのインターフェースのどのメソッドのvirtual address tableを書き換えてログを取得するかの設定シナリオ(175)を元に動作する。
以上の説明から明らかなように、本実施形態にかかるログ取得方法によれば、複数にモジュール分けされたソフトウエアの処理ログの取得において、モジュール自体に変更を加えることなく、モジュール内に用意された関数/メソッドの呼び出しをログとして記録することが可能となり、処理ログ取得のための作業負荷を低減することが可能となる。また、生成されるログは、時間順のログとして取得することができ、ログの解析が容易となるため、ソフトウェアの障害の原因の解析のための工数を削減することが可能となる。
[第2の実施形態]
本実施形態では、コールバック関数等のエクスポートされていない関数をログとして取得する場合について述べる。
図10は、本実施形態にかかるソフトウェア評価システムにおいて用いられる関数であって、従来の関数定義ではパラメータを取得することができない関数の一例を示す図である。
コールバック関数として、(例えば)FuncInternal1、FuncInternal2、FuncInternal3、FuncInternal4の4種類のコールバック関数が定義されている。GetFuncPointer関数の第1のパラメータであるdwKindは、第2のパラメータであるlpBufに送られる4種類のコールバック関数のうちの1つのポインタを示す。GetFuncPointer関数は、第1のパラメータが0の場合にはFuncInternal1のアドレスとしてlpBufを取り扱い、第1のパラメータが1の場合には、FuncInternal2のアドレスとしてlpBufを取り扱い、第1のパラメータが2の場合にはFuncInternal3のアドレスとしてlpBufを取り扱う。GetFuncPointer関数が従来の関数定義で定義されていた場合には、lpBufはvoid形式のポインタとなり、その結果、データが取得されることはない。
図11は本実施形態にかかるソフトウェア評価システムにおいて、図10に示す関数のパラメータをログ取得するためのIDLによる記述である。
コールバック関数は従来の方法で定義されている。さらに、インデックス構造であるINDEX_STRUCTは呼び出される関数内において定義されている。そして、ログ取得関数において、GetFuncPointer関数の第2のパラメータであるvoid*lpBufに対して、custum(PAT_PARAM_ID,“funckind_is(dwKind:INDEX_STRUCT)”)と宣言している。これにより、lpBufは、第1のパラメータであるdwKindの値に依存する、インデックス構造の異なるメンバーのデータ種類として取り扱われることとなる。つまり、第1のパラメータであるdwKindの値が0の場合にはFuncInternal1*データとして、1の場合にはFuncInternal2*データとして、2の場合にはFuncInternal3*データとして、3の場合にはFuncInternal4*データとして、取り扱われ、ログとして保存される。
図12は、本実施形態にかかるソフトウェア評価システムにおいて、図11の様に関数定義されている場合のログ取得の流れを示す図である。
処理が開始されると(ステップS5201)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS5202)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS5203)。そして、関数定義にバイナリ取得の設定が存在するか判別し(ステップS5204)、存在する場合には、保存するメモリサイズを各定義方法(binid_is, size_is, length_is, bytes_is)毎に計算する(ステップS5205)。その後、funckindにて定義された値が保存され、生成されたログ取得コードのアドレスにより書き換えられる(ステップS5206)。
続いて、元の関数を呼び出す(ステップS5207)。関数からリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS5208)。続いて、関数定義におてfunckindの設定がなされているか否かを判断する(ステップS5209)。設定されている場合には、funckind_isに定義された関数定義は、関数定義ファイルから取得され、ログ取得コードは当該定義に基づいて生成される(ステップS5210)。続いて、funckind_isに定義された値が保存され、生成されたログ取得コードのアドレスにより書き換えられる(ステップS5211)。ユーザによって終了コマンドを入力されると処理を終了する(ステップS5212)。
funckind_isによって設定されたパラメータが、生成されたログ取得コードのアドレスによって書き換えられた場合、当該アドレスをもって呼び出された元の関数は従来のログと同様の方法で処理される。すなわち、生成されたログ取得コードは非エクスポート関数を呼び出し、処理を実行し、受け取った実行結果を送信する一方、非エクスポート関数を呼び出す際に指定の情報を保存し、実行結果をログとして受信した際に指定の情報を保存する。
図13は、本実施形態における定義として図11に図示の定義を用いて取得されたログデータを示す図である。コールバック関数や非エクスポートインターナル関数を取得するための設定は関数定義ファイルにおいてなされるため、FuncInternal1、FuncInternal4のような、非エクスポート関数のログが取得されうる。
このように、本実施形態によれば、従来の方法では取得されることのない非エクスポート関数のログを取得することが可能となる。
[第3の実施形態]
図14は第3の実施形態にかかるソフトウェア評価システムにおいて用いられ、従来の関数定義ではパラメータは取得することができない関数の一例を示す図である。
STRUCTKIND1、STRUCTKIND2、STRUCTKIND3の3つの構造体が定義されている。FuncGetData関数の第1のパラメータであるdwKindは、当該第2のパラメータlpBufに送信される3つの構造体のうちの1つのポインタを表わしている。第1のパラメータが1の場合、FuncGetData関数はlpBufをSTRUCTKIND1に対するポインタとして取り扱い、第1のパラメータが2の場合、STRUCTKIND2に対するポインタとして取り扱い、第1のパラメータが3の場合、STRUCTKIND3に対するポインタとして取り扱う。FuncGetDataが従来の関数定義で定義されていた場合には、lpBufはvoid形式のポインタとなり、その結果、データが取得されることはない。
図15はSTRUCTKIND1、STRUCTKIND2、STRUCTKIND3のそれぞれの構造体によってどのようにメモリが使用されるかを示した図である。
STRUCTKIND1(330)は、メンバーとして、0x0000にchar chParam(331)を、0x0001にDWORD dwParam(332)を、0x0005にshort shParam(333)を有している。構造体STRUCTKIND2(334)はメンバーとして、0x0000にshort shParam(335)を、0x0002にDWORD dwParam(336)を、0x0006にchar chParam(337)を有している。構造体STRUCTKIND3(338)はメンバーとして、0x0000にchar chParam(339)を、0x0001にshort shParam(340)を、0x0003にDWORD dwParam(341)を、0x0007にlong lParam(342)を、0x000Bにint nParamを有している。
当該構造体はサイズ情報を含んでおらず、構造体データのためのメモリ構成は構造体ごとに異なる。このため、従来の方法では利用されなかった。
図16は、本実施形態にかかるソフトウェア評価システムにおいて、図14に志hめす関数のパラメータのログを取得するためのIDLによる記述である。
構造体は従来の方法で定義されている。さらに、インデックス構造であるINDEX_STRUCTは呼び出される関数内において定義されている。そして、ログ取得関数において、FuncGetData関数の第2のパラメータであるvoid*lpBufに対して、custum(PAT_PARAM_ID,“structkind_is(dwKind:INDEX_STRUCT)”)と宣言している。これにより、lpBufは、第1のパラメータであるdwKindの値に依存する、インデックス構造の異なるメンバーのデータ種類として取り扱われることとなる。つまり、第1のパラメータであるdwKindの値が1の場合にはSTRUCTKIND1*データとして、2の場合にはSTRUCTKIND2*データとして、3の場合にはSTRUCTKIND3*データとして取り扱われ、ログとして保存される。
図17は、本実施形態にかかるソフトウェア評価システムにおいて、図16の様に関数定義されている場合のログ取得の流れを示す図である。
処理が開始されると(ステップS5701)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS5702)。次に関数定義に構造体の種類の設定がなされているか否かを判別する(ステップS5704)。そして、呼び出し時刻、パラメータおよびポインタ・パラメータによって指定されたメモリの位置に記載された内容をメモリに保存する(ステップS5705)。その後、元の関数が呼び出される(ステップS5706)。関数からリターンすると、関数定義内に構造体の種類(structkind_is)が設定されているか否かが判別される(ステップS5707)。設定されている場合には、当該設定された構造体パラメータのデータが構造体の種類(structkind_is)において定義されたデータ種類として解析される。そして、リターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS5709)。そして、ユーザによって終了コマンドが入力されると処理を終了する(ステップS5710)。
図18は、本実施形態における定義として図16に図示の定義を用いて取得されたログデータを示す図である。void*の構造体上のデータであって、通常の関数定義によりポインタのみを取得可能なデータが、使用される構造体の種類に応じてログとして取得されうる。
このように、第3の実施形態によれば、従来の方法では取得することができなかったパラメータのログを取得することが可能となる。
[第4の実施形態]
本実施形態では、ログ取得のための各種設定を行うユーザインターフェースと、該ユーザインターフェースで設定された情報に基づいて行われる処理について説明する。図19は、第4の実施形態にかかるログ取得を開始する関数/メソッドを設定するためのユーザインターフェースである。
ユーザインターフェースには、ログ取得対象となっているモジュール/インターフェース(350)から、どのモジュール/インターフェースを設定するかを選択するドロップダウンリスト(352,353)と、そこで選択したモジュール/インターフェースでエクスポートされている関数/メソッド(351)から、どの関数/メソッドをログ取得開始トリガーとして設定するかを選択するドロップダウンリスト(354,355)とを備える。
図20は、第4の実施形態にかかるソフトウェア評価システムで、図19で設定した内容に従い、ログを取得する場合の流れを示す図である。
処理が開始されると(ステップS3401)、ログ取得コードは呼び出された関数/メソッドがログ取得開始トリガーとして設定されているか判別する(ステップS3402)。ログ取得開始トリガーと一致した場合には、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS3403)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存し(ステップS3404)、元の関数/メソッドを呼び出す(ステップS3405)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS3406)。この処理はユーザから終了の命令があるまで(ステップS3407)続行されるが、その際には、ログ取得開始トリガーの判別を行わない。
以上の説明から明らかなように、本実施形態によれば、ログ取得を行う関数/メソッドを任意に選択できるようにすることで、ログの解析が容易になるという効果がもたらされる。
[第5の実施形態]
上記第4の実施形態では、ログを取得する関数/メソッドをユーザが任意に選択可能としたが、本実施形態では、ログ取得を停止する関数/メソッドを任意に選択可能とする。
図21は、本実施形態にかかるログ取得を停止する関数/メソッドを設定するためのユーザインターフェースである。
ユーザインターフェースには、ログ取得対象となっているモジュール/インターフェース(356)から、どのモジュール/インターフェースを設定するかを選択するドロップダウンリスト(358,359)と、そこで選択したモジュール/インターフェースでエクスポートされている関数/メソッド(357)から、どの関数/メソッドをログ取得停止トリガーとして設定するかを選択するドロップダウンリスト(360,361)とを備える。
図22は、本実施形態にかかるソフトウェア評価システムで、図21で設定した内容に従い、ログを取得する場合の流れを示す図である。
処理が開始されると(ステップS3601)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS3602)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存し(ステップS3603)、元の関数/メソッドを呼び出す(ステップS3604)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS3605)。その後呼び出された関数/メソッドがログ取得停止トリガーとして設定されているか判別する(ステップS3606)。ログ取得停止トリガーと一致した場合には、ログ取得処理は終了する(ステップS3607)。また、ログ取得停止トリガーと一致しない場合でも、この処理はユーザから終了の命令があると(ステップS3606)終了される。これにより、任意に設定した関数/メソッドのログ取得を停止することができることとなり、ユーザの求めるログのみを取得できるため、ログの解析が容易になるという効果がもたらされる。
[第6の実施形態]
上記第4および第5の実施形態において述べたユーザインタフェースでは、ユーザが選択した任意の関数/メソッドでログの取得開始/停止をユーザが任意に選択することとしたが、ユーザが選択した任意の関数/メソッドが、エラーで終了した場合のみ、ログの取得開始/停止をするように設定することも可能である。
図23は、本実施形態にかかるログ取得を開始/停止するための関数/メソッドを設定するためのユーザインターフェースに、エラーで終了した場合のみトリガー機能(ログ取得開始/停止機能)を使用する設定を追加したものである。本ユーザインターフェースは、図19及び、図21双方に適応することが可能である。
ユーザインターフェースには、ログ取得対象となっているモジュール/インターフェース(362)から、どのモジュール/インターフェースを設定するかを選択するドロップダウンリスト(364, 365)と、そこで選択したモジュール/インターフェースでエクスポートされている関数/メソッド(363)から、どの関数/メソッドをトリガーとして設定するかを選択するドロップダウンリスト(366, 367)と、関数/メソッドがエラーで終了した場合のみトリガー機能を有効にする為のチェックボックス(368)とを備える。
図24は、本実施形態にかかる関数/メソッドのエラー定義の内容を示したものである。本実施形態においてはエラー定義がファイルとなっており、ファイルには各関数/メソッドのパラメータ及び戻り値とそのエラー条件等が定義され記されている。
図25は、本実施形態にかかるソフトウェア評価システムの、ログを取得する場合の流れを示す図であり、図23で設定した内容に従い、ログ取得開始と、エラー時のみトリガーを使用する機能を併用して設定した場合である。
処理が開始されると(ステップS3901)、ログ取得コードは呼び出された関数/メソッドがログ取得開始トリガーとして設定されているか判別する(ステップS3902)。ログ取得開始トリガーとして設定されている場合には、モジュール名、インターフェース名、関数/メソッド名をメモリに一時的に保存する(ステップS3903)。
次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をメモリに一時的に保存し(ステップS3904)、元の関数/メソッドを呼び出す(ステップS3905)。メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をメモリに一時的に保存する(ステップS3906)。
次にログ取得開始トリガーがエラーでのみ使用するかどうかを判別し(ステップS3907)、そうであれば、関数/メソッドがエラーであるかを判別する(ステップS3908)。もし、エラーでない場合には、一時メモリに保存したログを破棄し(ステップS3909)、処理のはじめに戻る。関数/メソッドがエラーであった場合には、一時メモリに保存したログをHDDに保存し(ステップS3910)、通常のログ取得処理を引き続き行う(ステップS3911)。この処理はユーザから終了の命令があるまで(ステップS3912)続行される。
図26は、図25のステップS3911で示した通常のログ取得処理の詳細の流れを示す図である。
処理が開始されると(ステップS4001)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS4002)。
次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存し(ステップS4003)、元の関数/メソッドを呼び出す(ステップS4004)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS4005)。
図27は、本実施形態にかかるソフトウェア評価システムの、ログを取得する場合の流れを示す図であり、図23で設定した内容に従い、ログ取得停止と、エラー時のみトリガーを使用する機能とを併用して設定した場合である。
処理が開始されると(ステップS4101)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をHDDに保存する(ステップS4102)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存し(ステップS4103)、元の関数/メソッドを呼び出す(ステップS4104)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS4105)。その後呼び出された関数/メソッドがログ取得停止トリガーとして設定されているか判別する(ステップS4106)。ログ取得停止トリガーと一致した場合には、次にログ取得停止トリガーがエラーでのみ使用するかどうかを判別し(ステップS4107)、そうであれば、関数/メソッドがエラーであるかを判別する(ステップS4108)。もし、エラーである場合は、ログ取得処理は終了する(ステップS4109)。また、この処理はユーザから終了の命令があると(ステップS4110)終了される。
これにより、任意の関数/メソッドでエラーが発生した場合からログの取得を開始したり、停止したりすることが可能ととなり、ユーザの求めるログを取得することが可能になり、ログの解析が容易になるという効果がもたらされる。
[第7の実施形態]
上記第4乃至第6の実施形態におけるユーザインターフェースは、選択可能な関数/メソッドが所定の順序で配列されているにすぎなかったが、インターフェース、メソッドの関係が容易に把握できるようなツリー表示としてもよい。
図28は、本発明の第7の実施形態にかかるインターフェースとメソッドのツリー表示を行うユーザインターフェースを示す図である。
ユーザインターフェースには、インターフェース及びメソッドをツリー表示する為のビュー(380)が備えられている。ユーザがインターフェースInterfaceA(381)をチェックすることで、そのインターフェース内の全てのメソッドMethodAA, MethodAB, MethodAC(382〜384)は全て選択され、ログの取得対象となる。また、インターフェースInterfaceB(385)のチェックを外すことで、そのインターフェース内の全てのメソッドMethodBA, MethodBB, MethodBC(385〜388)は全て選択解除され、ログの取得対象外となる。
図29は、本実施形態にかかるソフトウェア評価システムの、図28のようにログ取得対象を選択した場合の、ログを取得する際の処理の流れを示す図である。
処理が開始されると(ステップS4301)、ログ取得コードはインターフェースの何らかのメソッド呼び出しが行われるたびに、そのメソッドのインターフェースが、ログ取得対象となっているかを判別する(ステップS4302)。ログ取得対象となっていた場合には、モジュール名とインターフェース、メソッド名をHDDに保存する(ステップS4303)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をHDDに保存し(ステップS4304)、元のメソッドを呼び出す(ステップS4305)。メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をHDDに保存する(ステップS4306)。この処理はユーザから終了の命令があるまで(ステップS4307)続行される。これにより、インターフェース、メソッドの関係を更に簡便に知ることができ、また、ログを取得したいインターフェースを容易に選択可能となり、ユーザの、求めるログを取得する方法が簡単になる。
[第8の実施形態]
上記第4乃至第7の実施形態では、任意のメソッドを選択するにあたり、インターフェース単位で選択を行うこととしたが、さらに、メソッド単位で選択を行うことも可能である。
図30は、本実施形態にかかるインターフェースとメソッドのツリー表示を行うユーザインターフェースに関するものであり、図28と同様であるが、選択方法が異なっている。
ユーザインターフェースには、インターフェース及びメソッドをツリー表示する為のビュー(389)が備えられている。ユーザがメソッドMethodAA(391), MethodAC(393), MethodBA(395)をチェックし、MethodAB(392), MethodBB(396), MethodBC(397)のチェックを外すことで、インターフェースInterfaceA(210), InterfaceB(394)内の全てのメソッドではなく、各インターフェースのチェックしたメソッドのみをログの取得対象とすることが可能となる。
図31は、本実施形態にかかるソフトウェア評価システムの、図30のようにログ取得対象を選択した場合の、ログを取得する際の処理の流れを示す図である。
処理が開始されると(ステップS4501)、ログ取得コードはインターフェースの何らかのメソッド呼び出しが行われるたびに、そのインターフェースのメソッドが、ログ取得対象となっているかを判別する(ステップS4502)。ログ取得対象となっていた場合には、モジュール名とインターフェース、メソッド名をHDDに保存する(ステップS4503)。以下の処理(ステップS4504〜S4507)は第7の実施形態における図33と同様である。
これにより、インターフェース毎という大きな範囲ではなく、ログを取得したいメソッドをメソッド単位でそれぞれ容易に選択可能となり、ユーザの求めるログを簡単に取得することができるという効果がもたらされる。
[第9の実施形態]
上記実施形態においては、取得したログをHDDの任意の場所に保存していたが、ログの解析を容易に行うことができるよう、日付ごとに保存するようにしてもよい。
図32は、日付毎にログを分割保存する場合の処理の流れを示す図である。
処理が開始されると(ステップS4601)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をメモリに保存する(ステップS4602)。
次にログ取得コードは、呼び出し時の日付・時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をメモリに保存し(ステップS4603)、元の関数/メソッドを呼び出す(ステップS4604)。関数/メソッドからリターンすると、ログ取得コードはリターン時の日付・時刻、戻り値及びポインタ・パラメータの指すメモリの内容をメモリに保存する(ステップS4605)。その後呼び出された関数/メソッドのリターン時の日付が、前回に保存したログのリターン時の日付と異なるかを判別する(ステップS4606)。日付が異なる場合には、新規のログファイルを作成し、ログをそのファイルに保存する(ステップS4607)、同じ場合には、従来のログファイルにログを保存する(ステップS4608)。この処理はユーザから終了の命令があると(ステップS4609)終了される(ステップS4610)。
これにより、ユーザは求めるログを日付毎に取得することができ、ログの解析が容易になるという効果がもたらされる。
[第10の実施形態]
上記第9の実施形態では、日付ごとにログを保存する場合について述べたが、サイズ毎もしくは個数毎にログを分割して保存するようにしてもよい。
図33は、サイズ毎もしくは個数毎にログを分割保存する場合の処理の流れを示す図である。
処理が開始されると(ステップS4701)、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をメモリに保存する(ステップS4702)。次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をメモリに保存し(ステップS4703)、元の関数/メソッドを呼び出す(ステップS4704)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をメモリに保存する(ステップS4705)。その後新規のログデータを従来のログファイルに保存した場合に、ファイルのサイズが一定値を超えるかもしくはログが一定の個数を超えるかどうかを判別する(ステップS4706)。
ある一定サイズを超えてしまう場合もしくはある一定の個数を超えてしまう場合には、新規のログファイルを作成し、ログをそのファイルに保存する(ステップS4707)、超えない場合には、従来のログファイルにログを保存する(ステップS4708)。新規のログファイルを作成した場合には、リングバッファを使用する場合で且つ、作成したログファイルの数が2個より多いかどうかを判別する(ステップS4709)。もし、条件に当てはまる場合には、最も古いログファイルを削除する(ステップS4710)。この処理はユーザから終了の命令があると(ステップS4711)終了される(ステップS4712)。
これにより、ユーザは複数作成される各ログを、一定サイズ以内や、一定個数毎で取得ができ、取り扱いが容易になる。また、リングバッファを使用することで、本ソフトウェア評価システムがPCのリソースに対して与える負荷を一定に抑えることが可能になり、安定したログの取得を行えるようになる。
[第11の実施形態]
図34は、取得したログを一定数だけメモリに保存する場合のメモリの概要図である。
一定数のログを保存するためのログ格納メモリ領域がn個存在し(398)、各ログ格納メモリ領域には、1回分の関数/メソッドのログが格納され、その情報はモジュール名、インターフェース名、関数/メソッド名、呼び出し時の時刻、呼び出し時のパラメータデータ、終了時の時刻、終了時のパラメータデータ、戻り値データ等が格納され(399)、可変サイズとなる。このメモリ領域には、ログ格納メモリ領域1から順にログデータは格納されていき、ログ格納メモリ領域nまで、使用し終わると、再度、ログ格納メモリ領域1から上書きしてログを格納する。
図35は、取得したログを一定数だけメモリに保存する場合のログ取得の流れを示す図である。
処理が開始されると(ステップS4901)、ログ格納メモリ領域の場所を示す変数xを1に初期化する(ステップS4902)。そして、ログ取得を開始し、モジュール名、インターフェース名、関数/メソッド名をログ格納メモリ領域xに保存する(ステップS4903)。
次にログ取得コードは、呼び出し時の時刻、パラメータ及びポインタ・パラメータの指すメモリの内容をログ格納メモリ領域xに保存し(ステップS4904)、元の関数/メソッドを呼び出す(ステップS4905)。関数/メソッドからリターンすると、ログ取得コードはリターン時の時刻、戻り値及びポインタ・パラメータの指すメモリの内容をログ格納メモリ領域xに保存する(ステップS4906)。
その後ログ格納メモリ領域の場所を示す変数xに1を加算し(ステップS4907)、xがログ格納メモリ領域数のnより大きいかを判別する(ステップS4908)。
xがnより大きい場合にはxに1を代入し、ログ格納メモリ領域の先頭から再度使用するように設定する(ステップS4909)。その後、リングバッファを使用するかを判別し(ステップS4910)、使用しない場合には、メモリ上に有る、全てのログデータをログファイルに保存し(ステップS4911)、メモリ上のログデータを全て削除する(ステップS4912)。この処理はユーザから終了の命令があると(ステップS4913)終了される(ステップS4914)。
これにより、メモリの使用量をある程度の値でとどめることが可能となり、本ソフトウェア評価システムがPCのリソースに対して与える負荷を抑えることが可能になり、安定したログの取得を行えるようになる。
[他の実施形態]
なお、本発明は、複数の機器(例えばホストコンピュータ,インタフェイス機器、リーダ、プリンタなど)から構成されるシステムに適用しても、一つの機器からなる装置(例えば、複写機、ファクシミリ装置など)に適用してもよい。
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ(またはCPUやMPU)が記憶媒体に格納されたプログラムコードを読出し実行することによっても、達成されることは言うまでもない。
この場合、記憶媒体から読出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。
プログラムコードを供給するための記憶媒体としては、例えば、フロッピ(登録商標)ディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、CD−R、磁気テープ、不揮発性のメモリカード、ROMなどを用いることができる。
また、コンピュータが読出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているOS(オペレーティングシステム)などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
さらに、記憶媒体から読出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
以上説明したように本発明によれば、複数にモジュール分けされたソフトウェアの処理ログを容易に取得でき、かつ、ソフトウェアの障害の原因の解析のための工数を削減することが可能となる。
本発明の実施形態とは異なる実施形態であっても、本発明の思想や目的の範囲内において実現されうるならば、本発明は特許請求の範囲に定義された場合を除き、特定の実施形態に限定されるものではない。
第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は、第2の実施形態にかかる関数定義の一例を示す図である。 図11は、第2の実施形態に於いて、ポインタ・パラメータのデータの実体をログとして取得する為のIDLによる記述を示す図である。 図12は、第2の実施形態にかかるログを取得する場合の流れを示す図である。 図13は、第2の実施形態において取得されたログデータの図である。 図14は、第3の実施形態にかかる通常の関数定義によりパラメータを取得することができない関数の一例を示す図である。 図15は、構造体がメモリ内においてどのように記載されたかを示す図である。 図16は、第3の実施形態における、図14に示す関数パラメータのログを取得するためのIDLによる記述を示す図である。 図17は、第3の実施形態における、ログ取得の処理の流れを示すフローチャートである。 第3の実施形態にかかるソフトウェア評価システムにおいて、図16の定義により取得されたログデータの図である。 第4の実施形態で、ログ取得を開始する関数/メソッドを設定するためのユーザインターフェースを示す図である。 第4の実施形態にかかるログを取得する場合の流れを示す図である。 第5の実施形態にかかるログ取得を停止する関数/メソッドを設定するためのユーザインターフェースを示す図である。 第5の実施形態にかかるログを取得する場合の流れを示す図である。 第6の実施形態にかかるエラーで終了した場合のみトリガー機能を使用する設定を追加したユーザインターフェースを示す図である。 第6の実施形態にかかる関数/メソッドのエラー定義の内容を示した図である。 第6の実施形態にかかるログを取得する場合の流れを示す図である。 第6の実施形態にかかる通常のログ取得処理の詳細の流れを示す図である。 第6の実施形態にかかるログを取得する場合の流れを示す図である。 第7の実施形態にかかるインターフェースとメソッドのツリー表示を行うユーザインターフェースを示す図である。 第7の実施形態にかかるログを取得する際の処理の流れを示す図である。 第8の実施形態にかかるインターフェースとメソッドのツリー表示を行うユーザインターフェースを示す図である。 第8の実施形態にかかるログを取得する際の処理の流れを示す図である。 第9の実施形態にかかる日付毎にログを分割保存する場合の処理の流れを示す図である。 第10の実施形態にかかるサイズ毎もしくは個数毎にログを分割保存する場合の処理の流れを示す図である。 第11の実施形態において、取得したログを一定数だけメモリに保存する場合のメモリの概要図である。 第11の実施形態において、取得したログを一定数だけメモリに保存する場合のログ取得の流れを示す図である。

Claims (21)

  1. 所定の処理を行う関数を備えるプログラムの実行中のログを取得するログ取得方法であって、
    ロードされた前記所定の処理を行う関数のアドレスを、ログ取得のための関数のアドレスに書き換える工程を備え、
    前記ログ取得のための関数は、
    前記所定の処理を行う関数を呼び出し、該所定の処理を実行させ、受け取った実行結果を前記プログラムに渡す工程と、
    前記プログラム内の関数定義において、ポインタ・パラメータが所定の定義方法で定義されているか否かを判断する工程と、
    ポインタ・パラメータが所定の定義方法で定義されていた場合、該定義方法に基づいて該ポインタ・パラメータの指すメモリの内容をログとして記録する工程と
    を備えることを特徴とするログ取得方法。
  2. 前記ポインタ・パラメータの種類は、インデックス構造体により定義され、前記判断する工程は、当該インデックス構造体の指定されたメンバーを参照することにより、当該ポインタ・パラメータの種類を判断する工程を含むことを特徴とする請求項1に記載のログ取得方法。
  3. 前記インデックス構造体のメンバーのうちの少なくともいくつかは、様々な種類の非エクスポート関数であることを特徴とする請求項2に記載のログ取得方法。
  4. 前記インデックス構造体のメンバーの少なくともいくつかは、様々な種類の構造体であることを特徴とする請求項2に記載のログ取得方法。
  5. ログ取得のための前記関数は更に前記定義に基づいてメモリサイズを算出する工程を備え、前記記録工程は、前記ポインタ・パラメータの指すメモリの内容量であって、前記算出されたメモリサイズに等しい量を記録することを備えることを特徴とする請求項1乃至4のいずれかに記載のログ取得方法。
  6. 前記呼び出す工程の前に、ログ取得のための少なくとも1つの前記関数を選択する工程を備えることを特徴とする請求項1乃至4のいずれかに記載のログ取得方法。
  7. ログの記録を停止させるための少なくとも1つの関数を選択する工程と、
    ログの記録を停止させるための少なくとも1つの関数が、ログの記録後にログの記録を停止する工程と
    を備えることを特徴とする請求項1乃至4のいずれかに記載のログ取得方法。
  8. 前記ログ取得のための関数は、前記選択工程において選択された少なくとも1つの関数の実行中にエラーが発生していないか否かを判断する工程を更に備え、当該エラー判断工程においてエラーが発生したと判断された場合に、前記記録工程が開始されることを特徴とする請求項6に記載のログ取得方法。
  9. 前記ログ取得のための関数は、前記選択工程において選択された少なくとも1つの関数の実行中にエラーが発生していないか否かを判断する工程を更に備え、当該エラー判断工程においてエラーが発生したと判断された場合に、前記ログ記録の停止工程により、ログの記録が停止されることを特徴とする請求項7に記載のログ取得方法。
  10. COMサーバによりエクスポートされたインターフェースと、該インターフェースに属する関数とをツリー形式で表示する工程を更に備え、前記選択工程は前記表示を介して選択を実行することを特徴とする請求項6に記載のログ取得方法。
  11. COMサーバによりエクスポートされたインターフェースと、該インターフェースに属する関数とをツリー形式で表示する工程を更に備え、前記選択工程は前記表示を介して関数を選択することを特徴とする請求項7に記載のログ取得方法。
  12. 前記選択工程は、関数毎の基準で選択を実行することを特徴とする請求項10に記載のログ取得方法。
  13. 前記選択工程は、関数毎の基準で選択を実行することを特徴とする請求項11に記載のログ取得方法。
  14. 前記選択工程は、前記インターフェースを選択することにより、前記インターフェースに属する全ての関数を選択することを特徴とする請求項10に記載のログ取得方法。
  15. 前記選択工程は、前記インターフェースを選択することにより、前記インターフェースに属する全ての関数を選択することを特徴とする請求項11に記載のログ取得方法。
  16. 前記記録する工程は、日毎の基準でログを記録することを特徴とする請求項6に記載のログ取得方法。
  17. ログのサイズが所定のサイズを超えた場合に、前記ログ記録工程は、新たにファイルを生成することを特徴とする請求項6に記載のログ取得方法。
  18. ログの数が所定の数を超えた場合に、前記ログ記録工程は、新たにファイルを生成することを特徴とする請求項6に記載のログ取得方法。
  19. メモリ内にログとして記録する前記工程は、該メモリ内のログの数が所定の数を超えた場合に、ディスク装置に該ログを移動し保存することを特徴とする請求項6に記載のログ取得方法。
  20. 請求項1乃至19のいずれかに記載のログ取得方法をコンピュータによって実行させるための制御プログラムを格納した記録媒体。
  21. 請求項1乃至19のいずれかに記載のログ取得方法をコンピュータによって実現させるための制御プログラム。
JP2004377887A 2003-12-30 2004-12-27 ログ取得方法およびプログラム、記憶媒体 Expired - Fee Related JP4155583B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2003101245667A CN100347669C (zh) 2003-12-30 2003-12-30 运行日志取得方法

Publications (3)

Publication Number Publication Date
JP2005196779A true JP2005196779A (ja) 2005-07-21
JP2005196779A5 JP2005196779A5 (ja) 2007-01-18
JP4155583B2 JP4155583B2 (ja) 2008-09-24

Family

ID=34800339

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004377887A Expired - Fee Related JP4155583B2 (ja) 2003-12-30 2004-12-27 ログ取得方法およびプログラム、記憶媒体

Country Status (3)

Country Link
US (1) US7426660B2 (ja)
JP (1) JP4155583B2 (ja)
CN (1) CN100347669C (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009070170A (ja) * 2007-09-13 2009-04-02 Ricoh Co Ltd 情報処理装置、情報処理プログラム、情報処理プログラムを記録する記録媒体

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4125169B2 (ja) * 2003-04-02 2008-07-30 キヤノン株式会社 ログ取得方法
US8045474B2 (en) * 2005-01-26 2011-10-25 Cisco Technology, Inc. Method and apparatus for tracking layer-2 (L2) resource of a switch
JP4681923B2 (ja) * 2005-04-01 2011-05-11 キヤノン株式会社 情報処理装置及びその制御方法、コンピュータプログラム、記憶媒体
US20070083792A1 (en) * 2005-10-11 2007-04-12 Mcdermott Andrew System and method for error detection and reporting
CN103092742B (zh) 2011-10-31 2015-08-19 国际商业机器公司 程序日志记录优化方法和系统
US9436588B2 (en) 2012-09-28 2016-09-06 Identify Software Ltd. (IL) Efficient method data recording
US9501346B2 (en) * 2014-01-21 2016-11-22 Oracle International Corporation Fine and coarse granularity logging handler
CN107517128B (zh) * 2017-08-24 2020-06-19 北京小米移动软件有限公司 数据传输方法、装置和设备
CN111767249B (zh) * 2019-04-02 2022-11-04 上海寒武纪信息科技有限公司 确定函数自身运行时间的方法及装置
CN110727641B (zh) * 2019-10-21 2023-10-27 中国民航信息网络股份有限公司 一种日志的查找方法及装置
CN114827636A (zh) * 2021-01-18 2022-07-29 武汉斗鱼网络科技有限公司 一种视频播放异常的诊断方法及相关装置

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5732272A (en) * 1995-07-31 1998-03-24 Apple Computer, Inc. Subroutine execution time tracer
JPH10269105A (ja) * 1997-01-27 1998-10-09 N T T Data Tsushin Kk トレースシステム、リソース解放漏れ検出システム及び記録媒体
EP1027652A1 (en) * 1997-11-07 2000-08-16 Intergraph Corporation Apparatus and method for logging information relating to function calls to a function library
JP3284539B2 (ja) * 1998-04-22 2002-05-20 日本電気株式会社 プログラムライブラリ管理システム
US7216056B2 (en) * 2001-12-06 2007-05-08 C-Live, Inc. Access log analyzer and access log analyzing method
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

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009070170A (ja) * 2007-09-13 2009-04-02 Ricoh Co Ltd 情報処理装置、情報処理プログラム、情報処理プログラムを記録する記録媒体

Also Published As

Publication number Publication date
CN1635470A (zh) 2005-07-06
JP4155583B2 (ja) 2008-09-24
CN100347669C (zh) 2007-11-07
US20050171731A1 (en) 2005-08-04
US7426660B2 (en) 2008-09-16

Similar Documents

Publication Publication Date Title
US5870607A (en) Method and apparatus for selective replay of computer programs
US6779187B1 (en) Method and system for dynamic interception of function calls to dynamic link libraries into a windowed operating system
JP4155583B2 (ja) ログ取得方法およびプログラム、記憶媒体
JP3290280B2 (ja) 情報処理装置
US7743228B2 (en) Information processing apparatus and method for obtaining software processing log
US8887141B2 (en) Automatically modifying a native code module accessed from virtual machine bytecode to determine execution information
US7086034B2 (en) Method, program, and storage medium for acquiring logs
US6792559B1 (en) Performing operations in an environment recreated from system dump information
US7188279B2 (en) Method, program, and storage medium for acquiring logs
JP4280749B2 (ja) ログ取得方法およびプログラム、記憶媒体
US20050114847A1 (en) Method, apparatus and computer program for automatically determining compile-time module dependencies
US8209707B2 (en) Gathering state information for an application and kernel components called by the application
CN101196848B (zh) 运行日志获取方法
US6735774B1 (en) Method and apparatus for system call management
JP4125055B2 (ja) ログ取得方法
EP3635561B1 (en) Asynchronous operation query
CN116909819A (zh) 一种处理器调试方法、装置、计算机设备及处理器
US8510757B2 (en) Gathering pages allocated to an application to include in checkpoint information
CN110928779B (zh) 文件处理方法、应用程序运行故障定位方法和设备
JP4125053B2 (ja) ログ取得方法
JP4125056B2 (ja) ログ取得方法
JP4125054B2 (ja) ログ取得方法
US6789160B2 (en) Multi-threaded random access storage device qualification tool
CN112130868B (zh) 一种系统的灌装方法、系统、设备以及介质
CN116248757A (zh) 可执行文件的格式设置方法、数据流程序迁移方法及装置

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20061129

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20070912

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A132

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: 20080414

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080612

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: 20080704

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: 20080707

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110718

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120718

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120718

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130718

Year of fee payment: 5

LAPS Cancellation because of no payment of annual fees