CN101196848A - 运行日志获取方法 - Google Patents

运行日志获取方法 Download PDF

Info

Publication number
CN101196848A
CN101196848A CNA2006101637309A CN200610163730A CN101196848A CN 101196848 A CN101196848 A CN 101196848A CN A2006101637309 A CNA2006101637309 A CN A2006101637309A CN 200610163730 A CN200610163730 A CN 200610163730A CN 101196848 A CN101196848 A CN 101196848A
Authority
CN
China
Prior art keywords
function
name
acquiring operation
operation log
predetermined process
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
CNA2006101637309A
Other languages
English (en)
Other versions
CN101196848B (zh
Inventor
韩劲
胡欧
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
Priority to CN2006101637309A priority Critical patent/CN101196848B/zh
Publication of CN101196848A publication Critical patent/CN101196848A/zh
Application granted granted Critical
Publication of CN101196848B publication Critical patent/CN101196848B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明涉及一种运行日志获取方法,用于获取包括执行预定处理的函数在内的程序的运行日志,包括将被加载的用于执行所述预定处理的所述函数的地址改为用于获取运行日志的函数的地址的步骤,其中所述用于获取运行日志的函数包含以下步骤:首先分析被追踪的函数名;如果该函数名并非为C++修饰名形式,则以正常方式获取该函数的运行日志;如果该函数名是C++修饰名,则根据编译器规则对修饰名去除修饰,并获得去除修饰后的信息,该去除修饰后的信息包括函数名和例如函数参数类型、调用约定、函数返回类型等的函数参数信息;然后使用上述步骤获得的去除修饰后的信息作为函数定义文件来获取运行日志,并以其去除修饰后的形式显示运行日志。

Description

运行日志获取方法
技术领域
本发明涉及一种用于获取由多个模块组成的软件程序的运行日志的方法、一种使计算机执行该方法的程序,以及包含该程序的存储介质。
背景技术
历来,对于重现率低的软件故障,是通过获取并分析该软件的处理运行日志而查清故障的原因、进而加以解决的。
然而,在获取上述现有的处理运行日志方面存在以下的问题。
(1)为了获取运行日志,必须对软件的模块加以调整以增加处理运行日志获取的例行程序。相应地,这将加大为获取处理运行日志的作业负担。
(2)由于处理运行日志的获取是针对每个模块进行,生成的运行日志是以模块为单位的。这样很难获取整个软件处理的按照时间顺序的运行日志。因此,由于不能对整个处理运行日志进行充分的预测,需要大量人力来分析运行日志以便发现故障原因。
为解决上述问题,日本专利申请公报No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465分别提供了一种可容易地获取被分成为多个模块的软件的运行日志的方法,用于减小分析软件故障原因所需的人力。
上述方法可适用于追踪由C、C++、PASCAL等编程语言开发的应用程序。在以上所有的情况下,需要函数定义文件来描述作为模块出现并与EXE一起加载到内存的动态链接库DLL的函数定义,而如果没有预定义的函数定义文件,则不能输出具有完整运行信息的运行日志。
发明内容
本发明考虑了上述问题,其目的在于提供一种设计成获取函数定义信息已经在其C++修饰名中被指定的函数的运行日志获取方法,尤其涉及在无需额外的用户制定的函数定义文件的情况下直接为C++函数获取运行日志的运行日志获取方法,由此减少了需要分析软件故障原因所需的处理负担。本发明还提供了用于使计算机实现该方法的程序和存放该程序的存储介质。
为达到上述目的,本发明提供了一种运行日志获取方法,用于获取包括执行预定处理的函数在内的程序的运行日志,包括将被加载的用于执行所述预定处理的所述函数的地址改为用于获取运行日志的函数的地址的步骤,
其中所述用于获取运行日志的函数包含以下步骤:
a).确定所述执行预定处理的函数的函数名是否以C++修饰名形式被指定;
b).如果所述函数名以C++修饰名形式被指定,则对该修饰名去除修饰,并获得去除修饰后的信息;以及
c).根据所述去除修饰后的信息中所包含的函数参数类型,记录内存内容作为所述执行预定处理的函数的日志数据。
C++编译器将在对函数定义或原型进行编译的过程中产生为输出函数创建的字符串,这个创建的字符串是修饰名,通常至少包括函数名、函数参数类型、调用约定、函数返回类型。这个修饰名仅由LINK和其它工具处理,并在LINK过程中使用微软通用翻译器工具被去除修饰。然而,现有技术中在目标程序LINK后所述去除修饰后的信息将再不会被使用。根据本发明的运行日志获取方法直接使用去除修饰后的信息作为函数定义文件来获取运行日志。
优选地,所述运行日志获取方法还包括:在步骤c)后以去除修饰名的形式显示所接收的日志的步骤;和/或,在步骤c)后以去除修饰名的形式将所接收的日志保存至日志文件的步骤。
优选地,所述运行日志获取方法还包括:在步骤a)前确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤;如果函数定义文件未被预定义,则执行步骤a)。
或者,所述运行日志获取方法还包括:在步骤b)后确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤;如果函数定义文件被预定义,则根据函数定义文件记录内存内容作为所述执行预定处理的函数的日志数据。
另外,如果根据步骤a)的结果所述函数名未以C++修饰名形式被指定,则所述运行日志获取方法可执行确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤;如果函数定义文件被预定义,则根据函数定义文件记录内存内容作为所述执行预定处理的函数的日志数据。
优选地,如果在步骤a)确定所述函数名未以C++修饰名形式被指定并且进一步确定所述执行预定处理的函数的函数定义文件未被预定义时,则调用所述执行预定处理的函数,使该函数执行所述预定处理,以及将所接收到的执行结果传送至该程序,但没有具有完整运行信息的运行日志输出。
本发明的运行日志获取方法还包括:调用所述执行预定处理的函数、使该函数执行所述预定处理、以及将所接收到的执行结果传送至该程序的步骤;记录在调用所述执行预定处理的函数时的预定信息的步骤;以及记录在接收所述执行结果时的预定信息的步骤。
在调用所述执行预定处理的函数时的预定信息包括如下信息的至少一个:所调用函数的函数名、调用时的时间、调用时的参数以及调用时所述指针参数指向的内存内容。在接收所述执行结果时的预定信息包括如下信息的至少一个:接收时的时间、接收时的参数、接收时的返回值以及接收时所述指针参数指向的内存内容。
另外,在提供所述函数的动态链接库的输入函数地址表中记述了所述执行预定处理的函数的地址和函数名。
本发明的其他特点和优点可从参考下面的附图说明加以了解,附图中同样或类似的部件用相同的标号表示。
附图说明
包括在本说明书中并构成其一个组成部分的附图例举了本发明的各个具体实施方式,并且与说明书一起用于说明本发明的原理。
图1为实施根据本发明第一实施例的运行日志获取方法的计算机(软件评价系统)的配置的框图。
图2示出通常函数加载时的内存构成。
图3示出利用IAT Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成。
图4A是利用IAT Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的状态的视图。
图4B为示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的运行日志获取处理的流程图。
图5为示出利用IAT Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内部设置的示意图。
图6示出生成COM服务器的接口的事例(instance)时的通常的内存构成。
图7为利用VTable Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成
图8A是利用VTable Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的状态的视图。
图8B为示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的运行日志获取处理的流程图。
图9为示出利用IAT Patch实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内部设置的示意图。
图10示出向软件评价系统指示各个函数和方法的参数和返回值格式的函数定义文件的例子。
图11示出实施根据本发明第一实施例的运行日志获取方法的软件评价系统的所获得的运行日志的例子。
图12示出C++输出函数在模块中被声明并且被其它模块调用的例子。
图13示出了选择追踪修饰函数名“?LogCall@@YAHDH_N@Z”的示意图。
图14示出了根据本发明第二实施例修饰函数名被显示为其去除修饰的函数“int_cdecl LogCall(char,int,bool)”的示意图。
图15示出了在用户不指定额外的函数定义文件时追踪修饰函数名”?LogCall@@YAHDH_N@Z”的运行日志结果。
图16示出了在用户不指定额外的函数定义文件时根据本发明第二实施例追踪去除修饰后的函数”int_cdecl LogCall(char,int,bool)”的运行日志结果。
图17示出了额外的函数定义文件的例子。
图18示出了根据本发明第三实施例在软件评价系统中获取运行日志的处理的流程图。
具体实施方式
下面参照附图对本发明的优选实施方式予以详细说明。
[第一实施例]
本实施例,是在给定模块调用存在于另一个模块内的函数时,利用输入函数地址或虚拟函数地址表(Virtual Address Table)作为使用机构、通过挂接模块间的函数调用并将其记录在运行日志中,以时间顺序将整个软件的处理作为处理运行日志获取,而无需对软件的模块本身进行调整。下面具体说明。
<系统配置>
图1为实施本发明优选实施例的运行日志获取方法的计算机(软件评价系统)的配置的框图。为简化说明起见,本软件评价系统是构筑在一台PC的内部。然而,本发明的运行日志获取方法无论构筑于一台PC内部还是在由多个PC构筑的网络系统中都有效。
在实施该实施例的运行日志获取方法的软件评价系统包括:CPU1、芯片组2、RAM 3、硬盘控制器4、显示控制器5、硬盘驱动器6、CD-ROM驱动器7及显示器8。另外,该软件评价系统包括还包括连接CPU 1和芯片组2的信号线11、连接芯片组2和RAM 3的信号线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两个动态链接库内的函数,即实际使用的函数为Func AA、Func AB、Func AC、Func BA、Func BB、Func BC等六个。
当EXE的代码段内的代码调用函数Func AA时,首先读取写在输入函数地址表(22)内的Func AA的地址(30)。实际上输入函数地址表记述作为A.DLL的一部分而加载的Func AA代码(36)的地址,EXE的代码可以通过调用该地址而调用A.DLL的Func AA。
图3为实施根据本发明第一实施例的运行日志获取方法的软件评价系统的内存构成,与图2的不同之处在于对运行日志获取代码采用所谓的IAT Patch(输入函数地址表补丁,Import Address TablePatch)的方案,对函数调用进行重定向。
在开始运行日志的获取时,将用于IAT Patch的C.DLL(58)作为DLL加载到内存中。C.DLL(58)将输入函数地址表(52)内写入的函数的地址改写为作为C.DLL(58)内的运行日志获取代码的FuncCAA、Func CAB、Func CAC、Func CBA、Func CBB、Func CBC的地址(61~66)。C.DLL(58)内的Func CAA、Func CAB、Func CAC、Func CBA、Func CBB、Func CBC的代码(73~78),记录运行日志,并调用被加载到准备接受原始函数调用的内存中的Func AA、FuncAB、Func AC、Func BA、Func BB、Func BC(67~72)。
图4A示出图3的IAT Patch的处理,而图4B为示出运行日志获取处理的流程的流程图。为了简化说明起见,图4A和图4B示出在EXE调用A.DLL内的Func AA之际,IAT Patch产生的运行日志获取代码是如何运行的示例。
在EXE(图4A中的91)调用Func AA(94)时,C.DLL(58)中的运行日志调用将DLL名(C.DLL)/函数名(Func AA)保存到内存中(图4B中的步骤S402)、将调用时的时间保存于内存中、将调用时的参数保存于内存中、将调用时的指针参数指示的内存内容保存于另一个内存中(图4A中的95、图4B中的步骤S403)。其后,C.DLL调用本来应被原始调用的A.DLL(图4A中的93)内的Func AA(图4A中的99、图4B中的步骤S404)。一旦A.DLL的Func AA处理(图4A中的97)结束,并将控制返回C.DLL(图4A中的98)的话,C.DLL就将返回时的时间保存于内存中,将返回值保存于内存中,并将返回时的指针参数指示的内存内容保存于另一个内存中(图4A中的99)。其后,C.DLL将保存的运行日志信息写入文件(图4A中的100、图4B中的步骤S405),控制返回EXE,如同A.DLL的Func AA正常结束一样(图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,virtual address table)与所生成的事例相对应地制备,并被传送至用于执行生成请求的EXE。每个虚拟地址表记述所述方法的生成地址(124~129)。EXE利用这些信息对各个接口进行调用。图5例举了一个EXE生成两个接口、即Interface A(121)和Interface B(122)的事例,并使用该接口内的方法的示例,实际使用的方法为Method AA、Method AB、Method AC、Method BA、Method BB、Method BC(130~135)。
在EXE的代码调用函数Method AA的时候,读出写在虚拟地址表内的Method AA的地址(124)。该表实际上记述了作为COM服务器的一部分Interface A而生成的Method AA代码(130)的地址,通过调用该地址,EXE的代码可以调用Interface A的Method AA。
图7示出了实施本发明第一实施例的运行日志获取方法的软件评价系统的内存构成,与图6的不同之处在于对运行日志获取代码采用所谓的VTable Patch(虚拟地址表补丁,virtual address table Patch)的方法,对方法调用进行重定向。
在开始获取运行日志时,在内存中加载用于VTable Patch的DLL(143)。此DLL将写在虚拟地址表(136、138)内的方法的地址改写为作为DLL内运行日志获取代码的Method A′A、Method A′B、Method A′C、Method B′A、Method B′B、Method B′C的地址(145~150)。DLL中的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为示出运行日志获取处理的流程的流程图。为了简化起见,在此图中,图8A和图8B示出在EXE调用COM服务器内的Interface A的Method AA之际,VTable Patch产生的运行日志获取代码是如何运作的示例。
EXE(图8A中的163)一调用Method AA(图8A中的166),DLL(164)中的运行日志获取代码将模块名/接口名/方法名保存到内存中(图8B中的步骤S802)、将调用时间保存于内存中、将调用时的参数保存于内存中、将调用时的指针参数指示的内存内容保存于另一个内存中(图8A中的167、图8B中的步骤S803)。其后,DLL调用应该被原始调用的COM服务器(图8A中的165)内的Method AA(图8A中的168、图8B中的步骤S804)。如COM服务器的MethodAA处理(图8A中的169)结束,并将控制返回DLL(图8A中的164)的话,DLL(164)就将返回时的时间保存于内存中,将返回值保存于内存中,并将返回时的指针参数指示的内存内容保存于另一个内存中(图8A中的171)。其后,DLL将保存的运行日志信息写入文件(图8A中的172、图8B中的步骤S805)中,控制返回EXE,如同COM服务器的Method AA正常结束一样(图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所示的函数定义文件,实施根据本发明第一实施例的运行日志获取方法的软件评价系统的所获得的运行日志的例子。生成响应于各个调用函数/方法时的时间以及相应的参数/返回值,以作为运行日志。
从以上的说明可知,根据本实施方式的运行日志获取方法,在获取被分成为多个模块的软件的处理运行日志中,可将模块内制备的函数/方法的调用作为运行日志进行记录,而无需对模块本身进行调整,因而可以减少用于获取处理运行日志的作业负担。另外,可以获取按照时间顺序的运行日志,并使得对运行日志的分析变得容易,由此可以减少用于分析软件故障原因的工时。
[第二实施例]
以下第二实施例针对一种设计成获取函数定义信息已经在其C++修饰名中被指定的函数的运行日志获取方法,尤其涉及在无需额外的用户制定的函数定义文件的情况下直接为C++函数获取运行日志的运行日志获取方法,由此减少了需要分析软件故障原因所需的处理负担。
根据该实施例,该方法首先分析被追踪的函数名;如果该函数名并非为修饰名(decorated)形式,则以正常方式获取该函数的运行日志;如果该函数名是修饰名,则根据编译器规则对修饰名去除修饰,并获得去除修饰后的信息(符号),该去除修饰后的信息包括函数名和例如函数参数类型、调用约定、函数返回类型等的函数参数信息;然后使用上述步骤获得的去除修饰后的信息(符号)作为函数定义文件来获取运行日志,并以其去除修饰后的形式显示运行日志。
图12示出了三个C++输出函数在模块中被声明并且被其它模块调用的例子。具体地,三个加载的函数(LogCall)在模块testDll.dll中被声明,然后被图12下部的其它模块调用。
C++编译器将在对函数定义或原型进行编译的过程中产生为输出函数创建的字符串,这个创建的字符串是修饰名,通常至少包括函数名、函数参数类型、调用约定、函数返回类型、函数的成员类别(如果函数是成员函数)、以及函数所属的名字空间(如果函数是名字空间的一部分)。这个修饰名仅由LINK和其它工具处理,特别是对于被加载的C++函数以及其中的特殊成员函数(例如构造(constructor)和析构(destructor)类型函数),它们的修饰名必须被指定以便LINK和其它工具可使之与函数名匹配。通常,在目标程序LINK后所述去除修饰后的信息将再不会被使用。
当函数被加载到内存时,修饰名被写入例如图2所示输入地址表(22)中的地址(30~35)。但是修饰名仅可由″C″或者″C++″函数在内部(编译和链接时)识别,如图13所示;特别是函数名和函数类别被编码在修饰名中,修饰名的其余部分是仅对编译器和链接器具有内部意义的字符(字符串)。
图13示出了选择追踪修饰函数名“?LogCall@@YAHDH_N@Z”的示意图。但如图15所示,当用户在不指定额外的函数定义文件时选择或指定修饰名”?LogCall@@YAHDH_N@Z”进行追踪时,根据正常方式不能获得函数参数、返回值和由指针参数指向的内存内容。
本发明的第二实施例提出,本发明的运行日志获取方法将根据编译器规则对修饰名去除修饰,并获得如图14所示的去除修饰后的信息,该去除修饰后的信息包括函数名、函数参数类型、调用约定、函数返回类型等等;然后使用所获得的去除修饰后的信息(符号)作为函数定义文件来获取运行日志,并且如图16所示以其去除修饰后的形式显示运行日志。
图14示出了根据本发明第二实施例函数名被显示为其去除修饰的函数“int_cdecl LogCall(char,int,bool)”的示意图。这种去除修饰后的信息是通过使用微软通用翻译器工具进行去除修饰而获得的,这种去除修饰后的信息便于用户理解和选择。
图16示出了在用户不指定额外的函数定义文件时根据本发明第二实施例追踪去除修饰后的函数”int_cdecl LogCall(char,int,bool)”的运行日志结果,此时用户无需指定额外的函数定义文件。在此实例中,去除修饰后的信息包括:
函数参数类型:    char,int,bool
调用约定:        cdecl
函数返回类型:    int
因此去除修饰后的函数名“int_cdecl LogCall(char,int,bool)”被显示为运行日志结果的一部分。
另一方面,根据本发明的第二实施例,如果该函数名并非为修饰名形式,则运行日志获取方法以正常方式获取该函数的运行日志(参见日本专利申请公报No.2002-191127、2002-191128、2002-191129以及2002-191130)。图17示出了用于追踪程序中的“?LogCall@@YAHDH_N@Z”的额外的函数定义文件的例子,这个函数定义文件类似于如图5和9所示的文件(111,114)以及图10所示的函数定义文件。
该函数定义文件对用于实现如上所述运行日志获取方法的软件评价系统指令各个函数和方法的参数格式返回值。该函数定义文件描述了DLL/接口名和函数/方法名(在此是LogCall),以及对应于函数/方法名的参数(char,int and bool)和返回值类型(int in the“int_cdecl_LogCall__YAHDH_N_Z”)。用于实现如上所述运行日志获取方法的软件评价系统根据函数定义文件指令的内容确定各个函数/方法名的参数和返回值,并且获得这些函数/方法名的参数和返回值的内容作为运行日志。该运行日志结果如图16所示。
[第三实施例]
以下第三实施例针对结合上述实施例的运行日志获取方法。
图18示出了根据本发明第三实施例在软件评价系统中获取运行日志的处理的流程图。
处理开始于步骤S001,开始该运行日志获取方法,将模块名、接口名和函数/方法名存储在HDD中(步骤S002)。在步骤S003确定已知用于被调用函数的函数/方法名(例如见图6)是否以C++修饰名形式被指定;如果如图2所示函数/方法名以C++修饰名形式被指定,则该第三实施例解释函数/方法修饰名并将去除修饰后的信息/符号存储在内存中(步骤S004)。所述去除修饰后的信息/符号包括:
函数名;
函数参数类型;
调用约定;
函数返回类型。
随后在步骤S005确定是否函数定义文件被指定。如果指定,则基于该函数定义文件将调用时间、参数和由指针参数指示的内存内容存储在HDD中(步骤S007);否则,确定去除修饰后的信息是否存在(步骤S006),如果存在则所述方法将该去除修饰后的信息作为函数定义文件并进行步骤S007的处理。如果在步骤S006确定不存在去除修饰后的信息,则所述方法进行步骤S008的调用原始函数的处理。
随后所述方法从步骤S007或步骤S006进行步骤S008的处理:调用原始函数。在从函数返回后,所示方法确定是否定义了函数定义文件(例如图6所示的例子)(步骤S009),如果已经定义,则基于该函数定义文件将返回时间、返回值和由指针参数指示的内存内容存储在HDD中(步骤S011)。
在步骤S010确定是否存在去除修饰后的信息是否存在,如果存在则所述方法将该去除修饰后的信息作为函数定义文件并进行步骤S011的处理。
当由用户提供结束指令时所述方法结束(步骤S013)。
以上已经参考最佳实施方式解释了本发明,很明显上述步骤的顺序可以在本发明的精神和范围内进行修改。例如:
步骤S005可以移到步骤S003之前,并且如果步骤S005的判断结果为否定,则该运行日志获取方法可以进行步骤S003的处理;
如果步骤S003的判断结果为否定而步骤S005的判断结果为肯定的话,则该运行日志获取方法可以进行步骤S007、步骤S008、步骤S011和步骤S012的处理,因为步骤S009可以省略;
如果步骤S003的判断结果为否定而步骤S005的判断结果也为否定的话,则该运行日志获取方法可以进行步骤S008和步骤S012的处理,并且该循环没有获得运行日志;
如果步骤S003和步骤S003的判断结果为肯定的话,则该运行日志获取方法首先确定是否定义了函数定义文件,如果答案为定义了函数定义文件,则进行步骤S007、步骤S008、步骤S011和步骤S012的处理;但是如果没有定义函数定义文件,则该运行日志获取方法直接使用在先前步骤S004获得的去除修饰的信息作为函数定义文件,类似地通过步骤S007、步骤S008、步骤S011和步骤S012来获得运行日志。
另外,本发明的处理程序可以包括以下的步骤:选择用于获取运行日志的特定函数,以每日为单位记录工作记录;在运行日志的大小大于一个预定尺寸时产生一个新文件;在运行日志的数量大于一个预定数量时产生一个新文件;当内存中的运行日志数量大于一个预定数量时移动该运行日志并将其存储到磁盘设备中,这些步骤在日本专利申请公报No.2002-191127、2002-191128、2002-191129、2002-191130以及2003-099465等中都有详尽的介绍。
[其他实施例]
另外,本发明,既适用于由多个设备(比如,主计算机、接口装置、读入器、打印机等)构成的系统,也适用于由一台设备组成的装置(比如,复印机、传真装置等)。
另外,本发明的目的也可以通过将记录了实现上述实施方式的功能的软件的程序代码的存储介质供给系统或装置而达到,其中该系统或装置的计算机(或CPU及MPU)读出并执行存放于存储介质上的程序代码。
在此场合,由于从存储介质读出的程序代码本身实现上述实施方式的功能,所以存储该程序代码的存储介质构成本发明。
作为提供程序代码的存储介质,比如,可以使用软盘(注册商标)、硬盘、光盘、磁光盘、CD-ROM、CD-R、磁带、非易失性存储卡以及ROM等。
另外,通过执行计算机读出的程序代码,不仅可以实现上述实施方式的功能,而且根据该程序代码的指示,在计算机上运行的OS(操作系统)等进行实际处理的一部分或全部,通过该处理实现上述实施方式的功能的场合也包括在内是自不待言的。
此外,从存储介质读出的程序代码,在写入到插入计算机的功能扩展板或与计算机相连接的功能扩展装置中设置的内存后,根据该程序代码的指示,设置于该功能扩展板或功能扩展装置上的CPU等进行实际处理的一部分或全部,通过该处理实现上述实施方式的功能的场合也包括在内是自不待言的。
已经针对具体实施例描述了本发明。应当理解,本发明不限于上述描述,本领域的技术人员可以作出各种变化和改进,而不脱离本发明的主旨和范围。

Claims (12)

1.一种运行日志获取方法,用于获取包括执行预定处理的函数在内的程序的运行日志,包括将被加载的用于执行所述预定处理的所述函数的地址改为用于获取运行日志的函数的地址的步骤,
其中所述用于获取运行日志的函数包含以下步骤:
a).确定所述执行预定处理的函数的函数名是否以C++修饰名形式被指定;
b).如果所述函数名以C++修饰名形式被指定,则对该修饰名去除修饰,并获得去除修饰后的信息;以及
c).根据所述去除修饰后的信息中所包含的函数参数类型,记录内存内容作为所述执行预定处理的函数的日志数据。
2.如权利要求1所述的运行日志获取方法,其特征在于,所述去除修饰后的信息包括函数名、函数参数类型、调用约定和函数返回类型。
3.如权利要求1所述的运行日志获取方法,其特征在于,所述步骤b)是使用微软通用翻译器工具完成。
4.如权利要求1所述的运行日志获取方法,其特征在于,所述运行日志获取方法还包括:在步骤c)后以去除修饰名的形式显示所接收的日志的步骤;和/或,
在步骤c)后以去除修饰名的形式将所接收的日志保存至日志文件的步骤。
5.如权利要求1所述的运行日志获取方法,其特征在于,所述运行日志获取方法还包括:在步骤a)前确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤,和
如果函数定义文件未被预定义,则执行步骤a)。
6.如权利要求1所述的运行日志获取方法,其特征在于,所述运行日志获取方法还包括:在步骤b)后确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤,和
如果函数定义文件被预定义,则根据函数定义文件,记录内存内容作为所述执行预定处理的函数的日志数据。
7.如权利要求1所述的运行日志获取方法,其特征在于,所述运行日志获取方法还包括:如果根据步骤a)的结果所述函数名未以其C++修饰名形式被指定,则确定所述执行预定处理的函数的函数定义文件是否在所述程序中被预定义的步骤,和
如果函数定义文件被预定义,则根据函数定义文件,记录内存内容作为所述执行预定处理的函数的日志数据。
8.如权利要求1-7中任一所述的运行日志获取方法,其特征在于,所述运行日志获取方法还包括:调用所述执行预定处理的函数、使该函数执行所述预定处理、以及将所接收到的执行结果传送至该程序的步骤;记录在调用所述执行预定处理的函数时的预定信息的步骤;以及记录在接收所述执行结果时的预定信息的步骤。
9.如权利要求5-7中任一所述的运行日志获取方法,其特征在于,如果在步骤a)确定所述函数名未以其C++修饰名形式被指定并且进一步确定所述执行预定处理的函数的函数定义文件未被预定义时,
则调用所述执行预定处理的函数,使该函数执行所述预定处理,以及将所接收到的执行结果传送至该程序,但没有运行日志输出。
10.如权利要求1所述的运行日志获取方法,其特征在于,在提供所述函数的各个动态链接库的输入函数地址表中记述了所述执行预定处理的函数的地址和函数名。
11.一种控制程序,用于使计算机执行如权利要求1-10中任一所述的运行日志获取方法。
12.一种存储如权利要求11所述的控制程序的存储介质。
CN2006101637309A 2006-12-04 2006-12-04 运行日志获取方法 Expired - Fee Related CN101196848B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2006101637309A CN101196848B (zh) 2006-12-04 2006-12-04 运行日志获取方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2006101637309A CN101196848B (zh) 2006-12-04 2006-12-04 运行日志获取方法

