专利名称::运行日志获取方法
技术领域:
:本发明涉及一种可容易地获取被分成为多个模块的软件的运行日志的方法。
背景技术:
:历来,对于重现率低的软件故障,是通过获取并分析该软件的处理运行日志(LOG)而查清故障的原因、进而加以解决的。然而,在获取上述现有的处理运行日志方面存在以下的问题。(1)为了获取运行日志,必须对软件的模块加以调整以增加处理运行日志获取的例行程序。相应地,这将加大为获取处理运行日志的作业负担。(2)由于处理运行日志的获取是针对每个模块进行,生成的运行日志是以模块为单位的。这样很难获取整个软件处理的按照时间顺序的运行日志。因此,由于不能对整个处理运行日志进行充分的预测,需要大量人力来分析运行日志以便发现故障原因。为解决上述问题,日本专利申请公报No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465分别提供了一种可容易地获取被分成为多个模块的软件的运行日志的方法,用于减小分析软件故障原因所需的人力。上述每个方法基本上都是获取所有称为EXE的函数/方法的处理运行日志,因此同样可能需要大量的处理运行日志。尽管日本专利申请公报No.2003-099465提供了如下的一个实施例(第二实施例部分1-3),其中将称为EXE的函数/方法的处理运行日志的获取目标通过在API跟踪程序中指定“操作系统的界面”和“界面下的例外模块”而被限制在操作系统的界面之下以及一些特定的例外模块,来获取处理运行日志。但是这种方法仍需要大量的处理运行日志。
发明内容本发明考虑了上述问题,其目的在于提供一种通过选择性地获取软件的处理运行日志,容易地获取被分成为多个模块的软件的运行日志的方法。本发明可以减少分析软件错误故障所需的处理数量。本发明还提供用于藉助计算机实现该方法的程序和存放该程序的存储介质。为达到上述目的,本发明提供了一种运行日志获取方法,用于获取包括至少一个执行预定处理的函数在内的程序的运行日志,包括用于将被加载的用于执行上述预定处理的所述函数的地址改为用于获取运行日志的函数的地址的步骤,其中所述用于获取运行日志的函数包含以下步骤确定一个结构参数是否在所述程序的函数定义中被指定为指向一个结构的结构指针;和如果所述结构参数被指定为结构指针,确定在所述函数定义中是否已经设定了数据成员的预定层次,并确定该结构的数据成员是否为指向另一结构的指针;以及至少在确定所述函数定义中已经设定了数据成员的预定层次之后,比较所述已经被调用的结构的层次和所述预定层次。优选的是,所述用于获取运行日志的函数还包含以下步骤至少在确定所述结构参数被指定为结构指针之后,记录该指针所指向的内存内容,该内存内容将成为与在所述软件的函数定义中定义的结构相关的一部分运行日志。优选的是,所述用于获取运行日志的函数还包含以下步骤如果所述结构的数据成员同样是指向另一结构的指针并且所述已经被调用的结构的层次小于所述预定层次,还记录所述结构的数据成员的指针所指向的内存内容,该内存内容将成为与在所述软件的函数定义中定义的结构相关的另一部分运行日志。因此可以重复地执行上述处理,除非所述结构的数据成员并非指向处于下一层次中的另一结构的指针、或者所述已经被调用的层次大于或等于所述预定层次。优选的是,所述用于获取运行日志的函数还包含调用执行所述预定处理的函数、使该函数执行所述预定处理、以及将所接收到的执行结果传送至该程序的步骤;记录在调用所述执行预定处理的函数时的预定信息的步骤;以及记录在接收所述执行结果时的预定信息的步骤。在调用所述执行预定处理的函数时的预定信息包括如下信息的至少一个所调用函数的函数名、调用时的时间、调用时的参数以及调用时所述指针参数指向的内存内容。在接收所述执行结果时的预定信息包括如下信息的至少一个接收时的时间、接收时的参数、接收时的返回值以及接收时所述指针参数指向的内存内容。另外,在提供所述函数的动态链接库的输入函数地址表中记述了所述执行预定处理的函数的地址。另外,如果没有设定所述数据成员的预定层次,则所述调用执行预定处理的函数时的预定信息和接收所述执行结果时的预定信息可以不包括结构指针所指定的内存内容,因此不会有被所述指针所指向的结构的内存内容被输出。本发明可以利用在程序中设定的数据成员的预定层次来控制上述运行日志获取处理的层次,根据本发明,可以容易地且选择性地获取被分成为多个模块的软件的运行日志的方法,可以减少分析软件错误原因以及进行软件维护所需的处理数量。本发明的所述方法不仅可用于跟踪Java应用程序,而且可用于跟踪由其它程序,例如C、C++、PASCAL等开发的应用程序。本发明的其他特点和优点可从参考下面的加以了解,附图中同样或类似的部件用相同的标号表示。包括在本说明书中并构成其一个组成部分的附图例举了本发明的各个具体实施方式,并且与说明书一起用于说明本发明的原理。图1为实施根据本发明第一实施例的运行日志获取方法的计算机(软件评价系统)的配置的框图。图2示出通常函数加载时的内存构成。图3示出利用IATPatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成。图4A是利用IATPatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的状态的视图。图4B为示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的运行日志获取处理的流程图。图5为示出利用IATPatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内部设置的示意图。图6示出生成COM服务器的接口的事例(instance)时的通常的内存构成。图7为利用VTablePatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成图8A是利用VTablePatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的状态的视图。图8B为示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的运行日志获取处理的流程图。图9为示出利用IATPatch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内部设置的示意图。图10示出向软件评价系统指示各个函数和方法的参数和返回值格式的函数定义文件的例子。图11示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的所获得的运行日志的例子。图12示出实施根据本发明第二实施例的运行日志获取方法的软件评价系统的函数定义文件。图13示出在如图12所示定义函数时在软件评价系统中获取运行日志的处理的流程图。图14例举了具有结构参数并用于描述根据图13的流程图的函数。图15示出在不使用用于待输出数据成员的预定层次时,根据本发明利用图12所示的定义在软件评价系统中获取的运行日志数据。图16示出在使用用于待输出数据成员的预定层次时,根据本发明利用图12所示的定义在软件评价系统中获取的运行日志数据。具体实施例方式下面参照附图对本发明的优选实施方式予以详细说明。本实施例,是在给定模块调用存在于另一个模块内的函数时,利用输入函数地址或虚拟函数地址表(VirtualAddressTable)作为使用机构、通过挂接模块间的函数调用并将其记录在运行日志中,以时间顺序将整个软件的处理作为处理运行日志获取,而无需对软件的模块本身进行调整。下面具体说明。<系统配置>图1为实施本发明优选实施例的运行日志获取方法的计算机(软件评价系统)的配置的框图。为简化说明起见,本软件评价系统是构筑在一台PC的内部。然而,本发明的运行日志获取方法无论构筑于一台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。<涉及函数处理的运行日志的获取>为了说明实施本发明的第一实施例的运行日志获取方法的软件评价系统,首先利用图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)。在图2中,一个EXE使用A.DLL及B.DLL两个动态链接库内的函数,即实际使用的函数为FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC等六个。当EXE的代码段内的代码调用函数FuncAA时,首先读取写在输入函数地址表(22)内的FuncAA的地址(30)。实际上输入函数地址表记述作为A.DLL的一部分而加载的FuncAA代码(36)的地址,EXE的代码可以通过调用该地址而调用A.DLL的FuncAA。图3为实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成,与图2的不同之处在于对运行日志获取代码采用所谓的IATPatch(输入函数地址表补丁,ImportAddressTablePatch)的方案,对函数调用进行重定向。在开始运行日志的获取时,将用于IATPatch的C.DLL(58)作为DLL加载到内存中。C.DLL(58)将输入函数地址表(52)内写入的函数的地址改写为作为C.DLL(58)内的运行日志获取代码的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的地址(61~66)。C.DLL(58)内的FuncCAA、FuncCAB、FuncCAC、FuncCBA、FuncCBB、FuncCBC的代码(73~78),记录运行日志,并调用被加载到准备接受原始函数调用的内存中的FuncAA、FuncAB、FuncAC、FuncBA、FuncBB、FuncBC(67~72)。图4A示出图3的IATPatch的处理,而图4B为示出运行日志获取处理的流程的流程图。为了简化说明起见,图4A和图4B示出在EXE调用A.DLL内的FuncAA之际,IATPatch产生的运行日志获取代码是如何运行的示例。在EXE(图4A中的91)调用FuncAA(94)时,C.DLL(58)中的运行日志调用将DLL名(C.DLL)/函数名(FuncAA)保存到内存中(图4B中的步骤S402)、将调用时的时间保存于内存中、将调用时的参数保存于内存中、将调用时的指针参数指示的内存内容保存于另一个内存中(图4A中的95、图4B中的步骤S403)。其后,C.DLL调用本来应被原始调用的A.DLL(图4A中的93)内的FuncAA(图4A中的99、图4B中的步骤S404)。一旦A.DLL的FuncAA处理(图4A中的97)结束,并将控制返回C.DLL(图4A中的98)的话,C.DLL就将返回时的时间保存于内存中,将返回值保存于内存中,并将返回时的指针参数指示的内存内容保存于另一个内存中(图4A中的99)。其后,C.DLL将保存的运行日志信息写入文件(图4A中的100、图4B中的步骤S405),控制返回EXE,如同A.DLL的FuncAA正常结束一样(图4A中的101)。图5为实施根据本发明第一实施例的运行日志获取方法的软件评价系统的功能配置的示图。通常,执行文件EXE(113)调用DLL-1(116)及DLL-2(117)内的函数。但是,在此处,嵌入被称为API跟踪程序(114)的运行日志获取代码,以便生成处理运行日志(115)。API跟踪程序(114),根据记述DLL-1及DLL-2的函数定义的文件(111)以及指定DLL和函数(以及层次)的设定情景(追踪情景112)而运行,其输入地址表在获取运行日志时被重写。<涉及方法处理的运行日志的获取>下面,在实施第一实施例的运行日志获取方法的软件评价系统中,为了说明执行文件EXE在生成由COM(构件对象模型)服务器输出的接口的事例(instance)时是如何被加载到内存中,首先参照图6对在通常的状态下如何加载到内存的情况予以说明。通常,在生成接口事例(instance)时,在COM服务器内生成被请求的接口(121、122)及其方法(在面向对象编程中记述了对象所执行的过程的程序130~135),这两者都被加载到内存中。此处,虚拟地址表(118、120,virtualaddresstable)与所生成的事例相对应地制备,并被传送至用于执行生成请求的EXE。每个虚拟地址表记述所述方法的生成地址(124~129)。EXE利用这些信息对各个接口进行调用。图5例举了一个EXE生成两个接口、即InterfaceA(121)和InterfaceB(122)的事例,并使用该接口内的方法的示例,实际使用的方法为MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(130~135)。在EXE的代码调用函数MethodAA的时候,读出写在虚拟地址表内的MethodAA的地址(124)。该表实际上记述了作为COM服务器的一部分InterfaceA而生成的MethodAA代码(130)的地址,通过调用该地址,EXE的代码可以调用InterfaceA的MethodAA。图7示出了实施本发明第一实施例的运行日志获取方法的软件评价系统的内存构成,与图6的不同之处在于对运行日志获取代码采用所谓的VTablePatch(虚拟地址表补丁,virtualaddresstablePatch)的方法,对方法调用进行重定向。在开始获取运行日志时,在内存中加载用于VTablePatch的DLL(143)。此DLL将写在虚拟地址表(136、138)内的方法的地址改写为作为DLL内运行日志获取代码的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),记录运行日志,并调用作为对应方法的MethodAA、MethodAB、MethodAC、MethodBA、MethodBB、MethodBC(157~162)。图8A为示出图7的VTablePatch处理的示图,图8B为示出运行日志获取处理的流程的流程图。为了简化起见,在此图中,图8A和图8B示出在EXE调用COM服务器内的InterfaceA的MethodAA之际,VTablePatch产生的运行日志获取代码是如何运作的示例。EXE(图8A中的163)一调用MethodAA(图8A中的166),DLL(164)中的运行日志获取代码将模块名/接口名/方法名保存到内存中(图8B中的步骤S802)、将调用时间保存于内存中、将调用时的参数保存于内存中、将调用时的指针参数指示的内存内容保存于另一个内存中(图8A中的167、图8B中的步骤S803)。其后,DLL调用应该被原始调用的COM服务器(图8A中的165)内的MethodAA(图8A中的168、图8B中的步骤S804)。如COM服务器的MethodAA处理(图8A中的169)结束,并将控制返回DLL(图8A中的164)的话,DLL(164)就将返回时的时间保存于内存中,将返回值保存于内存中,并将返回时的指针参数指示的内存内容保存于另一个内存中(图8A中的171)。其后,DLL将保存的运行日志信息写入文件(图8A中的172、图8B中的步骤S805)中,控制返回EXE,如同COM服务器的MethodAA正常结束一样(图8A中的173)。图9为实施根据本发明第一实施例的运行日志获取方法的软件评价系统的功能配置的示图。通常,执行文件EXE(176)调用COM服务器1(179)及COM服务器2(180)内的方法,此处,嵌入被称为API跟踪程序(177)的运行日志获取代码,以便生成处理运行日志(178)。API跟踪程序(177),根据记述COM服务器1(179)及COM服务器2(180)的函数定义的文件(174)和指定COM服务器、接口和方法的设定情景(跟踪情景175)而运行,其虚拟地址表在获取运行日志时被重写。图10示出向软件评价系统指示各个函数和方法的参数和返回值格式的函数定义文件的例子。该文件记述了DLL/接口名和函数/方法名(“函数/方法”指“函数或方法”,同样适用于以下的描述),以及与这些函数/方法相对应的参数和返回值类型。根据该实施例的运行日志获取方法的软件评价系统根据该函数定义文件所指令的内容确定各个函数/方法的参数/返回值,并获得其内容以作为运行日志。图11示出使用图10所示的函数定义文件,实施根据本发明第一实施例的运行日志获取方法的软件评价系统的所获得的运行日志的例子。生成响应于各个调用函数/方法时的时间以及相应的参数/返回值,以作为运行日志。从以上的说明可知,根据本实施方式的运行日志获取方法,在获取被分成为多个模块的软件的处理运行日志中,可将模块内制备的函数/方法的调用作为运行日志进行记录,而无需对模块本身进行调整,因而可以减少用于获取处理运行日志的作业负担。另外,可以获取按照时间顺序的运行日志,并使得对运行日志的分析变得容易,由此可以减少用于分析软件故障原因的工时。以下描述涉及那些具有带有类参数的或属于结构数据类型的函数的函数/方法,其中可以选择性地限制由EXE所调用的函数/方法的处理运行日志的获取对象。图12示出实施根据本发明第二实施例的运行日志获取方法的软件评价系统的函数定义文件。其中定义的函数“FuncComplexStruct”具有两种类型的参数“index”和“lpClsL1”,“lpClsL1”被确定为类参数。在该函数定义文件中,为简化起见,假定有7个层次类参数,从第一至第六层次中的结构体“struct”都包括数据成员和结构指针,且该结构指针指向下一层次的结构,而在最后一层次中的“struct”仅包括数据成员。因此,在函数定义文件分别定义了位于七个嵌套层次中的七个“struct”(typedefstruct),在“struct”中,结构指针被分别定义为LPCLS_L2,LPCLS_L3,LPCLS_L4,LPCLS_L5,LPCLS_L6和LPCLS_L7。图13示出在如图12所示定义函数时在软件评价系统中获取运行日志的处理的流程图。在步骤1301,开始处理,在步骤1302,开始运行日志获取并将模块名、接口名、方法名(或函数名/方法名)存储在内存(或者直接存储在HDD)中。在步骤1303,确定参数是否被指定为一个结构指针,如果该参数并被被指定为一个结构指针,则该处理程序直接跳至步骤1309。与第一实施例中类似地继续与选择层次无关的其它处理,即将调用时的时间、参数以及结构参数指向的内容存储在HDD中(见步骤1309);然后调用原始函数(见步骤1310);将返回时的时间、返回值以及结构参数指向的内存内容存储在HDD中(见步骤1311);然后该处理程序可以返回至步骤1302并执行所述函数/方法的返回处理,直至用户指令一个结束命令(见步骤1312)。如果在步骤1303确定参数是一个结构指针,则该处理程序根据函数定义中定义的结构体(struct)类型查找到或记录由该结构指针所指向的内存内容(见步骤1304),然后在步骤1305确定该结构的数据成员是否也是一个结构指针。如果数据成员不是一个结构指针,则该处理程序跳至步骤1309,重复步骤1309至步骤1312。如果在步骤1305确定该结构的数据成员是一个结构指针,则该处理程序确定是否已经设定预定层次(见步骤1306);如果并未设定预定层次,则该处理程序跳至步骤1309,重复步骤1309至步骤1312。在此步骤1309由EXE调用的所有函数/方法的处理运行日志都存储在HDD中,可选择地,该处理程序可增加一个通知用户未设定预定层次的步骤或请求用户确认的步骤。可替代地,如果没有设定预定层次,则该处理程序可以仅将目的模块记录到操作系统模块列表中,调用原始函数,并且跳至步骤1312;或者,调用执行预定处理的函数时记录的预定信息和接收执行结果时的预定信息可以不包括结构指针所指定的内存内容,因此不会有被所述指针所指向的结构的内存内容被输出。如果在步骤1306设定了预定层次,则处理程序确定待输出的数据成员的当前层次是否小于所述预定层次(在步骤1307)。如果所述数据成员的当前层次大于或等于所述预定层次,则处理程序跳至步骤1309,并重复步骤1309至步骤1312,在步骤1309,所存储的内存内容即是在数据成员的预定层次内的由上述指针参数所指向的内容。如果在步骤1307所述数据成员的当前层次小于所述预定层次,则处理程序使数据成员的当前层次增加1(在步骤1308),然后执行步骤1304,开始执行函数/方法的返回处理。另外,从步骤1303至步骤1306的处理也适用于执行返回或循环处理。为更好地解释上述步骤,在此提供一个参照图14所示函数详细地描述步骤1303至1309的示例,其中假设预定层次被设定为2,用于在步骤1307中判断当前层次是否小于2;被追踪的函数具有一个称为P的结构指针参数,例如图14中的Func(Struct_Ap*);结构体Struct_A包括一个称为AA的数据成员(在此AA可以是除了指针之外的任何其它内容)以及一个结构指针Ap*,该结构指针Ap*指向图14所示的结构体Struct_B;以及结构体Struct_B包括一个数据成员BB以及一个结构指针Bp*,该结构指针Ap*指向图14所示的结构体Struct_C。当执行流程图中的步骤1303至1309时,在步骤1303确定所述参数为一个结构指针(如图14所示的P),随后处理程序执行步骤1304在内存中存储Struct_A的内容AA。在步骤1305发现Struct_A的数据成员Ap*是一个结构指针,随后执行步骤1306并发现已经设定了预定层次,然后执行步骤1307。在该步骤1307,处理程序判断当前层次是否小于所述预定层次,由于当前层次为1,小于预定层次2,因此处理程序执行步骤1308。在该步骤1308,处理程序增大当前层次,即当前层次变为2。随后处理程序返回步骤1304,开始处理第二层次,并在内存中存储Struct_B的内容BB。在步骤1305发现Struct_B的数据成员Bp*同样是一个结构指针,随后执行步骤1306并发现已经设定了预定层次,然后执行步骤1307。在该步骤1307,处理程序判断当前层次是否小于所述预定层次,由于当前层次为2,等于预定层次2,因此处理程序执行步骤1309而不是步骤1308。在步骤1309,处理程序将以上步骤1304中存储的参数内容AA和BB存储到硬盘中。在该实施例中,由于预定层次为2,因此内容CC不会被存储到硬盘中。在上述实施例中,请注意如果在步骤1307的判断结果为“否”,则处理程序应执行步骤1309,保存已经获取的内容,而如果在步骤1307的判断结果为“是”,则处理程序应执行步骤1308,以增大当前层次。图15示出在不使用用于待输出数据成员的预定层次时,根据本发明利用图12所示的定义在软件评价系统中获取的运行日志数据。在该数据运行日志中,所有的参数信息都被输出,因此十分耗时并且需要很大的空间存储这些所有的参数信息。而且,有时这么详尽的运行日志数据对于使用者而言并没有用。另一方面,图16示出在使用用于待输出数据成员的预定层次时,根据本发明利用图12所示的定义在软件评价系统中获取的运行日志数据。在该例子中,预定层次为2。通过与图15所示的现有技术比较,可以看出,使用本发明可以仅输出用户所希望知道的参数信息,由此极大地提高了获得运行日志数据的性能。以上已经参考最佳实施方式介绍了本发明,很明显上述步骤,尤其是步骤1304-1306,无需被限定为以上所述的次序,例如考虑到判断是否设定了预定层次在上述处理程序中可以仅被执行一次,因此步骤1306可以直接移至步骤1304之前,而且从步骤1308开始的返回处理开始仍返回至步骤1304。尽管本发明的优点并不在于指定参数为结构指针,但本领域的普通技术人员可以料想到各种限定或指定结构参数的技术,例如日本专利申请公报No.2002-191128和2002-191129所公开的技术。另外,本发明的处理程序可以包括以下的步骤选择用于获取运行日志的特定函数,以每日为单位记录工作记录;在运行日志的大小大于一个预定尺寸时产生一个新文件;在运行日志的数量大于一个预定数量时产生一个新文件;当内存中的运行日志数量大于一个预定数量时移动该运行日志并将其存储到磁盘设备中,这些步骤在日本专利申请公报No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465等中都有详尽的介绍。另外,本发明,既适用于由多个设备(比如,主计算机、接口装置、读入器、打印机等)构成的系统,也适用于由一台设备组成的装置(比如,复印机、传真装置等)。另外,本发明的目的也可以通过将记录了实现上述实施方式的功能的软件的程序代码的存储介质供给系统或装置而达到,其中该系统或装置的计算机(或CPU及MPU)读出并执行存放于存储介质上的程序代码。在此场合,由于从存储介质读出的程序代码本身实现上述实施方式的功能,所以存储该程序代码的存储介质构成本发明。作为提供程序代码的存储介质,比如,可以使用软盘(注册商标)、硬盘、光盘、磁光盘、CD-ROM、CD-R、磁带、非易失性存储卡以及ROM等。另外,通过执行计算机读出的程序代码,不仅可以实现上述实施方式的功能,而且根据该程序代码的指示,在计算机上运行的OS(操作系统)等进行实际处理的一部分或全部,通过该处理实现上述实施方式的功能的场合也包括在内是自不待言的。此外,从存储介质读出的程序代码,在写入到插入计算机的功能扩展板或与计算机相连接的功能扩展装置中设置的内存后,根据该程序代码的指示,设置于该功能扩展板或功能扩展装置上的CPU等进行实际处理的一部分或全部,通过该处理实现上述实施方式的功能的场合也包括在内是自不待言的。已经针对具体实施例描述了本发明。应当理解,本发明不限于上述描述,本领域的技术人员可以作出各种变化和改进,而不脱离本发明的主旨和范围。权利要求1.一种运行日志获取方法,用于获取包括至少一个执行预定处理的函数在内的程序的运行日志,包括将被加载的用于执行所述预定处理的所述函数的地址改为用于获取运行日志的函数的地址的步骤,其中所述用于获取运行日志的函数包含以下步骤确定一个结构参数是否在所述程序的函数定义中被指定为指向一个结构的结构指针;和如果所述结构参数被指定为结构指针,确定在所述函数定义中是否已经设定了数据成员的预定层次,并确定该结构的数据成员是否为指向另一结构的指针;以及至少在确定所述函数定义中已经设定了数据成员的预定层次之后,比较所述已经被调用的结构的层次和所述预定层次。2.如权利要求1所述的运行日志获取方法,其特征在于,所述用于获取运行日志的函数还包含以下步骤至少在确定所述结构参数被指定为结构指针之后,记录该指针所指向的内存内容,该内存内容将成为与在所述软件的函数定义中定义的结构相关的一部分运行日志。3.如权利要求2所述的运行日志获取方法,其特征在于,所述用于获取运行日志的函数还包含以下步骤如果所述结构的数据成员同样是指向另一结构的指针并且所述已经被调用的结构的层次小于所述预定层次,还记录所述结构的数据成员的指针所指向的内存内容,该内存内容将成为与在所述软件的函数定义中定义的结构相关的另一部分运行日志。4.如权利要求1-3中任一所述的运行日志获取方法,其特征在于,所述用于获取运行日志的函数还包含调用执行所述预定处理的函数、使该函数执行所述预定处理、以及将所接收到的执行结果传送至该程序的步骤;记录在调用所述执行预定处理的函数时的预定信息的步骤;以及记录在接收所述执行结果时的预定信息的步骤。5.如权利要求4所述的运行日志获取方法,其特征在于,在调用所述执行预定处理的函数时的预定信息包括如下信息的至少一个所调用函数的函数名、调用时的时间、调用时的参数以及调用时所述指针参数指向的内存内容。6.如权利要求4所述的运行日志获取方法,其特征在于,在接收所述执行结果时的预定信息包括如下信息的至少一个接收时的时间、接收时的参数、接收时的返回值以及接收时所述指针参数指向的内存内容。7.如权利要求1所述的运行日志获取方法,其特征在于,在提供所述函数的各个动态链接库的输入函数地址表中记述了所述执行预定处理的函数的地址。8.如权利要求4所述的运行日志获取方法,其特征在于,如果没有设定所述数据成员的预定层次,则在调用所述执行预定处理的函数时的预定信息包括如下信息的至少一个所调用函数的函数名、调用时的时间以及调用时的参数;在接收所述执行结果时的预定信息包括如下信息的至少一个接收时的时间、接收时的参数以及接收时的返回值。全文摘要在软件评价系统中,本发明提供了在具有类或结构类型数据的函数参数的程序中,通过仅输出在预定层次内的类或结构类型的数据成员来提高运行日志获取方法的性能的方法,包括将被加载的用于执行所述预定处理的函数的地址改为用于获取运行日志的函数的地址的步骤,其中该函数包含确定一个结构参数是否在程序的函数定义中被指定为指向一个结构的结构指针;如果结构参数被指定为结构指针,确定在函数定义中是否已经设定了数据成员的预定层次,并确定该结构的数据成员是否为指向另一结构的指针;至少在确定函数定义中已经设定了数据成员的预定层次之后,比较已经被调用的结构的层次和预定层次。文档编号G06F11/36GK1818885SQ20051000827公开日2006年8月16日申请日期2005年2月7日优先权日2005年2月7日发明者唐宪伟,韩劲申请人:佳能株式会社