專(zhuān)利名稱(chēng)::運(yùn)行日志取得方法、程序和存儲(chǔ)介質(zhì)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種可取得被分成為多個(gè)模塊的軟件的處理運(yùn)行日志的技術(shù)。
背景技術(shù):
:歷來(lái),對(duì)于重現(xiàn)率低的軟件故障,是通過(guò)取得軟件的處理運(yùn)行日志和分析該處理LOG而查清故障的原因并采取對(duì)策。然而,在取得上述現(xiàn)有的處理運(yùn)行日志方面存在以下的問(wèn)題。(1)為了在用戶的動(dòng)作環(huán)境中也能繼續(xù)不斷地取得運(yùn)行日志,必須對(duì)軟件的模塊本身進(jìn)行加工增加處理運(yùn)行日志取得例行程序,這將加大為取得處理運(yùn)行日志的作業(yè)負(fù)擔(dān)。(2)由于處理運(yùn)行日志的取得是針對(duì)每個(gè)模塊進(jìn)行,生成的運(yùn)行日志是以模塊為單位的,很難取得作為完全按照時(shí)間順序的運(yùn)行日志的整個(gè)軟件的處理的。因此,作為對(duì)整個(gè)處理運(yùn)行日志的預(yù)測(cè)不佳,分析運(yùn)行日志一直到發(fā)現(xiàn)故障原因的過(guò)程極其耗費(fèi)工時(shí)。
發(fā)明內(nèi)容本發(fā)明為鑒于上述問(wèn)題而完成的發(fā)明,其目的在于提供一種容易取得被分成為多個(gè)模塊的軟件的處理運(yùn)行日志,并且可以削減用來(lái)分析軟件故障原因的工時(shí)的運(yùn)行日志的取得方法,以及用于藉助計(jì)算機(jī)實(shí)現(xiàn)該方法的程序和存放該程序的存儲(chǔ)介質(zhì)。為達(dá)到上述目的,本發(fā)明提供了一種運(yùn)行日志取得方法,用于取得包括至少一個(gè)執(zhí)行預(yù)定處理的函數(shù)的程序的運(yùn)行日志,包括用于將被加載的用于執(zhí)行上述預(yù)定處理的所述至少一個(gè)函數(shù)的地址改為用來(lái)取得運(yùn)行日志的函數(shù)的地址的步驟,其中,所述用來(lái)取得運(yùn)行日志的函數(shù)包含以下步驟調(diào)用進(jìn)行上述預(yù)定處理的所述至少一個(gè)函數(shù),執(zhí)行該預(yù)定處理,接收?qǐng)?zhí)行結(jié)果并將接收到的執(zhí)行結(jié)果轉(zhuǎn)送給上述程序;判斷在上述程序的函數(shù)定義中是否定義了這樣的指針參數(shù)以預(yù)定的方式規(guī)定了其類(lèi)型;并且如果定義了以預(yù)定方式規(guī)定了其類(lèi)型的指針參數(shù),則將該指針參數(shù)所指的內(nèi)存的內(nèi)容作為所述規(guī)定數(shù)據(jù)類(lèi)型的數(shù)據(jù)進(jìn)行記錄。在一個(gè)優(yōu)選實(shí)施例中,用索引結(jié)構(gòu)體定義所述指針參數(shù)的類(lèi)型,并且所述判斷步驟包括通過(guò)訪問(wèn)所述索引結(jié)構(gòu)體的指定成員來(lái)判斷所述指針參數(shù)的類(lèi)型。所述索引結(jié)構(gòu)體的成員的類(lèi)型可以是各種非輸出函數(shù)和各種結(jié)構(gòu)體。本發(fā)明還提供了實(shí)現(xiàn)上述方法的程序和存在上述程序的存儲(chǔ)介質(zhì)。本發(fā)明的其他特點(diǎn)和優(yōu)點(diǎn)可從參考下面的附圖的描述而了解,附圖各圖中同樣或類(lèi)似的部件被賦予同樣的標(biāo)號(hào)。包括在本說(shuō)明書(shū)中并構(gòu)成其一個(gè)組成部分的附圖本發(fā)明的各個(gè)具體實(shí)施方式,并且與敘述一起用來(lái)說(shuō)明本發(fā)明的原理。圖1為實(shí)現(xiàn)實(shí)施方式1的運(yùn)行日志取得方法的計(jì)算機(jī)(軟件評(píng)價(jià)系統(tǒng))的構(gòu)成的示圖。圖2為實(shí)施方式1的函數(shù)加載時(shí)的通常的內(nèi)存構(gòu)成的示圖。圖3為使用實(shí)施方式1的IATPatch時(shí)的內(nèi)存構(gòu)成的示圖。圖4A為使用實(shí)施方式1的IATPatch時(shí)的狀態(tài)的示圖。圖4B為實(shí)施方式1的運(yùn)行日志取得處理的流程圖。圖5為使用實(shí)施方式1的IATPatch時(shí)的內(nèi)部構(gòu)成的示圖。圖6為實(shí)施方式1的COM服務(wù)器的接口的事例(instance)生成時(shí)的通常的內(nèi)存構(gòu)成的示圖。圖7為使用實(shí)施方式1的VTablePatch時(shí)的內(nèi)存構(gòu)成的示圖。圖8A為使用實(shí)施方式1的VTablePatch時(shí)的狀態(tài)的示圖。圖8B為實(shí)施方式1的運(yùn)行日志取得處理的流程圖。圖9為實(shí)施方式1的軟件評(píng)價(jià)系統(tǒng)的內(nèi)部構(gòu)成的示圖。圖10為實(shí)施方式2的函數(shù)定義的一例的示圖。圖11為在實(shí)施方式2中,在用來(lái)將指針參數(shù)數(shù)據(jù)的實(shí)體作為運(yùn)行日志取得的IDL中寫(xiě)入的說(shuō)明的示圖。圖12為取得實(shí)施方式2的運(yùn)行日志的處理的流程圖。圖13為在實(shí)施方式2中取得的運(yùn)行日志數(shù)據(jù)的示圖。圖14為根據(jù)第三實(shí)施方式,用在通常的函數(shù)定義不能取得參數(shù)的函數(shù)的例子的示圖。圖15為各結(jié)構(gòu)體在內(nèi)存中的位置的示圖。圖16為在根據(jù)實(shí)施方式3,用來(lái)取得圖14所示的函數(shù)參數(shù)的運(yùn)行日志的IDL中的記述的示圖。圖17為根據(jù)實(shí)施方式3取得運(yùn)行日志的處理的流程圖。圖18為在根據(jù)實(shí)施方式3,利用圖16所示的定義取得的運(yùn)行日志數(shù)據(jù)的示圖。圖19為在實(shí)施方式4中,用來(lái)設(shè)定開(kāi)始運(yùn)行日志取得的函數(shù)/方法的用戶接口的示圖。圖20為取得實(shí)施方式4的運(yùn)行日志的處理的流程圖。圖21為用來(lái)設(shè)定停止實(shí)施方式5中的運(yùn)行日志取得的函數(shù)/方法的用戶接口的示圖。圖22為取得實(shí)施方式5的運(yùn)行日志的處理的流程圖。圖23為設(shè)定的只在以實(shí)施方式6的錯(cuò)誤而結(jié)束的場(chǎng)合追加使用觸發(fā)功能的設(shè)定的用戶接口的示圖。圖24為實(shí)施方式6的函數(shù)/方法的錯(cuò)誤定義的內(nèi)容的示圖。圖25為取得實(shí)施方式6的運(yùn)行日志的處理的流程圖。圖26為實(shí)施方式6的通常的運(yùn)行日志取得處理的詳細(xì)流程圖。圖27為取得實(shí)施方式6的運(yùn)行日志的處理的流程圖。圖28為對(duì)實(shí)施方式7的接口和方法進(jìn)行樹(shù)形顯示的用戶接口的示圖。圖29為取得實(shí)施方式7的運(yùn)行日志之際的處理的流程圖。圖30為對(duì)實(shí)施方式8的接口和方法進(jìn)行樹(shù)形顯示的用戶接口的示圖。圖31為取得實(shí)施方式8的運(yùn)行日志之際的處理的流程圖。圖32為將實(shí)施方式9的運(yùn)行日志連日期一起進(jìn)行分割保存的場(chǎng)合的處理的流程圖。圖33為將實(shí)施方式10的運(yùn)行日志按照大小或個(gè)數(shù)進(jìn)行分割保存的場(chǎng)合的處理的流程圖。圖34為在實(shí)施方式11中,將取得的運(yùn)行日志存儲(chǔ)于一定數(shù)量的內(nèi)存中的場(chǎng)合的內(nèi)存的概圖。圖35為在實(shí)施方式11中,將取得的運(yùn)行日志存儲(chǔ)于一定數(shù)量的內(nèi)存中的場(chǎng)合的運(yùn)行日志取得的流程圖。具體實(shí)施例方式下面參照附圖對(duì)本發(fā)明的優(yōu)選實(shí)施方式予以詳細(xì)說(shuō)明。本實(shí)施方式,是在從某一模塊調(diào)用存在于另一個(gè)模塊內(nèi)的函數(shù)時(shí)的結(jié)構(gòu)的、利用保存于內(nèi)存中的輸入函數(shù)地址或虛擬函數(shù)地址表(VirtualAddressTable)、掛接模塊間的函數(shù)調(diào)用并記錄在運(yùn)行日志中,這樣可不對(duì)軟件的模塊本身進(jìn)行加工而將整個(gè)軟件的處理作為時(shí)間順序的運(yùn)行日志取得。下面具體說(shuō)明之。<系統(tǒng)構(gòu)成>圖1為實(shí)現(xiàn)本發(fā)明的實(shí)施方式的運(yùn)行日志取得方法的計(jì)算機(jī)(軟件評(píng)價(jià)系統(tǒng))的構(gòu)成的示圖。為簡(jiǎn)化說(shuō)明起見(jiàn),假設(shè)在本實(shí)施方式中,本軟件評(píng)價(jià)系統(tǒng)是構(gòu)筑在一臺(tái)PC的內(nèi)部,本發(fā)明的運(yùn)行日志取得方法的特征是不管是構(gòu)筑于一臺(tái)PC的內(nèi)部還是由多個(gè)PC構(gòu)筑的網(wǎng)絡(luò)系統(tǒng),都有效。在搭載有本軟件評(píng)價(jià)系統(tǒng)的計(jì)算機(jī)中安裝有CPU1、芯片組2、RAM3、硬盤(pán)控制器4、顯示控制器5、硬盤(pán)驅(qū)動(dòng)器6、CD-ROM驅(qū)動(dòng)器7及顯示器8。另外,設(shè)置有連接CPU1和芯片組2的信號(hào)線11、連接芯片組2和RAM3的信號(hào)線12、連接芯片組2和各種外圍設(shè)備的外圍設(shè)備總線13、連接硬盤(pán)控制器4和硬盤(pán)驅(qū)動(dòng)器6的信號(hào)線14、連接硬盤(pán)控制器4和CD-ROM驅(qū)動(dòng)器7的信號(hào)線15以及連接顯示控制器5和顯示器8的信號(hào)線16。<涉及函數(shù)處理的運(yùn)行日志的取得>為了說(shuō)明實(shí)現(xiàn)本發(fā)明的實(shí)施方式1的運(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ù)地址表被函數(shù)所屬的DLL分開(kāi)(21、24),在每個(gè)DLL中寫(xiě)有加載各個(gè)函數(shù)的地址(30~35)。DLL函數(shù)的實(shí)體按每個(gè)DLL分開(kāi)(25、26)加載,各個(gè)函數(shù)作為該DLL的一部分被加載(36~41)。在此圖中,的示例是一個(gè)EXE使用A.DLL及B.DLL兩個(gè)動(dòng)態(tài)鏈接庫(kù)內(nèi)的函數(shù),實(shí)際使用的函數(shù)為FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC等六個(gè)。位于EXE的代碼段內(nèi)的代碼調(diào)用函數(shù)FuncAA的場(chǎng)合,首先讀入寫(xiě)在引人函數(shù)地址表內(nèi)的FuncAA的地址(30)。此處實(shí)際上寫(xiě)入作為A.DLL的一部分而讀入的FuncAA代碼(36)的地址,EXE的代碼可以通過(guò)調(diào)用該地址而調(diào)用A.DLL的FuncAA。圖3為實(shí)施方式1的內(nèi)存構(gòu)成的示圖,與圖2的不同之處在于對(duì)運(yùn)行日志取得用的代碼采用所謂的IATPatch(ImportAddressTablePatch)的方法,對(duì)函數(shù)調(diào)用進(jìn)行重定向。運(yùn)行日志的取得一開(kāi)始,就在內(nèi)存內(nèi)加載作為IATPatch用的DLL的C.DLL(58)。C.DLL將引人函數(shù)地址表(52)內(nèi)寫(xiě)入的函數(shù)的地址改寫(xiě)為作為C.DLL內(nèi)的運(yùn)行日志取得代碼的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的地址(61~66)。C.DLL內(nèi)的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的代碼(73~78),在記錄運(yùn)行日志的同時(shí),調(diào)用被加載到應(yīng)該接受原來(lái)的函數(shù)調(diào)用的內(nèi)存中的、作為該函數(shù)的FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC(67~72)。圖4A為圖3的IATPatch的處理的示圖,而圖4B為運(yùn)行日志取得處理的流程的流程圖。為了簡(jiǎn)化說(shuō)明起見(jiàn),在此圖中,在EXE調(diào)用A.DLL內(nèi)的FuncAA之際,IATPatch產(chǎn)生的運(yùn)行日志取得代碼是如何運(yùn)行的示例。EXE(91)一調(diào)用FuncAA(94),位于C.DLL內(nèi)的運(yùn)行日志取得代碼將DLL名/函數(shù)名保存到內(nèi)存中(步驟S402)、將調(diào)用時(shí)間保存于內(nèi)存中、將調(diào)用時(shí)的參數(shù)保存于內(nèi)存中、將調(diào)用時(shí)的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個(gè)內(nèi)存中(95、步驟S403)。其后,C.DLL調(diào)用本來(lái)應(yīng)被調(diào)用的A.DLL(93)內(nèi)的FuncAA(99、步驟S404)。一旦A.DLL的FuncAA處理(97)結(jié)束,并將控制返回C.DLL(98)的話,C.DLL就將返回時(shí)的時(shí)間保存于內(nèi)存中,將返回值保存于內(nèi)存中,并將返回時(shí)的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個(gè)內(nèi)存中(99)。其后,C.DLL,將保存的運(yùn)行日志信息寫(xiě)入文件(100、步驟S405),像A.DLL的FuncAA通常結(jié)束那樣返回EXE(101)。圖5為實(shí)現(xiàn)實(shí)施方式1的運(yùn)行日志取得方法的軟件評(píng)價(jià)系統(tǒng)的內(nèi)部構(gòu)成的示圖。通常,執(zhí)行形式的EXE(113)調(diào)用DLL-1(116)及DLL-2(117)內(nèi)的函數(shù),此處,嵌入被稱(chēng)為API追蹤程序(114)的運(yùn)行日志取得代碼,生成處理運(yùn)行日志(115)。API追蹤程序(114),根據(jù)記述DLL-1及DLL-2的函數(shù)定義文件(111)和通過(guò)改寫(xiě)哪一個(gè)DLL的哪一個(gè)函數(shù)的引人函數(shù)地址表而取得運(yùn)行日志的設(shè)定情景(追蹤情景112)而運(yùn)作。<涉及方法處理的運(yùn)行日志的取得>下面,在實(shí)現(xiàn)實(shí)施方式1的運(yùn)行日志取得方法的軟件評(píng)價(jià)系統(tǒng)中,為了說(shuō)明執(zhí)行文件EXE(113)在COM(構(gòu)件對(duì)象模型)服務(wù)器中生成輸出的接口的事例(instance)時(shí)是如何被加載到內(nèi)存中,首先參照?qǐng)D6對(duì)在通常的狀態(tài)下如何加載到內(nèi)存的情況予以說(shuō)明。通常,進(jìn)行接口的事例(instance)一生成的話,在COM服務(wù)器內(nèi),生成要求的接口(121、122)和其方法(在面向?qū)ο缶幊讨?,記述了?duì)象執(zhí)行的過(guò)程的程序130~135),這兩者都被加載到內(nèi)存中。此處,virtualaddresstable(虛擬地址表118、120)在生成的每一個(gè)事例(instance)中作成,并被送到執(zhí)行生成要求的EXE。在此virtualaddresstable中寫(xiě)有各個(gè)方法的生成地址(124~129)。EXE利用這些信息對(duì)各個(gè)接口進(jìn)行調(diào)用。在此圖中,表示的是一個(gè)EXE(119)生成InterfaceA(121)和InterfaceB(122)兩個(gè)接口的事例(instance),并使用該接口內(nèi)部的方法的示例,實(shí)際使用的方法為MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(130~135)。在EXE的代碼調(diào)用函數(shù)MethodAA的場(chǎng)合,首先讀出寫(xiě)在virtualaddresstable內(nèi)的MethodAA的地址(124)。此處實(shí)際上寫(xiě)有作為COM服務(wù)器的InterfaceA的一部分而生成的MethodAA代碼(130)的地址,通過(guò)調(diào)用該地址,EXE的代碼可以調(diào)用InterfaceA的MethodAA。圖7為使用實(shí)施方式1的軟件評(píng)價(jià)系統(tǒng)的內(nèi)存構(gòu)成的示圖,與圖6的不同之處在于對(duì)運(yùn)行日志取得用的代碼采用所謂的VTablePatch(virtualaddresstablePatch)的方法,對(duì)方法調(diào)用進(jìn)行重定向。運(yùn)行日志的取得一開(kāi)始,就在內(nèi)存內(nèi)加載作為VTablePatch用的DLL(143)。此DLL將寫(xiě)在virtualaddresstable(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(143)內(nèi)的MethodA′A、MethodA′B、MethodA′C、MethodB′A、MethodB′B、MetbodB′C的代碼(157~162),在記錄運(yùn)行日志的同時(shí),調(diào)用被加載到應(yīng)該接受原來(lái)的函數(shù)調(diào)用的內(nèi)存中的、作為該函數(shù)的MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(157~162)。圖8A為圖7的VTablePatch處理的示圖,圖8B為運(yùn)行日志取得處理的流程的流程圖。為了簡(jiǎn)化說(shuō)明起見(jiàn),在此圖中,表示在EXE調(diào)用COM服務(wù)器內(nèi)的InterfaceA的MethodAA之際,VTablePatch產(chǎn)生的運(yùn)行日志取得代碼是如何運(yùn)作的示例。EXE(163)一調(diào)用MethodAA(166),位于DLL(164)內(nèi)的運(yùn)行日志取得代碼將模塊名/接口名/方法名保存到內(nèi)存中(步驟S802)、將調(diào)用時(shí)間保存于內(nèi)存中、將調(diào)用時(shí)的參數(shù)保存于內(nèi)存中、將調(diào)用時(shí)的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個(gè)內(nèi)存中(167、步驟S802)。其后,DLL(164)調(diào)用本來(lái)應(yīng)該調(diào)用的COM服務(wù)器(165)內(nèi)的MethodAA(168、步驟S804)。如COM服務(wù)器(165)的MethodAA處理(169)結(jié)束,并將控制返回DLL(164)的話,DLL(164)就將返回時(shí)的時(shí)間保存于內(nèi)存中,將返回值保存于內(nèi)存中,并將返回時(shí)的指針參數(shù)指示的內(nèi)存內(nèi)容保存于另一個(gè)內(nèi)存中(171)。其后,DLL將保存的運(yùn)行日志信息寫(xiě)入文件(172、步驟S805)中,像COM服務(wù)器(165)的MethodAA通常結(jié)束那樣返回EXE(163)(173)。圖9為實(shí)施方式1的軟件評(píng)價(jià)系統(tǒng)的內(nèi)部構(gòu)成的示圖。通常,執(zhí)行形式的EXE(176)調(diào)用COM服務(wù)器1(179)及COM服務(wù)器2(180)內(nèi)的方法,此處,嵌入被稱(chēng)為API追蹤程序(177)的運(yùn)行日志取得代碼,生成處理運(yùn)行日志(178)。API追蹤程序(177),根據(jù)記述COM服務(wù)器1(179)及COM服務(wù)器2(180)的函數(shù)定義文件(174)和通過(guò)改寫(xiě)哪一個(gè)COM服務(wù)器的哪一個(gè)方法的virtualaddresstable取得運(yùn)行日志的設(shè)定情景(175)而運(yùn)作。從以上的說(shuō)明可知,根據(jù)本實(shí)施方式的運(yùn)行日志取得方法,在取得被分成為多個(gè)模塊的軟件的處理運(yùn)行日志中,可不對(duì)軟件的模塊本身進(jìn)行改變而將模塊內(nèi)準(zhǔn)備的函數(shù)/方法的調(diào)用作為運(yùn)行日志進(jìn)行記錄,從而可以減少用于取得處理運(yùn)行日志的作業(yè)負(fù)擔(dān)。另外,生成的運(yùn)行日志,可以取得按照時(shí)間順序的運(yùn)行日志,由于對(duì)運(yùn)行日志的分析變得容易,可以削減用來(lái)分析軟件故障原因的工時(shí)。在本實(shí)施方式中,獲取回叫函數(shù)等非輸出函數(shù)作為運(yùn)行日志。圖1為用在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中的函數(shù)的例子,其參數(shù)不能用通常的函數(shù)定義取得。作為回叫函數(shù),定義了例如4種回叫函數(shù)FuncInternal1、FuncInterna2、FuncInternal3、FuncInterna4。GetFuncPointer函數(shù)的第一參數(shù)dwKind指出上述4種回叫函數(shù)中的要發(fā)送給第二參數(shù)lpBuf的一種函數(shù)的指針。當(dāng)?shù)谝粎?shù)為0的時(shí)GetFuncPointer函數(shù),將lpBuf作為FuncInternal1的地址進(jìn)行處理,當(dāng)?shù)谝粎?shù)為1時(shí),將lpBuf作為FuncInternal2的地址進(jìn)行處理,當(dāng)?shù)谝粎?shù)為2時(shí),將lpBuf作為FuncInternal3的地址進(jìn)行處理,而當(dāng)?shù)谝粎?shù)為3時(shí),將lpBuf作為FuncInternal4的地址進(jìn)行處理。如利用通常的函數(shù)定義去定義GetFuncPointer,lpBuf變成為void(空)型的指針,從而不能取得數(shù)據(jù)。圖11圖示了在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中,用來(lái)取得圖10所示函數(shù)的參數(shù)的運(yùn)行日志的IDL中的記述?;亟泻瘮?shù)以通常的方法定義。另外,在要被調(diào)用的函數(shù)中定義一個(gè)索引結(jié)構(gòu)體INDEX_STRUCT。然后,在用于取得運(yùn)行日志的函數(shù)中,對(duì)于GetFuncPointer函數(shù)的第二參數(shù)void*lpBuf設(shè)定[custum(PAT_PARAM_ID,″funckind_is(dwKind,INDEX_STRUCT)″)]。這使得lpBuf根據(jù)所述第一參數(shù)dwKind的值被當(dāng)作所述索引結(jié)構(gòu)體的不同成員的數(shù)據(jù)類(lèi)型類(lèi)處理,即,在第一參數(shù)dwKind的值為0的場(chǎng)合,作為FuncInternal1*數(shù)據(jù)類(lèi)型,在該值為1的場(chǎng)合作為FuncInternal2*數(shù)據(jù)類(lèi)型,在該值為2的場(chǎng)合作為FuncInternal3*數(shù)據(jù)類(lèi)型,在該值為3的場(chǎng)合作為FuncInternal4*數(shù)據(jù)類(lèi)型進(jìn)行處理,并作為運(yùn)行日志保存。圖12為在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中,當(dāng)函數(shù)如圖11所示定義時(shí)用于取得運(yùn)行日志的處理的流程圖。處理一開(kāi)始(步驟S5201),開(kāi)始取得運(yùn)行日志,將模塊名、接口名、函數(shù)/方法名保存于HDD中(步驟S5202)。然后將調(diào)用時(shí)間、參數(shù)及所述指針參數(shù)指示的內(nèi)容保存于HDD中(步驟S5203)。判斷在函數(shù)定義中是否存在funckind_is的設(shè)定(步驟S5204),如存在的話,從函數(shù)定義文件中取得由funckind_is定義的函數(shù)定義,根據(jù)該定義生成用于取得運(yùn)行日志的代碼(步驟S5205)。然后保存funckind_is定義的值,并置換成生成的運(yùn)行日志取得代碼的地址(步驟S5206)。接著,調(diào)用原來(lái)的函數(shù)(步驟S5207)。如從函數(shù)返回的話,運(yùn)行日志取得代碼將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S5208)。然后判斷在函數(shù)定義中是否設(shè)定了函數(shù)類(lèi)型說(shuō)明(funckind_is)(步驟S5209),如設(shè)定了,則從函數(shù)定義文件中取得由funckind_is定義的函數(shù)定義,根據(jù)該定義生成用于取得運(yùn)行日志的代碼(步驟S5210)。然后,保存funckind_is定義的值,用生成的運(yùn)行日志取得代碼的地址置換(步驟S5211)。如果有來(lái)自用戶的終止命令(步驟S5212),該處理就終止。如由funckind_is設(shè)定的參數(shù)用生成的運(yùn)行日志取得代碼的地址置換,使用該地址調(diào)用的原來(lái)的函數(shù)被以與通常的運(yùn)行日志相似的方式進(jìn)行處理。即,生成的運(yùn)行日志取得代碼調(diào)用所述不輸出的函數(shù),執(zhí)行處理,在傳送所接收的執(zhí)行結(jié)果的同時(shí),將調(diào)用不輸出的函數(shù)之際的規(guī)定信息和接收?qǐng)?zhí)行結(jié)果之際的規(guī)定信息作為運(yùn)行日志予以記錄。圖13為在本實(shí)施方式中利用圖11所示的定義取得的運(yùn)行日志數(shù)據(jù)的示圖。因?yàn)樵诤瘮?shù)定義文件中提供了用于取得回叫函數(shù)和不輸出的內(nèi)部函數(shù)的設(shè)置,所以可以取得非輸出函數(shù)比如FuncInternal1函數(shù)、FuncInternal4函數(shù)等的運(yùn)行日志。這樣,本實(shí)施方式的優(yōu)點(diǎn)是可以取得以通常的方法不能取得的非輸出函數(shù)的運(yùn)行日志。圖14為在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中使用的函數(shù)的例子,用通常的函數(shù)定義不能取得其參數(shù)。定義了三個(gè)結(jié)構(gòu)體STRUCTKIND1、STRUCTKIND2、STRUCTKIND3。FuncGetData函數(shù)的第一參數(shù)dwKind指出上述3種結(jié)構(gòu)體中要發(fā)送給第二參數(shù)lpBuf的那個(gè)結(jié)構(gòu)體的指針。當(dāng)?shù)谝粎?shù)為1時(shí),F(xiàn)uncGetData函數(shù)將lpBuf作為STRUCTKIND1的指針進(jìn)行處理,當(dāng)?shù)谝粎?shù)為2時(shí),F(xiàn)uncGetData函數(shù)將lpBuf作為STRUCTKIND2的指針進(jìn)行處理,而當(dāng)?shù)谝粎?shù)為3時(shí),F(xiàn)uncGetData函數(shù)將lpBuf作為STRUCTKIND3的指針進(jìn)行處理。如利用通常的函數(shù)定義去定義FuncGetData,lpBuf變成為void(空)型的指針,從而不能取得數(shù)據(jù)。圖15為每一個(gè)結(jié)構(gòu)體STRUCTKIND1、STRUCTKIND2、STRUCTKIND3如何利用內(nèi)存的示圖。結(jié)構(gòu)體STRUCTKIND1(330)的各成員,在偏移量0×0000處有charchParam(331)、在0×0001處有DWORDdwParam(332)、在0×0005處有shortshParam(333)。結(jié)構(gòu)體STRUCTKIND2(334)的各成員在偏移量0×0000處有shortshParam(335)、在0×0002處有DWORDdwParam(336)、在0×0006處有charchParam(337)。結(jié)構(gòu)體STRUCTKIND3(338)的各成員在偏移量0×0000處有charchParam(339)、在0×0001處有shortshParam(340)、在0×0003處有DWORDdwParam(341)、在0×0007處有l(wèi)onglParam(342)、在0×000B處有intnParam。由于在各結(jié)構(gòu)體中沒(méi)有大小的信息,結(jié)構(gòu)體的內(nèi)存結(jié)構(gòu)相互不同,所以不能使用傳統(tǒng)的方法。圖16為在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中,用來(lái)取得圖14所示函數(shù)的參數(shù)的運(yùn)行日志的IDL中的記述的示圖。各結(jié)構(gòu)體以通常的方法定義。另外,在要調(diào)用的函數(shù)中定義一個(gè)索引結(jié)構(gòu)體INDEX_STRUCT。然后,在用于取得運(yùn)行日志的函數(shù)中,對(duì)FuncgetData函數(shù)的第二參數(shù)void*lpBuf設(shè)定[custom(PAT_PARAM_ID,″structkind_is(dwKind,INDEX_STRUCT)″)]。這使得lpBuf根據(jù)第一參數(shù)dwKind的值被當(dāng)作所述索引結(jié)構(gòu)體的不同成員的數(shù)據(jù)類(lèi)型來(lái)處理。即,由此,在第一參數(shù)dwKind的值為1的場(chǎng)合,lpBuf的數(shù)據(jù)類(lèi)型為STRUCTKIND1*,在第一參數(shù)dwKind的值為2的場(chǎng)合lpBuf的數(shù)據(jù)類(lèi)型為STRUCTKIND2*,在第一參數(shù)dwKind的值為3的場(chǎng)合lpBuf的數(shù)據(jù)類(lèi)型為STRUCTKIND3*,并作為運(yùn)行日志保存。圖17為在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中,當(dāng)函數(shù)如圖16所示定義時(shí)用于取得的運(yùn)行日志的處理的流程圖。處理一開(kāi)始(步驟S5701),開(kāi)始取得運(yùn)行日志,將模塊名、接口名、函數(shù)/方法名保存于內(nèi)存中(步驟S5702)。其次,判斷在函數(shù)定義中是否設(shè)定了結(jié)構(gòu)體類(lèi)型說(shuō)明(structkind_is)(步驟S5703),如有設(shè)定,則將設(shè)定的結(jié)構(gòu)體參數(shù)數(shù)據(jù)作為類(lèi)型說(shuō)明(structkind_is)中所定義的數(shù)據(jù)類(lèi)型進(jìn)行分析(步驟S5704)。然后將調(diào)用時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于內(nèi)存中(步驟S5705)。接著,調(diào)用原來(lái)的函數(shù)(步驟S5706)。在從函數(shù)返回后,判斷在函數(shù)定義中是否設(shè)定了結(jié)構(gòu)體類(lèi)型說(shuō)明(structkind_is)(步驟S5707),如有設(shè)定,則將設(shè)定的結(jié)構(gòu)體參數(shù)數(shù)據(jù)作為類(lèi)型說(shuō)明(structkind_is)所定義的數(shù)據(jù)類(lèi)型進(jìn)行分析(步驟S5708)。然后將返回時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于內(nèi)存中(步驟S5709)。如果有來(lái)自用戶的終止命令(步驟S5710),該處理就終止。圖18為在本實(shí)施方式中,利用圖16的定義取得的運(yùn)行日志數(shù)據(jù)的示圖。通常為空指針(void*),用通常的函數(shù)定義只能夠取得其指針的結(jié)構(gòu)體的數(shù)據(jù),可根據(jù)使用的結(jié)構(gòu)體的類(lèi)型而作為運(yùn)行日志被取得。這樣,本實(shí)施方式的優(yōu)點(diǎn)是可以獲得用通常的方法不能取得的參數(shù)的運(yùn)行日志。在本實(shí)施方式中,對(duì)根據(jù)進(jìn)行用于運(yùn)行日志取得的各種設(shè)定的用戶接口和以該用戶接口設(shè)定的信息進(jìn)行的處理予以說(shuō)明。圖19為用來(lái)設(shè)定開(kāi)始實(shí)施方式4的運(yùn)行日志取得的函數(shù)/方法的用戶接口的示圖。在用戶接口中,具有從變成為運(yùn)行日志取得對(duì)象的模塊/接口(350)選擇設(shè)定哪一個(gè)模塊/接口的下拉表(352、353)和從利用該處選擇的模塊/接口輸出的函數(shù)/方法(351)選擇設(shè)定哪一個(gè)函數(shù)/方法作為運(yùn)行日志取得開(kāi)始觸發(fā)器的下拉表(354、355)。圖20為在實(shí)施方式4的軟件評(píng)價(jià)系統(tǒng)中,按照?qǐng)D19中設(shè)定的內(nèi)容取得運(yùn)行日志的處理的流程圖。處理一開(kāi)始(步驟S3401),判斷是否將運(yùn)行日志取得代碼所調(diào)用的函數(shù)/方法設(shè)定為運(yùn)行日志取得開(kāi)始觸發(fā)器(步驟S3402)。在與運(yùn)行日志取得開(kāi)始觸發(fā)器一致的場(chǎng)合,運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于HDD中(步驟S3403)。其次,運(yùn)行日志取得代碼,將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S3404),調(diào)用原來(lái)的函數(shù)/方法(步驟S3405)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于HDD中(步驟S3406)。此處理一直進(jìn)行到有來(lái)自用戶的終止命令(步驟S3407)為止,此時(shí),不進(jìn)行運(yùn)行日志取得開(kāi)始觸發(fā)器的判斷。從以上的說(shuō)明可知,根據(jù)本實(shí)施方式,由于可以任意選擇進(jìn)行運(yùn)行日志取得的函數(shù)/方法,可以獲得運(yùn)行日志分析變得很容易的效果。在上述實(shí)施方式4中,是假設(shè)用戶可以任意選擇取得運(yùn)行日志的函數(shù)/方法,在本實(shí)施方式中,假設(shè)用戶可以任意選擇停止取得運(yùn)行日志的函數(shù)/方法。圖21為本實(shí)施方式的用來(lái)設(shè)定停止運(yùn)行日志取得的函數(shù)/方法的用戶接口的示圖。在用戶接口中,具有從變成為運(yùn)行日志取得對(duì)象的模塊/接口(356)選擇設(shè)定哪一個(gè)模塊/接口的下拉表(358、359)和從利用該處選擇的模塊/接口輸出的函數(shù)/方法(357)選擇設(shè)定哪一個(gè)函數(shù)/方法作為運(yùn)行日志停止取得開(kāi)始的觸發(fā)器的下拉表(360、361)。圖22為在本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)中,按照?qǐng)D21中設(shè)定的內(nèi)容取得運(yùn)行日志的處理的流程圖。處理一開(kāi)始(步驟S3601),運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于HDD中(步驟S3602)。其次,運(yùn)行日志取得代碼,將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S3603),調(diào)用原來(lái)的函數(shù)/方法(步驟S3604)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼,將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于HDD中(步驟S3605)。之后判斷是否將調(diào)用的函數(shù)/方法設(shè)定為運(yùn)行日志取得停止觸發(fā)器(步驟S3606)。在與運(yùn)行日志取得停止觸發(fā)器一致的場(chǎng)合,運(yùn)行日志取得處理結(jié)束(步驟S3607)。并且,即使是與運(yùn)行日志取得停止觸發(fā)器不一致的場(chǎng)合,在有來(lái)自用戶的終止命令時(shí)(步驟S3606),該處理將終止。據(jù)此,由于可以停止任意設(shè)定的函數(shù)/方法的運(yùn)行日志的取得,可以只取得用戶要求的運(yùn)行日志,所以獲得運(yùn)行日志分析變得很容易的效果。在上述實(shí)施方式4及5中敘述的用戶接口中,用戶可以利用用戶選擇的任意函數(shù)/方法開(kāi)始/停止運(yùn)行日志的取得,但也可以設(shè)定為用戶選擇的任意函數(shù)/方法只在錯(cuò)誤終止的場(chǎng)合開(kāi)始/停止運(yùn)行日志的取得。圖23為對(duì)用來(lái)設(shè)定本實(shí)施方式的開(kāi)始/停止運(yùn)行日志的取得的函數(shù)/方法的用戶接口增加設(shè)定只在錯(cuò)誤終止的場(chǎng)合使用觸發(fā)功能(運(yùn)行日志取得開(kāi)始/停止功能)的用戶接口的示圖。本用戶接口,可適用于圖19及圖21兩者。在用戶接口中,具有從變成為運(yùn)行日志取得對(duì)象的模塊/接口(362)選擇設(shè)定哪一個(gè)模塊/接口的下拉表(364、365)和從利用該處選擇的模塊/接口輸出的函數(shù)/方法(363)選擇設(shè)定哪一個(gè)函數(shù)/方法作為觸發(fā)器的下拉表(366、367)以及函數(shù)/方法只在錯(cuò)誤終止的場(chǎng)合使觸發(fā)功能有效的復(fù)選框(368)。圖24為本實(shí)施方式的函數(shù)/方法的錯(cuò)誤定義的內(nèi)容的示圖。在本實(shí)施方式中,錯(cuò)誤定義是一個(gè)文件,在文件中對(duì)各函數(shù)/方法的參數(shù)及返回值和錯(cuò)誤條件進(jìn)行定義和記述。圖25為本實(shí)施方式軟件評(píng)價(jià)系統(tǒng)的取得運(yùn)行日志的處理的流程圖,是按照在圖23中設(shè)定的內(nèi)容,同時(shí)使用運(yùn)行日志取得開(kāi)始和只在錯(cuò)誤時(shí)使用的觸發(fā)器的功能進(jìn)行設(shè)定的場(chǎng)合。處理一開(kāi)始(步驟S3901),判斷是否將運(yùn)行日志取得代碼所調(diào)用的函數(shù)/方法設(shè)定為運(yùn)行日志取得開(kāi)始觸發(fā)器(步驟S3902)。在設(shè)定為運(yùn)行日志取得開(kāi)始觸發(fā)器的場(chǎng)合,將模塊名、接口名、函數(shù)/方法名臨時(shí)保存于內(nèi)存中(步驟S3903)。其次,運(yùn)行日志取得代碼,將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容臨時(shí)保存于內(nèi)存中(步驟S3904),調(diào)用原來(lái)的函數(shù)/方法(步驟S3905)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼,將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容臨時(shí)存儲(chǔ)于內(nèi)存中(步驟S3906)。其次,判斷運(yùn)行日志取得開(kāi)始觸發(fā)器是否只在錯(cuò)誤時(shí)使用(步驟S3907),如是,就判斷函數(shù)/方法是否錯(cuò)誤(步驟S3908)。假如不是錯(cuò)誤的場(chǎng)合,就將臨時(shí)保存于內(nèi)存中的運(yùn)行日志棄掉(步驟S3909)并返回到處理開(kāi)始。在函數(shù)/方法是錯(cuò)誤的場(chǎng)合,就將臨時(shí)保存于內(nèi)存中的運(yùn)行日志保存到HDD中(步驟S3910),繼續(xù)進(jìn)行通常的運(yùn)行日志取得處理(步驟S3911)。此處理一直進(jìn)行到有來(lái)自用戶的終止命令(步驟S3912)為止。圖26為圖25的步驟3911所示的通常的運(yùn)行日志取得處理的詳細(xì)流程圖。處理一開(kāi)始(步驟S4001),運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于HDD中(步驟S4002)。其次,運(yùn)行日志取得代碼,將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S4003),調(diào)用原來(lái)的函數(shù)/方法(步驟S4004)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼,將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于HDD中(步驟S4005)。圖27為取得本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)的運(yùn)行日志的處理的流程圖,是按照在圖23中設(shè)定的內(nèi)容,同時(shí)使用運(yùn)行日志取得停止和只在錯(cuò)誤時(shí)使用觸發(fā)器的功能進(jìn)行設(shè)定的場(chǎng)合。處理一開(kāi)始(步驟S4101),運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于HDD中(步驟S4102)。其次,運(yùn)行日志取得代碼,將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S4103),調(diào)用原來(lái)的函數(shù)/方法(步驟S4104)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼,將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于HDD中(步驟S4105)。之后,判斷是否將調(diào)用的函數(shù)/方法設(shè)定為運(yùn)行日志取得停止觸發(fā)器(步驟S4106)。在與運(yùn)行日志取得停止觸發(fā)器一致的場(chǎng)合,其次判斷運(yùn)行日志取得停止觸發(fā)器是否只在錯(cuò)誤時(shí)使用(步驟S4107),如是,就判斷函數(shù)/方法是否錯(cuò)誤(步驟S4108)。假如是錯(cuò)誤的場(chǎng)合,運(yùn)行日志取得處理結(jié)束(步驟S4109)。另外,在有來(lái)自用戶的終止命令時(shí)(步驟S4110),該處理將終止。由此,就可以從在任意函數(shù)/方法發(fā)生錯(cuò)誤的場(chǎng)合開(kāi)始或停止取得運(yùn)行日志,可以取得用戶要求的運(yùn)行日志,也可以獲得很容易對(duì)運(yùn)行日志進(jìn)行分析的效果。上述實(shí)施方式4至6的用戶接口,不過(guò)是將可選的函數(shù)/方法以規(guī)定的順序排列而已,也可以將接口、方法的關(guān)系表示為容易掌握的樹(shù)形顯示。圖28為對(duì)本發(fā)明的實(shí)施方式7的接口和方法進(jìn)行樹(shù)形顯示的用戶接口的示圖。在用戶接口中備有用來(lái)將接口及方法顯示為樹(shù)形的視圖(380)。如用戶選中接口InterfaceA(381),就可以將該接口內(nèi)的全部方法MethodAA、MethodAB、MethodAC(382~384)全部選中,成為運(yùn)行日志的取得對(duì)象。另外,通過(guò)取消接口InterfaceB(385)的選中,就可以全部解除該接口內(nèi)的全部方法MethodBA、MethodBB、MethodBC(385~388)的選擇,不再是運(yùn)行日志取得對(duì)象。圖29為本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)在如圖28選擇取得對(duì)象的場(chǎng)合取得運(yùn)行日志之際的處理的流程圖。處理一開(kāi)始(步驟S4301),每當(dāng)運(yùn)行日志取得代碼調(diào)用接口的某一方法時(shí),都判斷該方法的接口是否成為運(yùn)行日志取得對(duì)象(步驟S4302)。在成為運(yùn)行日志取得對(duì)象的場(chǎng)合,將模塊名和接口、方法名保存于HDD中(步驟S4303)。其次,運(yùn)行日志取得代碼將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于HDD中(步驟S4304),調(diào)用原來(lái)的函數(shù)/方法(步驟S4305)。如從方法返回,運(yùn)行日志取得代碼將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于HDD中(步驟S4306)。此處理一直進(jìn)行到有來(lái)自用戶的終止命令時(shí)(步驟S4307)而終止。據(jù)此,可以更簡(jiǎn)便地了解接口、方法的關(guān)系,并且,可以更容易選擇想要取得的運(yùn)行日志,使用戶的取得所要求的運(yùn)行日志的方法更為簡(jiǎn)單。在上述實(shí)施方式4至7中,是假設(shè)在選擇任意的方法時(shí),以接口單位進(jìn)行選擇,此外,也可以以方法單位進(jìn)行選擇。圖30為將本實(shí)施方式的接口和方法進(jìn)行樹(shù)形顯示的用戶接口的示圖,雖與圖28一樣,但選擇方法不同。在用戶接口中備有用來(lái)將接口及方法顯示為樹(shù)形的視圖(389)。如用戶通過(guò)選中方法MethodAA(391)、MethodAC(393)、MethodBA(3395),不選MethodAB(392)、MethodBB(396)、MethodBC(397),就可以不是以InterfaceA(390)、InterfaceB(394)內(nèi)的全部方法,而只是以各進(jìn)口內(nèi)選中的方法作為運(yùn)行日志取得對(duì)象。圖31為本實(shí)施方式的軟件評(píng)價(jià)系統(tǒng)在如圖30選擇取得對(duì)象的場(chǎng)合取得運(yùn)行日志之際的處理的流程圖。處理一開(kāi)始(步驟S4501),每當(dāng)運(yùn)行日志取得代碼調(diào)用接口的某一方法時(shí),都判斷該接口的方法是否成為運(yùn)行日志取得對(duì)象(步驟S4502)。在成為運(yùn)行日志取得對(duì)象的場(chǎng)合,將模塊名和接口、方法名保存于HDD中(步驟S4503)。以下與實(shí)施方式10相同。據(jù)此,就可以不是在每個(gè)接口的很大的范圍內(nèi)進(jìn)行選擇,可以以方法單位更容易地分別選擇想要取得的方法獲得使用戶的取得所要求的運(yùn)行日志的方法更為簡(jiǎn)單的效果。在上述實(shí)施方式中,取得的運(yùn)行日志是保存于HDD中的任意地點(diǎn),但也可以連日期一起保存以便可以更容易對(duì)運(yùn)行日志進(jìn)行分析。圖32為將運(yùn)行日志連日期一起進(jìn)行分割保存的場(chǎng)合的處理的流程圖。處理一開(kāi)始(步驟S4601),運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于內(nèi)存中(步驟S4602)。其次,運(yùn)行日志取得代碼將調(diào)用時(shí)的日期·時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于內(nèi)存中(步驟S4603),調(diào)用原來(lái)的函數(shù)/方法(步驟S4604)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼,將返回時(shí)的日期·時(shí)間、返回值及指針參數(shù)指示的內(nèi)存內(nèi)容存儲(chǔ)于內(nèi)存中(步驟S4605)。之后,判斷調(diào)用的函數(shù)/方法的返回時(shí)的日期是否與上次保存的運(yùn)行日志的返回時(shí)的日期不同(步驟S4606)。在日期不同的場(chǎng)合,就生成新文件,將運(yùn)行日志保存于該文件中(步驟S4607),在相同時(shí),就在原有的運(yùn)行日志文件中保存運(yùn)行日志(步驟S4608)。另外,在有來(lái)自用戶的終止命令時(shí)(步驟S4609),該處理將終止。由此,用戶就可以取得所要求的帶有日期的運(yùn)行日志,也可以獲得很容易對(duì)運(yùn)行日志進(jìn)行分析的效果。在上述實(shí)施方式9中,敘述的是連日期一起保存的場(chǎng)合,但也可以將運(yùn)行日志按照各個(gè)大小或個(gè)數(shù)進(jìn)行分割保存。圖33為按照各個(gè)大小或個(gè)數(shù)進(jìn)行分割保存的場(chǎng)合的處理的流程圖。處理一開(kāi)始(步驟S4701),運(yùn)行日志取得開(kāi)始,將模塊名、接口名、函數(shù)/方法名保存于內(nèi)存中(步驟S4702)。其次,運(yùn)行日志取得代碼將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于內(nèi)存中(步驟S4703),調(diào)用原來(lái)的函數(shù)/方法(步驟S4704)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于內(nèi)存中(步驟S4705)。之后,在將新運(yùn)行日志數(shù)據(jù)保存于原有的文件中的場(chǎng)合,就判斷文件的大小是否超過(guò)一定值或運(yùn)行日志是否超過(guò)一定個(gè)數(shù)(步驟S4706)。在超過(guò)一定大小的場(chǎng)合或超過(guò)一定個(gè)數(shù)的場(chǎng)合,就生成新運(yùn)行日志文件,將運(yùn)行日志保存于該文件(步驟S4707),在不超過(guò)的場(chǎng)合,就保存于原有的運(yùn)行日志文件中(步驟S4708)。在生成新運(yùn)行日志文件的場(chǎng)合,判斷是否使用環(huán)形緩沖器且生成的運(yùn)行日志文件數(shù)是否大于2個(gè)(步驟S4709)。如果在條件合適的場(chǎng)合,將最舊的運(yùn)行日志文件刪除(步驟S4710)。在有來(lái)自用戶的終止命令時(shí)(步驟S4712),該處理終止。由此,用戶可以將生成的多個(gè)運(yùn)行日志每個(gè)的大小和個(gè)數(shù)都限制在一定的大小和個(gè)數(shù)之內(nèi)而取得,處理就變得容易。另外,在使用環(huán)形緩沖器時(shí),本軟件評(píng)價(jià)系統(tǒng)可以對(duì)給予PC的資源的負(fù)擔(dān)予以一定的抑制,可以使運(yùn)行日志的取得穩(wěn)定。圖34為將取得的運(yùn)行日志存儲(chǔ)于一定數(shù)量的內(nèi)存中的場(chǎng)合的內(nèi)存的概圖。用來(lái)保存一定數(shù)目的運(yùn)行日志的運(yùn)行日志存放內(nèi)存區(qū)有n個(gè)(398),在各運(yùn)行日志存放內(nèi)存區(qū)中存放一次數(shù)量的函數(shù)/方法的運(yùn)行日志,該信息存放模塊名、接口名、函數(shù)/方法名、調(diào)用時(shí)的時(shí)間、參數(shù)、調(diào)用時(shí)的參數(shù)數(shù)據(jù)、終止時(shí)的時(shí)間、終止時(shí)的參數(shù)數(shù)據(jù)、返回值數(shù)據(jù)等(399),大小為可變的。在此內(nèi)存區(qū),從運(yùn)行日志存放內(nèi)存區(qū)1開(kāi)始順序存放運(yùn)行日志數(shù)據(jù),一直到運(yùn)行日志存放內(nèi)存區(qū)n為止,如用完的話,則再次從運(yùn)行日志存放內(nèi)存區(qū)1開(kāi)始重寫(xiě)存放運(yùn)行日志。圖35為將取得的運(yùn)行日志保存于一定數(shù)量的內(nèi)存中時(shí)的運(yùn)行日志取得的流程圖。處理一開(kāi)始(步驟S4901),將表示運(yùn)行日志存放內(nèi)存區(qū)的地點(diǎn)的變數(shù)x初始化為1(步驟S4902)。于是,開(kāi)始取得運(yùn)行日志,將模塊名、接口名、函數(shù)/方法名保存于運(yùn)行日志存放內(nèi)存區(qū)x(步驟S4903)。其次,運(yùn)行日志取得代碼將調(diào)用時(shí)的時(shí)間、參數(shù)及指針參數(shù)指示的內(nèi)存的內(nèi)容保存于運(yùn)行日志存放內(nèi)存區(qū)x中(步驟S4904),調(diào)用原來(lái)的函數(shù)/方法(步驟S4905)。如從函數(shù)/方法返回,運(yùn)行日志取得代碼將返回時(shí)的時(shí)間、返回值及指針參數(shù)指示的內(nèi)存的內(nèi)容存儲(chǔ)于運(yùn)行日志存放內(nèi)存區(qū)x中(步驟S4906)。之后,將表示運(yùn)行日志存放內(nèi)存區(qū)的地點(diǎn)的變數(shù)x加1(步驟S4907),判斷x是否比運(yùn)行日志存放內(nèi)存區(qū)數(shù)n大(步驟S4908)。在x比n大時(shí),將1代入x,從運(yùn)行日志存放內(nèi)存區(qū)的前頭開(kāi)始再次使用(步驟S4909)。之后,判斷是否使用環(huán)形緩沖器(步驟S4910),在不使用的場(chǎng)合,將內(nèi)存上存在的全部運(yùn)行日志數(shù)據(jù)保存于運(yùn)行日志文件中(步驟S4911),將內(nèi)存上的運(yùn)行日志數(shù)據(jù)全部刪除(步驟S4912)。此處理一直進(jìn)行到有來(lái)自用戶的終止命令時(shí)(步驟S4913)而終止(步驟S4914)。由此,可以使內(nèi)存的使用量限制于某一程度的值,本軟件評(píng)價(jià)系統(tǒng)可以對(duì)給予PC的資源的負(fù)擔(dān)予以一定的抑制,可以使運(yùn)行日志的取得穩(wěn)定。另外,本發(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)或裝置,該系統(tǒng)或裝置的計(jì)算機(jī)(或CPU及MPU)讀出并執(zhí)行存放于存儲(chǔ)介質(zhì)上的程序代碼而達(dá)到。在此場(chǎng)合,由于從存儲(chǔ)介質(zhì)讀出的程序代碼本身實(shí)現(xiàn)上述實(shí)施方式的功能,所以存儲(chǔ)該程序代碼的存儲(chǔ)介質(zhì)構(gòu)成本發(fā)明。作為提供程序代碼的存儲(chǔ)介質(zhì),比如,可以使用軟盤(pán)(注冊(cè)商標(biāo))、硬盤(pán)、光盤(pán)、磁光盤(pán)、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ù)本發(fā)明,可容易取得分成為多個(gè)模塊的軟件的處理運(yùn)行日志,并且可以削減用來(lái)分析軟件故障的原因的工時(shí)。本發(fā)明不限于上述具體實(shí)施例,并且在不脫離本發(fā)明的精神和范圍的情況下可以實(shí)現(xiàn)本發(fā)明的多種改變和變型。因此,為使廣大群眾了解本發(fā)明的范圍,下面提出本發(fā)明的權(quán)利要求。權(quán)利要求1.一種運(yùn)行日志取得方法,用于取得包括至少一個(gè)執(zhí)行預(yù)定處理的函數(shù)的程序的運(yùn)行日志,包括以下步驟將被加載的用于執(zhí)行上述預(yù)定處理的所述至少一個(gè)函數(shù)的地址改為用來(lái)取得運(yùn)行日志的函數(shù)的地址,其中,所述用來(lái)取得運(yùn)行日志的函數(shù)包含以下步驟調(diào)用進(jìn)行上述預(yù)定處理的所述至少一個(gè)函數(shù),執(zhí)行該預(yù)定處理,接收?qǐng)?zhí)行結(jié)果并將接收到的執(zhí)行結(jié)果轉(zhuǎn)送給上述程序;判斷在上述程序的函數(shù)定義中是否定義了這樣的指針參數(shù)以預(yù)定的方式規(guī)定了其類(lèi)型;并且如果定義了以預(yù)定方式規(guī)定了其類(lèi)型的指針參數(shù),則將該指針參數(shù)所指的內(nèi)存的內(nèi)容作為所述規(guī)定數(shù)據(jù)類(lèi)型的數(shù)據(jù)進(jìn)行記錄。2.如權(quán)利要求1所述的運(yùn)行日志取得方法,其特征在于,用索引結(jié)構(gòu)體定義所述指針參數(shù)的類(lèi)型,并且所述判斷步驟包括通過(guò)訪問(wèn)所述索引結(jié)構(gòu)體的指定成員來(lái)判斷所述指針參數(shù)的類(lèi)型。3.如權(quán)利要求2所述的運(yùn)行日志取得方法,其特征在于,所述索引結(jié)構(gòu)體的至少部分成員的類(lèi)型是各種非輸出函數(shù)。4.如權(quán)利要求2所述的運(yùn)行日志取得方法,其特征在于,所述索引結(jié)構(gòu)體的至少部分成員的類(lèi)型為各種結(jié)構(gòu)體。5.如權(quán)利要求1-4中之一所述的運(yùn)行日志取得方法,其特征為上述用來(lái)取得運(yùn)行日志的函數(shù)進(jìn)一步具有根據(jù)上述定義計(jì)算內(nèi)存大小的步驟,上述記錄步驟記錄上述指針參數(shù)指示的一定量的內(nèi)存內(nèi)容,該量等于所述算出的內(nèi)存大小。6.如權(quán)利要求1-4之一所述的運(yùn)行日志取得方法,在所述調(diào)用步驟之前包括下述步驟選擇所述至少一個(gè)函數(shù)用來(lái)取得運(yùn)行日志。7.如權(quán)利要求1-4之一所述的運(yùn)行日志取得方法,其特征在于在所述調(diào)用步驟之前包括下述步驟選擇至少一個(gè)要停止運(yùn)行日志記錄的函數(shù);對(duì)于所述至少一個(gè)要停止運(yùn)行日志記錄的函數(shù),在記錄后停止運(yùn)行日志記錄。8.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為用來(lái)取得運(yùn)行日志的上述函數(shù)還包含判斷在上述選擇步驟中選擇的所述至少一個(gè)函數(shù)在執(zhí)行時(shí)有無(wú)錯(cuò)誤的步驟,如果上述判斷有無(wú)錯(cuò)誤的步驟判斷出發(fā)生了錯(cuò)誤,則啟動(dòng)所述記錄步驟。9.如權(quán)利要求7所述的運(yùn)行日志取得方法,其特征為用來(lái)取得運(yùn)行日志的上述函數(shù)還包含判斷在上述選擇步驟中選擇的所述至少一個(gè)函數(shù)的執(zhí)行中有無(wú)錯(cuò)誤的步驟,如果在上述判斷有無(wú)錯(cuò)誤的步驟中判斷出發(fā)生了錯(cuò)誤,則所述停止運(yùn)行日志記錄的步驟停止運(yùn)行日志的記錄。10.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為還包括以樹(shù)形結(jié)構(gòu)顯示COM服務(wù)器輸出的接口和屬于該接口的函數(shù)的步驟,上述選擇步驟利用上述顯示進(jìn)行選擇。11.如權(quán)利要求7所述的運(yùn)行日志取得方法,其特征在于還包括以樹(shù)形結(jié)構(gòu)顯示COM服務(wù)器輸出的接口和屬于該接口的函數(shù)的步驟,上述選擇步驟利用上述顯示進(jìn)行選擇。12.如權(quán)利要求10所述的運(yùn)行日志取得方法,其特征在于上述選擇步驟以函數(shù)為單位進(jìn)行選擇。13.如權(quán)利要求11所述的運(yùn)行日志取得方法,其特征在于上述選擇步驟以函數(shù)為單位進(jìn)行選擇。14.如權(quán)利要求10所述的運(yùn)行日志取得方法,其特征為上述選擇步驟通過(guò)選擇上述接口選擇屬于該接口的全部函數(shù)。15.如權(quán)利要求11所述的運(yùn)行日志取得方法,其特征為上述選擇步驟通過(guò)選擇上述接口選擇屬于該接口的全部函數(shù)。16.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為上述記錄步驟按日期記錄運(yùn)行日志。17.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為上述運(yùn)行日志記錄步驟在運(yùn)行日志的大小超過(guò)預(yù)定大小時(shí)生成新的文件。18.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為上述運(yùn)行日志記錄步驟在運(yùn)行日志的個(gè)數(shù)超過(guò)預(yù)定數(shù)目時(shí)生成新的文件。19.如權(quán)利要求6所述的運(yùn)行日志取得方法,其特征為上述將運(yùn)行日志記錄于內(nèi)存中的步驟當(dāng)該內(nèi)存中的運(yùn)行日志的個(gè)數(shù)超過(guò)預(yù)定數(shù)目時(shí)將運(yùn)行日志移動(dòng)和存儲(chǔ)到盤(pán)裝置中。20.一種存儲(chǔ)介質(zhì),其特征為存有使計(jì)算機(jī)實(shí)現(xiàn)權(quán)利要求1-19之一所述的運(yùn)行日志取得方法的控制程序。21.一種控制程序,其特征為使計(jì)算機(jī)實(shí)現(xiàn)權(quán)利要求1-19之一所述的運(yùn)行日志取得方法。全文摘要運(yùn)行日志取得方法、程序和存儲(chǔ)介質(zhì),能容易地取得軟件的處理日志,減少分析程序錯(cuò)誤的人力。該方法用于取得包括執(zhí)行預(yù)定處理的函數(shù)的程序的運(yùn)行日志,包括將被加載的所述函數(shù)的地址改為用來(lái)取得運(yùn)行日志的函數(shù)的地址的步驟,用來(lái)取得運(yùn)行日志的函數(shù)包含以下步驟調(diào)用進(jìn)行上述預(yù)定處理的函數(shù),執(zhí)行該處理,將接收的執(zhí)行結(jié)果送給上述程序;判斷在上述程序的函數(shù)定義中是否定義了以預(yù)定方式規(guī)定了其類(lèi)型的指針參數(shù);若是,則將指針參數(shù)所指內(nèi)存的內(nèi)容作為所述規(guī)定數(shù)據(jù)類(lèi)型的數(shù)據(jù)進(jìn)行記錄。所述類(lèi)型可用索引結(jié)構(gòu)體定義,從而通過(guò)訪問(wèn)索引結(jié)構(gòu)體的指定成員來(lái)判斷指針參數(shù)的類(lèi)型。所述成員的類(lèi)型可以是各種非輸出函數(shù)和各種結(jié)構(gòu)體等。文檔編號(hào)G06F15/00GK1635470SQ20031012456公開(kāi)日2005年7月6日申請(qǐng)日期2003年12月30日優(yōu)先權(quán)日2003年12月30日發(fā)明者陳新俠,韓勁申請(qǐng)人:佳能株式會(huì)社