Publications (2)

Publication Number Publication Date
CN101196848A true CN101196848A (zh) 2008-06-11
CN101196848B CN101196848B (zh) 2011-10-12

Family

ID=39547279

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2006101637309A Expired - Fee Related CN101196848B (zh) 2006-12-04 2006-12-04 运行日志获取方法

Country Status (1)

Country Link
CN (1) CN101196848B (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102073496A (zh) * 2010-12-29 2011-05-25 浙大网新科技股份有限公司 对调用dll导出函数进行拦截跟踪的方法
CN103123601A (zh) * 2011-11-17 2013-05-29 北京神州泰岳软件股份有限公司 基于Symbian系统的软件开发故障查找的方法和装置
CN103428173A (zh) * 2012-05-17 2013-12-04 云联(北京)信息技术有限公司 基于云计算的体感操控系统及其应用
CN103809938A (zh) * 2012-11-05 2014-05-21 腾讯科技(深圳)有限公司 Python函数运行信息的自动记录方法及系统
CN103853532A (zh) * 2012-11-29 2014-06-11 国际商业机器公司 用于函数调用的方法和装置
CN109739824A (zh) * 2018-12-28 2019-05-10 斑马网络技术有限公司 日志获取方法及设备

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4125169B2 (ja) * 2003-04-02 2008-07-30 キヤノン株式会社 ログ取得方法
CN100472469C (zh) * 2005-02-07 2009-03-25 佳能株式会社 运行日志获取方法

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102073496A (zh) * 2010-12-29 2011-05-25 浙大网新科技股份有限公司 对调用dll导出函数进行拦截跟踪的方法
CN103123601A (zh) * 2011-11-17 2013-05-29 北京神州泰岳软件股份有限公司 基于Symbian系统的软件开发故障查找的方法和装置
CN103123601B (zh) * 2011-11-17 2016-05-25 北京神州泰岳软件股份有限公司 基于Symbian系统的软件开发故障查找的方法和装置
CN103428173A (zh) * 2012-05-17 2013-12-04 云联(北京)信息技术有限公司 基于云计算的体感操控系统及其应用
CN103809938A (zh) * 2012-11-05 2014-05-21 腾讯科技(深圳)有限公司 Python函数运行信息的自动记录方法及系统
CN103809938B (zh) * 2012-11-05 2017-08-25 腾讯科技(深圳)有限公司 Python函数运行信息的自动记录方法及系统
CN103853532A (zh) * 2012-11-29 2014-06-11 国际商业机器公司 用于函数调用的方法和装置
CN103853532B (zh) * 2012-11-29 2017-09-29 国际商业机器公司 用于函数调用的方法和装置
CN109739824A (zh) * 2018-12-28 2019-05-10 斑马网络技术有限公司 日志获取方法及设备

Also Published As

Publication number Publication date
CN101196848B (zh) 2011-10-12

Similar Documents

Publication Publication Date Title
US20210081258A1 (en) Synthesis Path For Transforming Concurrent Programs Into Hardware Deployable on FPGA-Based Cloud Infrastructures
US9727436B2 (en) Adding a profiling agent to a virtual machine to permit performance and memory consumption analysis within unit tests
US5911073A (en) Method and apparatus for dynamic process monitoring through an ancillary control code system
US6539501B1 (en) Method, system, and program for logging statements to monitor execution of a program
CN101196848B (zh) 运行日志获取方法
CN106325970A (zh) 编译方法和编译系统
US20120179447A1 (en) Hybrid Simulation System and Method
EP3895022B1 (en) Improving emulation and tracing performance using compiler-generated emulation optimization metadata
US20070234307A1 (en) Methods and apparatus to inline conditional software instrumentation
US10133871B1 (en) Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system
US20060277371A1 (en) System and method to instrument references to shared memory
CN114237714A (zh) 命令包生成方法、装置、电子设备和存储介质
CN100472469C (zh) 运行日志获取方法
US7188279B2 (en) Method, program, and storage medium for acquiring logs
EP3805879A1 (en) Support device and support program
KR101826828B1 (ko) 로그 데이터 관리 시스템 및 방법
Thoman et al. Sylkan: Towards a vulkan compute target platform for sycl
CN109344083B (zh) 一种程序调试方法、装置、设备及可读存储介质
US9495278B2 (en) Dynamic discovery of data segments within instrumented code
JP4125053B2 (ja) ログ取得方法
JP4886188B2 (ja) 情報処理装置及びその制御方法、コンピュータプログラム及び記憶媒体
JP4125054B2 (ja) ログ取得方法
US9092326B2 (en) Method of creating a virtual address for a daughter software entity related to the context of a mother software entity
CN117435495A (zh) 函数测试方法、装置、计算机可读存储介质及电子设备
CN117908462A (zh) 一种梯形图程序应用装置和方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20111012