專利名稱::運(yùn)行日志獲取方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種可容易地獲取被分成為多個模塊的軟件的運(yùn)行日志的方法。
背景技術(shù):
:歷來,對于重現(xiàn)率低的軟件故障,是通過獲取并分析該軟件的處理運(yùn)行日志(LOG)而查清故障的原因、進(jìn)而加以解決的。然而,在獲取上述現(xiàn)有的處理運(yùn)行日志方面存在以下的問題。(1)為了獲取運(yùn)行日志,必須對軟件的模塊加以調(diào)整以增加處理運(yùn)行日志獲取的例行程序。相應(yīng)地,這將加大為獲取處理運(yùn)行日志的作業(yè)負(fù)擔(dān)。(2)由于處理運(yùn)行日志的獲取是針對每個模塊進(jìn)行,生成的運(yùn)行日志是以模塊為單位的。這樣很難獲取整個軟件處理的按照時間順序的運(yùn)行日志。因此,由于不能對整個處理運(yùn)行日志進(jìn)行充分的預(yù)測,需要大量人力來分析運(yùn)行日志以便發(fā)現(xiàn)故障原因。為解決上述問題,日本專利申請公報No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465分別提供了一種可容易地獲取被分成為多個模塊的軟件的運(yùn)行日志的方法,用于減小分析軟件故障原因所需的人力。上述每個方法基本上都是獲取所有稱為EXE的函數(shù)/方法的處理運(yùn)行日志,因此同樣可能需要大量的處理運(yùn)行日志。盡管日本專利申請公報No.2003-099465提供了如下的一個實施例(第二實施例部分1-3),其中將稱為EXE的函數(shù)/方法的處理運(yùn)行日志的獲取目標(biāo)通過在API跟蹤程序中指定“操作系統(tǒng)的界面”和“界面下的例外模塊”而被限制在操作系統(tǒng)的界面之下以及一些特定的例外模塊,來獲取處理運(yùn)行日志。但是這種方法仍需要大量的處理運(yùn)行日志。
發(fā)明內(nèi)容本發(fā)明考慮了上述問題,其目的在于提供一種通過選擇性地獲取軟件的處理運(yùn)行日志,容易地獲取被分成為多個模塊的軟件的運(yùn)行日志的方法。本發(fā)明可以減少分析軟件錯誤故障所需的處理數(shù)量。本發(fā)明還提供用于藉助計算機(jī)實現(xiàn)該方法的程序和存放該程序的存儲介質(zhì)。為達(dá)到上述目的,本發(fā)明提供了一種運(yùn)行日志獲取方法,用于獲取包括至少一個執(zhí)行預(yù)定處理的函數(shù)在內(nèi)的程序的運(yùn)行日志,包括用于將被加載的用于執(zhí)行上述預(yù)定處理的所述函數(shù)的地址改為用于獲取運(yùn)行日志的函數(shù)的地址的步驟,其中所述用于獲取運(yùn)行日志的函數(shù)包含以下步驟確定一個結(jié)構(gòu)參數(shù)是否在所述程序的函數(shù)定義中被指定為指向一個結(jié)構(gòu)的結(jié)構(gòu)指針;和如果所述結(jié)構(gòu)參數(shù)被指定為結(jié)構(gòu)指針,確定在所述函數(shù)定義中是否已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次,并確定該結(jié)構(gòu)的數(shù)據(jù)成員是否為指向另一結(jié)構(gòu)的指針;以及至少在確定所述函數(shù)定義中已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次之后,比較所述已經(jīng)被調(diào)用的結(jié)構(gòu)的層次和所述預(yù)定層次。優(yōu)選的是,所述用于獲取運(yùn)行日志的函數(shù)還包含以下步驟至少在確定所述結(jié)構(gòu)參數(shù)被指定為結(jié)構(gòu)指針之后,記錄該指針?biāo)赶虻膬?nèi)存內(nèi)容,該內(nèi)存內(nèi)容將成為與在所述軟件的函數(shù)定義中定義的結(jié)構(gòu)相關(guān)的一部分運(yùn)行日志。優(yōu)選的是,所述用于獲取運(yùn)行日志的函數(shù)還包含以下步驟如果所述結(jié)構(gòu)的數(shù)據(jù)成員同樣是指向另一結(jié)構(gòu)的指針并且所述已經(jīng)被調(diào)用的結(jié)構(gòu)的層次小于所述預(yù)定層次,還記錄所述結(jié)構(gòu)的數(shù)據(jù)成員的指針?biāo)赶虻膬?nèi)存內(nèi)容,該內(nèi)存內(nèi)容將成為與在所述軟件的函數(shù)定義中定義的結(jié)構(gòu)相關(guān)的另一部分運(yùn)行日志。因此可以重復(fù)地執(zhí)行上述處理,除非所述結(jié)構(gòu)的數(shù)據(jù)成員并非指向處于下一層次中的另一結(jié)構(gòu)的指針、或者所述已經(jīng)被調(diào)用的層次大于或等于所述預(yù)定層次。優(yōu)選的是,所述用于獲取運(yùn)行日志的函數(shù)還包含調(diào)用執(zhí)行所述預(yù)定處理的函數(shù)、使該函數(shù)執(zhí)行所述預(yù)定處理、以及將所接收到的執(zhí)行結(jié)果傳送至該程序的步驟;記錄在調(diào)用所述執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息的步驟;以及記錄在接收所述執(zhí)行結(jié)果時的預(yù)定信息的步驟。在調(diào)用所述執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息包括如下信息的至少一個所調(diào)用函數(shù)的函數(shù)名、調(diào)用時的時間、調(diào)用時的參數(shù)以及調(diào)用時所述指針參數(shù)指向的內(nèi)存內(nèi)容。在接收所述執(zhí)行結(jié)果時的預(yù)定信息包括如下信息的至少一個接收時的時間、接收時的參數(shù)、接收時的返回值以及接收時所述指針參數(shù)指向的內(nèi)存內(nèi)容。另外,在提供所述函數(shù)的動態(tài)鏈接庫的輸入函數(shù)地址表中記述了所述執(zhí)行預(yù)定處理的函數(shù)的地址。另外,如果沒有設(shè)定所述數(shù)據(jù)成員的預(yù)定層次,則所述調(diào)用執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息和接收所述執(zhí)行結(jié)果時的預(yù)定信息可以不包括結(jié)構(gòu)指針?biāo)付ǖ膬?nèi)存內(nèi)容,因此不會有被所述指針?biāo)赶虻慕Y(jié)構(gòu)的內(nèi)存內(nèi)容被輸出。本發(fā)明可以利用在程序中設(shè)定的數(shù)據(jù)成員的預(yù)定層次來控制上述運(yùn)行日志獲取處理的層次,根據(jù)本發(fā)明,可以容易地且選擇性地獲取被分成為多個模塊的軟件的運(yùn)行日志的方法,可以減少分析軟件錯誤原因以及進(jìn)行軟件維護(hù)所需的處理數(shù)量。本發(fā)明的所述方法不僅可用于跟蹤Java應(yīng)用程序,而且可用于跟蹤由其它程序,例如C、C++、PASCAL等開發(fā)的應(yīng)用程序。本發(fā)明的其他特點和優(yōu)點可從參考下面的加以了解,附圖中同樣或類似的部件用相同的標(biāo)號表示。包括在本說明書中并構(gòu)成其一個組成部分的附圖例舉了本發(fā)明的各個具體實施方式,并且與說明書一起用于說明本發(fā)明的原理。圖1為實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的計算機(jī)(軟件評價系統(tǒng))的配置的框圖。圖2示出通常函數(shù)加載時的內(nèi)存構(gòu)成。圖3示出利用IATPatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)存構(gòu)成。圖4A是利用IATPatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的狀態(tài)的視圖。圖4B為示出實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的運(yùn)行日志獲取處理的流程圖。圖5為示出利用IATPatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)部設(shè)置的示意圖。圖6示出生成COM服務(wù)器的接口的事例(instance)時的通常的內(nèi)存構(gòu)成。圖7為利用VTablePatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)存構(gòu)成圖8A是利用VTablePatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的狀態(tài)的視圖。圖8B為示出實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的運(yùn)行日志獲取處理的流程圖。圖9為示出利用IATPatch實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)部設(shè)置的示意圖。圖10示出向軟件評價系統(tǒng)指示各個函數(shù)和方法的參數(shù)和返回值格式的函數(shù)定義文件的例子。圖11示出實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的所獲得的運(yùn)行日志的例子。圖12示出實施根據(jù)本發(fā)明第二實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的函數(shù)定義文件。圖13示出在如圖12所示定義函數(shù)時在軟件評價系統(tǒng)中獲取運(yùn)行日志的處理的流程圖。圖14例舉了具有結(jié)構(gòu)參數(shù)并用于描述根據(jù)圖13的流程圖的函數(shù)。圖15示出在不使用用于待輸出數(shù)據(jù)成員的預(yù)定層次時,根據(jù)本發(fā)明利用圖12所示的定義在軟件評價系統(tǒng)中獲取的運(yùn)行日志數(shù)據(jù)。圖16示出在使用用于待輸出數(shù)據(jù)成員的預(yù)定層次時,根據(jù)本發(fā)明利用圖12所示的定義在軟件評價系統(tǒng)中獲取的運(yùn)行日志數(shù)據(jù)。具體實施例方式下面參照附圖對本發(fā)明的優(yōu)選實施方式予以詳細(xì)說明。本實施例,是在給定模塊調(diào)用存在于另一個模塊內(nèi)的函數(shù)時,利用輸入函數(shù)地址或虛擬函數(shù)地址表(VirtualAddressTable)作為使用機(jī)構(gòu)、通過掛接模塊間的函數(shù)調(diào)用并將其記錄在運(yùn)行日志中,以時間順序?qū)⒄麄€軟件的處理作為處理運(yùn)行日志獲取,而無需對軟件的模塊本身進(jìn)行調(diào)整。下面具體說明。<系統(tǒng)配置>圖1為實施本發(fā)明優(yōu)選實施例的運(yùn)行日志獲取方法的計算機(jī)(軟件評價系統(tǒng))的配置的框圖。為簡化說明起見,本軟件評價系統(tǒng)是構(gòu)筑在一臺PC的內(nèi)部。然而,本發(fā)明的運(yùn)行日志獲取方法無論構(gòu)筑于一臺PC內(nèi)部還是在由多個PC構(gòu)筑的網(wǎng)絡(luò)系統(tǒng)中都有效。在實施該實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)包括CPU1、芯片組2、RAM3、硬盤控制器4、顯示控制器5、硬盤驅(qū)動器6、CD-ROM驅(qū)動器7及顯示器8。另外,該軟件評價系統(tǒng)包括還包括連接CPU1和芯片組2的信號線11、連接芯片組2和RAM3的信號線12、連接芯片組2和各種外圍設(shè)備的外圍設(shè)備總線13、連接硬盤控制器4和硬盤驅(qū)動器6的信號線14、連接硬盤控制器4和CD-ROM驅(qū)動器7的信號線15以及連接顯示控制器5和顯示器8的信號線16。<涉及函數(shù)處理的運(yùn)行日志的獲取>為了說明實施本發(fā)明的第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng),首先利用圖2,對分成為多個模塊的軟件在通常的狀態(tài)下如何加載到內(nèi)存中予以說明。通常,被分成為多個模塊的軟件,被分成為進(jìn)行整體控制的執(zhí)行文件EXE(23)和作為模塊存在并擔(dān)負(fù)補(bǔ)充EXE的任務(wù)的動態(tài)鏈接庫DLL(27),在內(nèi)存中加載EXE和DLL。EXE由代碼段(28)和數(shù)據(jù)段(29)、輸入函數(shù)地址表(22)構(gòu)成。此外,輸入函數(shù)地址表根據(jù)函數(shù)所屬的DLL被分開(21、24),并且記述針對每個DLL中的函數(shù)加載地址(30~35)。DLL函數(shù)的實例按各個DLL(25、26)分別加載,各個函數(shù)作為相應(yīng)DLL的一部分被加載(36~41)。在圖2中,一個EXE使用A.DLL及B.DLL兩個動態(tài)鏈接庫內(nèi)的函數(shù),即實際使用的函數(shù)為FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC等六個。當(dāng)EXE的代碼段內(nèi)的代碼調(diào)用函數(shù)FuncAA時,首先讀取寫在輸入函數(shù)地址表(22)內(nèi)的FuncAA的地址(30)。實際上輸入函數(shù)地址表記述作為A.DLL的一部分而加載的FuncAA代碼(36)的地址,EXE的代碼可以通過調(diào)用該地址而調(diào)用A.DLL的FuncAA。圖3為實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)存構(gòu)成,與圖2的不同之處在于對運(yùn)行日志獲取代碼采用所謂的IATPatch(輸入函數(shù)地址表補(bǔ)丁,ImportAddressTablePatch)的方案,對函數(shù)調(diào)用進(jìn)行重定向。在開始運(yùn)行日志的獲取時,將用于IATPatch的C.DLL(58)作為DLL加載到內(nèi)存中。C.DLL(58)將輸入函數(shù)地址表(52)內(nèi)寫入的函數(shù)的地址改寫為作為C.DLL(58)內(nèi)的運(yùn)行日志獲取代碼的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的地址(61~66)。C.DLL(58)內(nèi)的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的代碼(73~78),記錄運(yùn)行日志,并調(diào)用被加載到準(zhǔn)備接受原始函數(shù)調(diào)用的內(nèi)存中的FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC(67~72)。圖4A示出圖3的IATPatch的處理,而圖4B為示出運(yùn)行日志獲取處理的流程的流程圖。為了簡化說明起見,圖4A和圖4B示出在EXE調(diào)用A.DLL內(nèi)的FuncAA之際,IATPatch產(chǎn)生的運(yùn)行日志獲取代碼是如何運(yùn)行的示例。在EXE(圖4A中的91)調(diào)用FuncAA(94)時,C.DLL(58)中的運(yùn)行日志調(diào)用將DLL名(C.DLL)/函數(shù)名(FuncAA)保存到內(nèi)存中(圖4B中的步驟S402)、將調(diào)用時的時間保存于內(nèi)存中、將調(diào)用時的參數(shù)保存于內(nèi)存中、將調(diào)用時的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個內(nèi)存中(圖4A中的95、圖4B中的步驟S403)。其后,C.DLL調(diào)用本來應(yīng)被原始調(diào)用的A.DLL(圖4A中的93)內(nèi)的FuncAA(圖4A中的99、圖4B中的步驟S404)。一旦A.DLL的FuncAA處理(圖4A中的97)結(jié)束,并將控制返回C.DLL(圖4A中的98)的話,C.DLL就將返回時的時間保存于內(nèi)存中,將返回值保存于內(nèi)存中,并將返回時的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個內(nèi)存中(圖4A中的99)。其后,C.DLL將保存的運(yùn)行日志信息寫入文件(圖4A中的100、圖4B中的步驟S405),控制返回EXE,如同A.DLL的FuncAA正常結(jié)束一樣(圖4A中的101)。圖5為實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的功能配置的示圖。通常,執(zhí)行文件EXE(113)調(diào)用DLL-1(116)及DLL-2(117)內(nèi)的函數(shù)。但是,在此處,嵌入被稱為API跟蹤程序(114)的運(yùn)行日志獲取代碼,以便生成處理運(yùn)行日志(115)。API跟蹤程序(114),根據(jù)記述DLL-1及DLL-2的函數(shù)定義的文件(111)以及指定DLL和函數(shù)(以及層次)的設(shè)定情景(追蹤情景112)而運(yùn)行,其輸入地址表在獲取運(yùn)行日志時被重寫。<涉及方法處理的運(yùn)行日志的獲取>下面,在實施第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)中,為了說明執(zhí)行文件EXE在生成由COM(構(gòu)件對象模型)服務(wù)器輸出的接口的事例(instance)時是如何被加載到內(nèi)存中,首先參照圖6對在通常的狀態(tài)下如何加載到內(nèi)存的情況予以說明。通常,在生成接口事例(instance)時,在COM服務(wù)器內(nèi)生成被請求的接口(121、122)及其方法(在面向?qū)ο缶幊讨杏浭隽藢ο笏鶊?zhí)行的過程的程序130~135),這兩者都被加載到內(nèi)存中。此處,虛擬地址表(118、120,virtualaddresstable)與所生成的事例相對應(yīng)地制備,并被傳送至用于執(zhí)行生成請求的EXE。每個虛擬地址表記述所述方法的生成地址(124~129)。EXE利用這些信息對各個接口進(jìn)行調(diào)用。圖5例舉了一個EXE生成兩個接口、即InterfaceA(121)和InterfaceB(122)的事例,并使用該接口內(nèi)的方法的示例,實際使用的方法為MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(130~135)。在EXE的代碼調(diào)用函數(shù)MethodAA的時候,讀出寫在虛擬地址表內(nèi)的MethodAA的地址(124)。該表實際上記述了作為COM服務(wù)器的一部分InterfaceA而生成的MethodAA代碼(130)的地址,通過調(diào)用該地址,EXE的代碼可以調(diào)用InterfaceA的MethodAA。圖7示出了實施本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的內(nèi)存構(gòu)成,與圖6的不同之處在于對運(yùn)行日志獲取代碼采用所謂的VTablePatch(虛擬地址表補(bǔ)丁,virtualaddresstablePatch)的方法,對方法調(diào)用進(jìn)行重定向。在開始獲取運(yùn)行日志時,在內(nèi)存中加載用于VTablePatch的DLL(143)。此DLL將寫在虛擬地址表(136、138)內(nèi)的方法的地址改寫為作為DLL內(nèi)運(yùn)行日志獲取代碼的MethodA′A、MethodA′B、MethodA′C、MethodB′A、MethodB′B、MethodB′C的地址(145~150)。DLL中的MethodA′A、MethodA′B、MethodA′C、MethodB′A、MethodB′B、MethodB′C的代碼(157~162),記錄運(yùn)行日志,并調(diào)用作為對應(yīng)方法的MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(157~162)。圖8A為示出圖7的VTablePatch處理的示圖,圖8B為示出運(yùn)行日志獲取處理的流程的流程圖。為了簡化起見,在此圖中,圖8A和圖8B示出在EXE調(diào)用COM服務(wù)器內(nèi)的InterfaceA的MethodAA之際,VTablePatch產(chǎn)生的運(yùn)行日志獲取代碼是如何運(yùn)作的示例。EXE(圖8A中的163)一調(diào)用MethodAA(圖8A中的166),DLL(164)中的運(yùn)行日志獲取代碼將模塊名/接口名/方法名保存到內(nèi)存中(圖8B中的步驟S802)、將調(diào)用時間保存于內(nèi)存中、將調(diào)用時的參數(shù)保存于內(nèi)存中、將調(diào)用時的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個內(nèi)存中(圖8A中的167、圖8B中的步驟S803)。其后,DLL調(diào)用應(yīng)該被原始調(diào)用的COM服務(wù)器(圖8A中的165)內(nèi)的MethodAA(圖8A中的168、圖8B中的步驟S804)。如COM服務(wù)器的MethodAA處理(圖8A中的169)結(jié)束,并將控制返回DLL(圖8A中的164)的話,DLL(164)就將返回時的時間保存于內(nèi)存中,將返回值保存于內(nèi)存中,并將返回時的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個內(nèi)存中(圖8A中的171)。其后,DLL將保存的運(yùn)行日志信息寫入文件(圖8A中的172、圖8B中的步驟S805)中,控制返回EXE,如同COM服務(wù)器的MethodAA正常結(jié)束一樣(圖8A中的173)。圖9為實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的功能配置的示圖。通常,執(zhí)行文件EXE(176)調(diào)用COM服務(wù)器1(179)及COM服務(wù)器2(180)內(nèi)的方法,此處,嵌入被稱為API跟蹤程序(177)的運(yùn)行日志獲取代碼,以便生成處理運(yùn)行日志(178)。API跟蹤程序(177),根據(jù)記述COM服務(wù)器1(179)及COM服務(wù)器2(180)的函數(shù)定義的文件(174)和指定COM服務(wù)器、接口和方法的設(shè)定情景(跟蹤情景175)而運(yùn)行,其虛擬地址表在獲取運(yùn)行日志時被重寫。圖10示出向軟件評價系統(tǒng)指示各個函數(shù)和方法的參數(shù)和返回值格式的函數(shù)定義文件的例子。該文件記述了DLL/接口名和函數(shù)/方法名(“函數(shù)/方法”指“函數(shù)或方法”,同樣適用于以下的描述),以及與這些函數(shù)/方法相對應(yīng)的參數(shù)和返回值類型。根據(jù)該實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)根據(jù)該函數(shù)定義文件所指令的內(nèi)容確定各個函數(shù)/方法的參數(shù)/返回值,并獲得其內(nèi)容以作為運(yùn)行日志。圖11示出使用圖10所示的函數(shù)定義文件,實施根據(jù)本發(fā)明第一實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的所獲得的運(yùn)行日志的例子。生成響應(yīng)于各個調(diào)用函數(shù)/方法時的時間以及相應(yīng)的參數(shù)/返回值,以作為運(yùn)行日志。從以上的說明可知,根據(jù)本實施方式的運(yùn)行日志獲取方法,在獲取被分成為多個模塊的軟件的處理運(yùn)行日志中,可將模塊內(nèi)制備的函數(shù)/方法的調(diào)用作為運(yùn)行日志進(jìn)行記錄,而無需對模塊本身進(jìn)行調(diào)整,因而可以減少用于獲取處理運(yùn)行日志的作業(yè)負(fù)擔(dān)。另外,可以獲取按照時間順序的運(yùn)行日志,并使得對運(yùn)行日志的分析變得容易,由此可以減少用于分析軟件故障原因的工時。以下描述涉及那些具有帶有類參數(shù)的或?qū)儆诮Y(jié)構(gòu)數(shù)據(jù)類型的函數(shù)的函數(shù)/方法,其中可以選擇性地限制由EXE所調(diào)用的函數(shù)/方法的處理運(yùn)行日志的獲取對象。圖12示出實施根據(jù)本發(fā)明第二實施例的運(yùn)行日志獲取方法的軟件評價系統(tǒng)的函數(shù)定義文件。其中定義的函數(shù)“FuncComplexStruct”具有兩種類型的參數(shù)“index”和“l(fā)pClsL1”,“l(fā)pClsL1”被確定為類參數(shù)。在該函數(shù)定義文件中,為簡化起見,假定有7個層次類參數(shù),從第一至第六層次中的結(jié)構(gòu)體“struct”都包括數(shù)據(jù)成員和結(jié)構(gòu)指針,且該結(jié)構(gòu)指針指向下一層次的結(jié)構(gòu),而在最后一層次中的“struct”僅包括數(shù)據(jù)成員。因此,在函數(shù)定義文件分別定義了位于七個嵌套層次中的七個“struct”(typedefstruct),在“struct”中,結(jié)構(gòu)指針被分別定義為LPCLS_L2,LPCLS_L3,LPCLS_L4,LPCLS_L5,LPCLS_L6和LPCLS_L7。圖13示出在如圖12所示定義函數(shù)時在軟件評價系統(tǒng)中獲取運(yùn)行日志的處理的流程圖。在步驟1301,開始處理,在步驟1302,開始運(yùn)行日志獲取并將模塊名、接口名、方法名(或函數(shù)名/方法名)存儲在內(nèi)存(或者直接存儲在HDD)中。在步驟1303,確定參數(shù)是否被指定為一個結(jié)構(gòu)指針,如果該參數(shù)并被被指定為一個結(jié)構(gòu)指針,則該處理程序直接跳至步驟1309。與第一實施例中類似地繼續(xù)與選擇層次無關(guān)的其它處理,即將調(diào)用時的時間、參數(shù)以及結(jié)構(gòu)參數(shù)指向的內(nèi)容存儲在HDD中(見步驟1309);然后調(diào)用原始函數(shù)(見步驟1310);將返回時的時間、返回值以及結(jié)構(gòu)參數(shù)指向的內(nèi)存內(nèi)容存儲在HDD中(見步驟1311);然后該處理程序可以返回至步驟1302并執(zhí)行所述函數(shù)/方法的返回處理,直至用戶指令一個結(jié)束命令(見步驟1312)。如果在步驟1303確定參數(shù)是一個結(jié)構(gòu)指針,則該處理程序根據(jù)函數(shù)定義中定義的結(jié)構(gòu)體(struct)類型查找到或記錄由該結(jié)構(gòu)指針?biāo)赶虻膬?nèi)存內(nèi)容(見步驟1304),然后在步驟1305確定該結(jié)構(gòu)的數(shù)據(jù)成員是否也是一個結(jié)構(gòu)指針。如果數(shù)據(jù)成員不是一個結(jié)構(gòu)指針,則該處理程序跳至步驟1309,重復(fù)步驟1309至步驟1312。如果在步驟1305確定該結(jié)構(gòu)的數(shù)據(jù)成員是一個結(jié)構(gòu)指針,則該處理程序確定是否已經(jīng)設(shè)定預(yù)定層次(見步驟1306);如果并未設(shè)定預(yù)定層次,則該處理程序跳至步驟1309,重復(fù)步驟1309至步驟1312。在此步驟1309由EXE調(diào)用的所有函數(shù)/方法的處理運(yùn)行日志都存儲在HDD中,可選擇地,該處理程序可增加一個通知用戶未設(shè)定預(yù)定層次的步驟或請求用戶確認(rèn)的步驟??商娲?,如果沒有設(shè)定預(yù)定層次,則該處理程序可以僅將目的模塊記錄到操作系統(tǒng)模塊列表中,調(diào)用原始函數(shù),并且跳至步驟1312;或者,調(diào)用執(zhí)行預(yù)定處理的函數(shù)時記錄的預(yù)定信息和接收執(zhí)行結(jié)果時的預(yù)定信息可以不包括結(jié)構(gòu)指針?biāo)付ǖ膬?nèi)存內(nèi)容,因此不會有被所述指針?biāo)赶虻慕Y(jié)構(gòu)的內(nèi)存內(nèi)容被輸出。如果在步驟1306設(shè)定了預(yù)定層次,則處理程序確定待輸出的數(shù)據(jù)成員的當(dāng)前層次是否小于所述預(yù)定層次(在步驟1307)。如果所述數(shù)據(jù)成員的當(dāng)前層次大于或等于所述預(yù)定層次,則處理程序跳至步驟1309,并重復(fù)步驟1309至步驟1312,在步驟1309,所存儲的內(nèi)存內(nèi)容即是在數(shù)據(jù)成員的預(yù)定層次內(nèi)的由上述指針參數(shù)所指向的內(nèi)容。如果在步驟1307所述數(shù)據(jù)成員的當(dāng)前層次小于所述預(yù)定層次,則處理程序使數(shù)據(jù)成員的當(dāng)前層次增加1(在步驟1308),然后執(zhí)行步驟1304,開始執(zhí)行函數(shù)/方法的返回處理。另外,從步驟1303至步驟1306的處理也適用于執(zhí)行返回或循環(huán)處理。為更好地解釋上述步驟,在此提供一個參照圖14所示函數(shù)詳細(xì)地描述步驟1303至1309的示例,其中假設(shè)預(yù)定層次被設(shè)定為2,用于在步驟1307中判斷當(dāng)前層次是否小于2;被追蹤的函數(shù)具有一個稱為P的結(jié)構(gòu)指針參數(shù),例如圖14中的Func(Struct_Ap*);結(jié)構(gòu)體Struct_A包括一個稱為AA的數(shù)據(jù)成員(在此AA可以是除了指針之外的任何其它內(nèi)容)以及一個結(jié)構(gòu)指針Ap*,該結(jié)構(gòu)指針Ap*指向圖14所示的結(jié)構(gòu)體Struct_B;以及結(jié)構(gòu)體Struct_B包括一個數(shù)據(jù)成員BB以及一個結(jié)構(gòu)指針Bp*,該結(jié)構(gòu)指針Ap*指向圖14所示的結(jié)構(gòu)體Struct_C。當(dāng)執(zhí)行流程圖中的步驟1303至1309時,在步驟1303確定所述參數(shù)為一個結(jié)構(gòu)指針(如圖14所示的P),隨后處理程序執(zhí)行步驟1304在內(nèi)存中存儲Struct_A的內(nèi)容AA。在步驟1305發(fā)現(xiàn)Struct_A的數(shù)據(jù)成員Ap*是一個結(jié)構(gòu)指針,隨后執(zhí)行步驟1306并發(fā)現(xiàn)已經(jīng)設(shè)定了預(yù)定層次,然后執(zhí)行步驟1307。在該步驟1307,處理程序判斷當(dāng)前層次是否小于所述預(yù)定層次,由于當(dāng)前層次為1,小于預(yù)定層次2,因此處理程序執(zhí)行步驟1308。在該步驟1308,處理程序增大當(dāng)前層次,即當(dāng)前層次變?yōu)?。隨后處理程序返回步驟1304,開始處理第二層次,并在內(nèi)存中存儲Struct_B的內(nèi)容BB。在步驟1305發(fā)現(xiàn)Struct_B的數(shù)據(jù)成員Bp*同樣是一個結(jié)構(gòu)指針,隨后執(zhí)行步驟1306并發(fā)現(xiàn)已經(jīng)設(shè)定了預(yù)定層次,然后執(zhí)行步驟1307。在該步驟1307,處理程序判斷當(dāng)前層次是否小于所述預(yù)定層次,由于當(dāng)前層次為2,等于預(yù)定層次2,因此處理程序執(zhí)行步驟1309而不是步驟1308。在步驟1309,處理程序?qū)⒁陨喜襟E1304中存儲的參數(shù)內(nèi)容AA和BB存儲到硬盤中。在該實施例中,由于預(yù)定層次為2,因此內(nèi)容CC不會被存儲到硬盤中。在上述實施例中,請注意如果在步驟1307的判斷結(jié)果為“否”,則處理程序應(yīng)執(zhí)行步驟1309,保存已經(jīng)獲取的內(nèi)容,而如果在步驟1307的判斷結(jié)果為“是”,則處理程序應(yīng)執(zhí)行步驟1308,以增大當(dāng)前層次。圖15示出在不使用用于待輸出數(shù)據(jù)成員的預(yù)定層次時,根據(jù)本發(fā)明利用圖12所示的定義在軟件評價系統(tǒng)中獲取的運(yùn)行日志數(shù)據(jù)。在該數(shù)據(jù)運(yùn)行日志中,所有的參數(shù)信息都被輸出,因此十分耗時并且需要很大的空間存儲這些所有的參數(shù)信息。而且,有時這么詳盡的運(yùn)行日志數(shù)據(jù)對于使用者而言并沒有用。另一方面,圖16示出在使用用于待輸出數(shù)據(jù)成員的預(yù)定層次時,根據(jù)本發(fā)明利用圖12所示的定義在軟件評價系統(tǒng)中獲取的運(yùn)行日志數(shù)據(jù)。在該例子中,預(yù)定層次為2。通過與圖15所示的現(xiàn)有技術(shù)比較,可以看出,使用本發(fā)明可以僅輸出用戶所希望知道的參數(shù)信息,由此極大地提高了獲得運(yùn)行日志數(shù)據(jù)的性能。以上已經(jīng)參考最佳實施方式介紹了本發(fā)明,很明顯上述步驟,尤其是步驟1304-1306,無需被限定為以上所述的次序,例如考慮到判斷是否設(shè)定了預(yù)定層次在上述處理程序中可以僅被執(zhí)行一次,因此步驟1306可以直接移至步驟1304之前,而且從步驟1308開始的返回處理開始仍返回至步驟1304。盡管本發(fā)明的優(yōu)點并不在于指定參數(shù)為結(jié)構(gòu)指針,但本領(lǐng)域的普通技術(shù)人員可以料想到各種限定或指定結(jié)構(gòu)參數(shù)的技術(shù),例如日本專利申請公報No.2002-191128和2002-191129所公開的技術(shù)。另外,本發(fā)明的處理程序可以包括以下的步驟選擇用于獲取運(yùn)行日志的特定函數(shù),以每日為單位記錄工作記錄;在運(yùn)行日志的大小大于一個預(yù)定尺寸時產(chǎn)生一個新文件;在運(yùn)行日志的數(shù)量大于一個預(yù)定數(shù)量時產(chǎn)生一個新文件;當(dāng)內(nèi)存中的運(yùn)行日志數(shù)量大于一個預(yù)定數(shù)量時移動該運(yùn)行日志并將其存儲到磁盤設(shè)備中,這些步驟在日本專利申請公報No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465等中都有詳盡的介紹。另外,本發(fā)明,既適用于由多個設(shè)備(比如,主計算機(jī)、接口裝置、讀入器、打印機(jī)等)構(gòu)成的系統(tǒng),也適用于由一臺設(shè)備組成的裝置(比如,復(fù)印機(jī)、傳真裝置等)。另外,本發(fā)明的目的也可以通過將記錄了實現(xiàn)上述實施方式的功能的軟件的程序代碼的存儲介質(zhì)供給系統(tǒng)或裝置而達(dá)到,其中該系統(tǒng)或裝置的計算機(jī)(或CPU及MPU)讀出并執(zhí)行存放于存儲介質(zhì)上的程序代碼。在此場合,由于從存儲介質(zhì)讀出的程序代碼本身實現(xiàn)上述實施方式的功能,所以存儲該程序代碼的存儲介質(zhì)構(gòu)成本發(fā)明。作為提供程序代碼的存儲介質(zhì),比如,可以使用軟盤(注冊商標(biāo))、硬盤、光盤、磁光盤、CD-ROM、CD-R、磁帶、非易失性存儲卡以及ROM等。另外,通過執(zhí)行計算機(jī)讀出的程序代碼,不僅可以實現(xiàn)上述實施方式的功能,而且根據(jù)該程序代碼的指示,在計算機(jī)上運(yùn)行的OS(操作系統(tǒng))等進(jìn)行實際處理的一部分或全部,通過該處理實現(xiàn)上述實施方式的功能的場合也包括在內(nèi)是自不待言的。此外,從存儲介質(zhì)讀出的程序代碼,在寫入到插入計算機(jī)的功能擴(kuò)展板或與計算機(jī)相連接的功能擴(kuò)展裝置中設(shè)置的內(nèi)存后,根據(jù)該程序代碼的指示,設(shè)置于該功能擴(kuò)展板或功能擴(kuò)展裝置上的CPU等進(jìn)行實際處理的一部分或全部,通過該處理實現(xiàn)上述實施方式的功能的場合也包括在內(nèi)是自不待言的。已經(jīng)針對具體實施例描述了本發(fā)明。應(yīng)當(dāng)理解,本發(fā)明不限于上述描述,本領(lǐng)域的技術(shù)人員可以作出各種變化和改進(jìn),而不脫離本發(fā)明的主旨和范圍。權(quán)利要求1.一種運(yùn)行日志獲取方法,用于獲取包括至少一個執(zhí)行預(yù)定處理的函數(shù)在內(nèi)的程序的運(yùn)行日志,包括將被加載的用于執(zhí)行所述預(yù)定處理的所述函數(shù)的地址改為用于獲取運(yùn)行日志的函數(shù)的地址的步驟,其中所述用于獲取運(yùn)行日志的函數(shù)包含以下步驟確定一個結(jié)構(gòu)參數(shù)是否在所述程序的函數(shù)定義中被指定為指向一個結(jié)構(gòu)的結(jié)構(gòu)指針;和如果所述結(jié)構(gòu)參數(shù)被指定為結(jié)構(gòu)指針,確定在所述函數(shù)定義中是否已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次,并確定該結(jié)構(gòu)的數(shù)據(jù)成員是否為指向另一結(jié)構(gòu)的指針;以及至少在確定所述函數(shù)定義中已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次之后,比較所述已經(jīng)被調(diào)用的結(jié)構(gòu)的層次和所述預(yù)定層次。2.如權(quán)利要求1所述的運(yùn)行日志獲取方法,其特征在于,所述用于獲取運(yùn)行日志的函數(shù)還包含以下步驟至少在確定所述結(jié)構(gòu)參數(shù)被指定為結(jié)構(gòu)指針之后,記錄該指針?biāo)赶虻膬?nèi)存內(nèi)容,該內(nèi)存內(nèi)容將成為與在所述軟件的函數(shù)定義中定義的結(jié)構(gòu)相關(guān)的一部分運(yùn)行日志。3.如權(quán)利要求2所述的運(yùn)行日志獲取方法,其特征在于,所述用于獲取運(yùn)行日志的函數(shù)還包含以下步驟如果所述結(jié)構(gòu)的數(shù)據(jù)成員同樣是指向另一結(jié)構(gòu)的指針并且所述已經(jīng)被調(diào)用的結(jié)構(gòu)的層次小于所述預(yù)定層次,還記錄所述結(jié)構(gòu)的數(shù)據(jù)成員的指針?biāo)赶虻膬?nèi)存內(nèi)容,該內(nèi)存內(nèi)容將成為與在所述軟件的函數(shù)定義中定義的結(jié)構(gòu)相關(guān)的另一部分運(yùn)行日志。4.如權(quán)利要求1-3中任一所述的運(yùn)行日志獲取方法,其特征在于,所述用于獲取運(yùn)行日志的函數(shù)還包含調(diào)用執(zhí)行所述預(yù)定處理的函數(shù)、使該函數(shù)執(zhí)行所述預(yù)定處理、以及將所接收到的執(zhí)行結(jié)果傳送至該程序的步驟;記錄在調(diào)用所述執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息的步驟;以及記錄在接收所述執(zhí)行結(jié)果時的預(yù)定信息的步驟。5.如權(quán)利要求4所述的運(yùn)行日志獲取方法,其特征在于,在調(diào)用所述執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息包括如下信息的至少一個所調(diào)用函數(shù)的函數(shù)名、調(diào)用時的時間、調(diào)用時的參數(shù)以及調(diào)用時所述指針參數(shù)指向的內(nèi)存內(nèi)容。6.如權(quán)利要求4所述的運(yùn)行日志獲取方法,其特征在于,在接收所述執(zhí)行結(jié)果時的預(yù)定信息包括如下信息的至少一個接收時的時間、接收時的參數(shù)、接收時的返回值以及接收時所述指針參數(shù)指向的內(nèi)存內(nèi)容。7.如權(quán)利要求1所述的運(yùn)行日志獲取方法,其特征在于,在提供所述函數(shù)的各個動態(tài)鏈接庫的輸入函數(shù)地址表中記述了所述執(zhí)行預(yù)定處理的函數(shù)的地址。8.如權(quán)利要求4所述的運(yùn)行日志獲取方法,其特征在于,如果沒有設(shè)定所述數(shù)據(jù)成員的預(yù)定層次,則在調(diào)用所述執(zhí)行預(yù)定處理的函數(shù)時的預(yù)定信息包括如下信息的至少一個所調(diào)用函數(shù)的函數(shù)名、調(diào)用時的時間以及調(diào)用時的參數(shù);在接收所述執(zhí)行結(jié)果時的預(yù)定信息包括如下信息的至少一個接收時的時間、接收時的參數(shù)以及接收時的返回值。全文摘要在軟件評價系統(tǒng)中,本發(fā)明提供了在具有類或結(jié)構(gòu)類型數(shù)據(jù)的函數(shù)參數(shù)的程序中,通過僅輸出在預(yù)定層次內(nèi)的類或結(jié)構(gòu)類型的數(shù)據(jù)成員來提高運(yùn)行日志獲取方法的性能的方法,包括將被加載的用于執(zhí)行所述預(yù)定處理的函數(shù)的地址改為用于獲取運(yùn)行日志的函數(shù)的地址的步驟,其中該函數(shù)包含確定一個結(jié)構(gòu)參數(shù)是否在程序的函數(shù)定義中被指定為指向一個結(jié)構(gòu)的結(jié)構(gòu)指針;如果結(jié)構(gòu)參數(shù)被指定為結(jié)構(gòu)指針,確定在函數(shù)定義中是否已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次,并確定該結(jié)構(gòu)的數(shù)據(jù)成員是否為指向另一結(jié)構(gòu)的指針;至少在確定函數(shù)定義中已經(jīng)設(shè)定了數(shù)據(jù)成員的預(yù)定層次之后,比較已經(jīng)被調(diào)用的結(jié)構(gòu)的層次和預(yù)定層次。文檔編號G06F11/36GK1818885SQ20051000827公開日2006年8月16日申請日期2005年2月7日優(yōu)先權(quán)日2005年2月7日發(fā)明者唐憲偉,韓勁申請人:佳能株式會社