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