一种函数定位的方法及装置与流程

文档序号:16247268发布日期:2018-12-11 23:41阅读:176来源:国知局
一种函数定位的方法及装置与流程

本申请涉及计算机软件领域,特别是涉及一种函数定位的方法及装置。

背景技术

在软件开发中,为了降低开发难度,各软件开发商会为开发人员提供一些可以实现特定功能的函数。开发商向开发人员提供这些函数时,往往仅向开发人员提供这些函数的调用接口,而不公开这些函数的内部程序代码。开发人员在软件开发的过程中可以直接调用这些函数,而不必自己用编程语言编写这些函数。

可以理解的是,开发人员对程序代码开发之后,需要对程序代码进行测试,在测试的过程中,上述函数在执行时可能会出现问题。但是,由于调用该函数的上级函数可能有很多,因此,很难确定出是哪一个上级函数导致上述函数在执行时出现问题。

因此,需要提出一种方案,在函数执行出现问题时,能够确定出是哪一个上级函数导致的。



技术实现要素:

本申请所要解决的技术问题是在函数执行出现问题时,能够确定出是哪一个上级函数导致的,提供一种函数定位的方法及装置。

第一方面,本申请实施例提供一种函数定位方法,包括:

利用对目标函数进行宏封装得到的目标宏,确定调用所述目标函数的上级函数的函数信息;

根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。

可选的,所述目标宏通过如下方式获得:

对所述目标函数进行重命名,并且,令所述目标宏的名称与所述目标函数的名称相同;

令所述目标宏调用重命名后的目标函数,并且,添加日志打印语句;

其中,所述日志打印语句用于打印所述上级函数的函数信息。

可选的,所述上级函数的函数信息,包括以下任意一项或多项:

所述上级函数的函数名、所述上级函数的行号、所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识。

可选的,若所述上级函数的函数信息,包括所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识,则所述根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数,包括:

将函数信息中包括所述开始调用所述目标函数的标识,且不包括结束调用所述目标函数的标识的上级函数,定位为所述目标上级函数。

可选的,所述上级函数开始调用所述目标函数的标识,包括:begin;

所述上级函数结束调用所述目标函数的标识,包括:end。

可选的,所述目标函数包括:

windows操作系统中的dll动态库函数;和/或,

linux操作系统中的so动态库函数。

第二方面,本申请实施例提供一种函数定位装置,包括:

确定单元,用于利用对目标函数进行宏封装得到的目标宏,确定调用所述目标函数的上级函数的函数信息;

定位单元,用于根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。

可选的,所述目标宏通过如下方式获得:

对所述目标函数进行重命名,并且,令所述目标宏的名称与所述目标函数的名称相同;

令所述目标宏调用重命名后的目标函数,并且,添加日志打印语句;

其中,所述日志打印语句用于打印所述上级函数的函数信息。

可选的,所述上级函数的函数信息,包括以下任意一项或多项:

所述上级函数的函数名、所述上级函数的行号、所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识。

可选的,若所述上级函数的函数信息,包括所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识,则所述定位单元,具体用于:

将函数信息中包括所述开始调用所述目标函数的标识,且不包括结束调用所述目标函数的标识的上级函数,定位为所述目标上级函数。

可选的,所述上级函数开始调用所述目标函数的标识,包括:begin;

所述上级函数结束调用所述目标函数的标识,包括:end。

可选的,所述目标函数包括:

windows操作系统中的dll动态库函数;和/或,

linux操作系统中的so动态库函数。

与现有技术相比,本申请实施例具有以下优点:

本申请实施例提供的函数定位方法及装置,包括:利用对目标函数进行宏封装得到的目标宏确定调用所述目标函数的上级函数的函数信息;根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。由此可见,采用本申请实施例提供的方案,可以利用目标宏确定出调用目标函数的上级函数的函数信息,无需为每一个上级函数添加日志打印语句,减少了对程序代码的修改量,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,从而可以根据该上级函数的函数信息,快速定位出导致所述目标函数执行出现问题的目标上级函数。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的一种函数定位方法的流程示意图;

图2为本申请实施例提供的一种确定目标宏的方法的流程示意图;

图3为本申请实施例提供的一种函数定位装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请的发明人经过研究发现,现有技术中,开发人员对程序代码开发之后,需要对程序代码进行测试,在测试的过程中,目标函数在执行时可能会出现问题。但是,由于调用目标函数的上级函数可能有很多,因此,很难确定出是哪一个上级函数导致目标函数在执行时出现问题。

本申请的发明人在研究中还发现,可以通过添加日志打印语句的方式,确定出是哪一个上级函数导致目标函数在执行时出现问题。但是,由于在实际应用中,程序代码的规模可能很大,即调用所述目标函数的上级函数可能很多。而添加日志打印语句的方式在具体实现时,要找到调用所述目标函数的各个上级函数,并为每一个上级函数添加日志打印语句,这种方式对程序代码的修改工作量比较大,从而导致定位周期长,不能及时定位出导致目标函数执行出现问题的目标上级函数。

鉴于此,本申请实施例提供一种函数定位方法及装置,包括:利用对目标函数进行宏封装得到的目标宏确定调用所述目标函数的上级函数的函数信息;根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。由此可见,采用本申请实施例提供的方案,可以利用目标宏确定出调用目标函数的上级函数的函数信息,无需为每一个上级函数添加日志打印语句,减少了对程序代码的修改量,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,从而可以根据该上级函数的函数信息,快速定位出导致所述目标函数执行出现问题的目标上级函数。

下面结合附图,详细说明本申请的各种非限制性实施方式。

示例性方法

参见图1,该图为本申请实施例提供的一种函数定位方法的流程示意图。

在本申请实施例中,所述方法例如可以通过以下步骤s101-s102实现。

s101:利用对目标函数进行宏封装得到的目标宏,确定调用所述目标函数的上级函数的函数信息。

需要说明的是,本申请实施例中提及的目标函数,可以为仅对外提供调用接口,不公开内部代码的函数。作为一种示例,所述目标函数可以为windows操作系统中的dll动态库函数;和/或,linux操作系统中的so动态库函数。开发人员在进行软件开发时,可以编写上层函数,调用所述目标函数。

需要说明的是,本申请实施例不具体限定所述目标函数的编程语言,作为一种示例,所述目标函数的编程语言可以为c语言;作为又一种示例,所述目标函数的编程语言可以为c++语言。

需要说明的是,在本申请实施例中,所述调用所述目标函数的上级函数,是指,直接向所述目标函数传递参数从而调用所述目标函数的函数。

需要说明的是,在本申请实施例中,所述上级函数的函数信息,在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题。

需要说明的是,本申请实施例不具体限定所述上级函数的函数信息,作为一种示例,所述上级函数的函数信息,例如可以包括:所述上级函数的函数名、所述上级函数的行号、所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识中的任意一项和多项。

需要说明的是,所述上级函数的函数名即为所述上级函数的名称。

需要说明的是,所述上级函数的行号,是指,所述上级函数出现在程序代码中的第几行。

需要说明的是,所述上级函数开始调用所述目标函数的标识,用于标识所述上级函数开始调用所述目标函数。本申请实施例不具体限定所述上级函数开始调用所述目标函数的标识,所述上级函数开始调用所述目标函数的标识可以根据实际情况具体确定,作为一种示例,所述上级函数开始调用所述目标函数的标识,可以为“begin”。

需要说明的是,所述上级函数结束调用所述目标函数的标识,用于标识所述上级函数对所述目标函数的调用结束。本申请实施例不具体限定所述上级函数结束调用所述目标函数的标识,所述上级函数结束调用所述目标函数的标识可以根据实际情况具体确定,作为一种示例,所述上级函数结束调用所述目标函数的标识,可以为“end”。

需要说明的是,在本申请实施例中,所述目标宏是预先确定的,具体地,所述目标宏的确定方式可以通过如下步骤s201-s202实现。

s201:对所述目标函数进行重命名,并且,令所述目标宏的名称与所述目标函数的名称相同。

s202:令所述目标宏调用重命名后的目标函数,并且,添加日志打印语句;其中,所述日志打印语句用于打印所述上级函数的函数信息。

关于步骤s201和步骤s202,需要说明的是,由于所述目标宏的名称与所述目标函数的名称相同,故而,从编译器的角度,程序代码中的目标函数均为目标宏,因此,当执行到程序代码中的目标函数处时,编译器实际上会执行所述目标宏所定义的逻辑,即:调用重命名后的目标函数,并且,根据添加日志打印语句打印上级函数的函数信息。

由于所述重命名后的目标函数所执行的逻辑即为目标函数的逻辑,故而执行目标宏时,既执行了目标函数原有的逻辑,又将上级函数的函数信息打印了出来。

也就是说,采用本申请实施例提供的方法,仅仅需要定义目标宏,无需对程序代码进行其它修改,程序代码修改量小,有效提升了定位出导致目标函数执行出现问题的目标上级函数的效率。

需要说明的是,本申请实施例不具体限定所述日志打印语句具体包含的内容,所述日志打印语句与所述上级函数的函数信息的具体内容有关,因此,所述日志打印语句具体包括哪些内容,可以根据实际情况具体确定。

s102:根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。

如前文所述,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,故而,根据所述上级函数的函数信息,可以定位出导致所述目标函数执行出现问题的目标上级函数。

可以理解的是,一般来讲,上级函数调用目标函数时,若开始调用之后,一直处在调用该目标函数的阶段,即一直没有结束调用,则说明目标函数可能进入了死循环或者出现了其它的错误,此时,基本可以确定该上级函数为导致所述目标函数执行出现问题的目标上级函数。

如前文所述,所述上级函数开始调用所述目标函数的标识,用于标识所述上级函数开始调用所述目标函数。所述上级函数结束调用所述目标函数的标识,用于标识所述上级函数结束调用所述目标函数。也就是说,若上级函数对所述目标函数的调用过程没有问题,则所述上级函数开始调用所述目标函数的标识和所述上级函数结束调用所述目标函数的标识应该成对出现,即“begin”和“end”应该成对出现。

因此,若所述上级函数的函数信息,包括所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识,则步骤s102在具体实现时,可以将函数信息中包括所述开始调用所述目标函数的标识,且不包括结束调用所述目标函数的标识的上级函数,定位为所述目标上级函数。举例说明,若一个上级函数的函数信息中仅包含所述开始调用所述目标函数的标识“begin”,且不包含所述结束调用所述目标函数的标识“end”,则可以将该上级函数定位为所述目标上级函数。

可以理解的是,在调用所述目标函数的若干个上级函数中,可能仅有一个上级函数导致所述目标函数执行出现问题,也有可能有多个上级函数导致所述目标函数执行出现问题,故而,在本申请实施例中,所述目标上级函数可以仅包含一个上级函数,也可以包括多个上级函数。

可以理解的是,在程序代码开发完成之后,该程序代码在执行的过程中不应打印出一些不必要的信息,因此,上述方法可以在程序代码测试的过程中使用,也就是说,在程序代码测试过程中,使用目标宏,在测试结束之后,则停止使用目标宏。

由此可见,采用本申请实施例提供函数定位方法,可以利用目标宏确定出调用目标函数的上级函数的函数信息,无需为每一个上级函数添加日志打印语句,减少了对程序代码的修改量,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,从而可以根据该上级函数的函数信息,快速定位出导致所述目标函数执行出现问题的目标上级函数。

以上对本申请实施例提供的函数定位方法进行了介绍,以下结合具体实例对本申请实施例提供的函数定位方法进行介绍。

其中,目标函数为:frame_function_public(para1,para2),其中,frame_function_public为目标函数的函数名,para1和para2为目标函数的参数,即上级函数可以向目标函数传递参数para1和para2,从而调用所述目标函数的功能。

上级函数包括第一上级函数module1_function和第二上级函数module2_function。其中,module1_function为第一上级函数的函数名,module2_function为第二上级函数的函数名。

其中,第一上级模块调用所述目标函数的语句为:

第二上级模块调用所述目标函数的语句为:

对目标函数进行宏封装得到目标宏的语句为:

#include<stdio.h>

#defineframe_function_public(para1,para2)\

do{\

file*logfp=fopen(“/tmp/logfile.log”,”a+”);\

fprintf(logfp,“frame_function_publiccalledby:%s,line%d,para1,para2begin\n”,__func__,__line__,para1,prar2);\

frame_function_public_actual(para1,para2);\

fprintf(logfp,“frame_function_publiccalledby:%s,line%d,para1,para2end\n”,__func__,__line__,para1,parr2);\

fclose(logfp);\

}while(0)

#endif

其中:

#defineframe_function_public(para1,para2)中的frame_function_public为目标宏的名称,目标宏的名称与目标函数的名称相同;

frame_function_public_actual(para1,para2)为重命名后的目标函数;

fprintf(logfp,“frame_function_publiccalledby:%s,line%d,para1,para2begin\n”,__func__,__line__,para1,prar2)为日志打印语句;

dowhile(0)之间的语句即为目标宏执行的语句。

从以上语句可以看出,目标宏在调用重命名后的目标函数之前添加了日志打印语句,在调用重命名后的目标函数之后也添加了日志打印语句,也就是说,在上级函数开始调用目标函数时,会打印对应的上级函数的函数信息,在上级函数结束调用目标函数时,会打印对应的上级函数的函数信息。

由此可见,采用本申请实施例提供函数定位方法,可以利用目标宏确定出调用目标函数的上级函数的函数信息,无需为每一个上级函数添加日志打印语句,减少了对程序代码的修改量,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,从而可以根据该上级函数的函数信息,快速定位出导致所述目标函数执行出现问题的目标上级函数。

示例性设备

参见图3,该图为本申请实施例提供的一种函数定位装置的结构示意图。

所述装置300例如可以具体包括:确定单元310和定位单元320。

确定单元310,用于利用对目标函数进行宏封装得到的目标宏,确定调用所述目标函数的上级函数的函数信息;

定位单元320,用于根据所述上级函数的函数信息,定位出导致所述目标函数执行出现问题的目标上级函数。

可选的,所述目标宏通过如下方式获得:

对所述目标函数进行重命名,并且,令所述目标宏的名称与所述目标函数的名称相同;

令所述目标宏调用重命名后的目标函数,并且,添加日志打印语句;

其中,所述日志打印语句用于打印所述上级函数的函数信息。

可选的,所述上级函数的函数信息,包括以下任意一项或多项:

所述上级函数的函数名、所述上级函数的行号、所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识。

可选的,若所述上级函数的函数信息,包括所述上级函数开始调用所述目标函数的标识以及所述上级函数结束调用所述目标函数的标识,则所述定位单元320,具体用于:

将函数信息中包括所述开始调用所述目标函数的标识,且不包括结束调用所述目标函数的标识的上级函数,定位为所述目标上级函数。

可选的,所述上级函数开始调用所述目标函数的标识,包括:begin;

所述上级函数结束调用所述目标函数的标识,包括:end。

可选的,所述目标函数包括:

windows操作系统中的dll动态库函数;和/或,

linux操作系统中的so动态库函数。

由于所述装置300是与以上方法实施例提供的方法对应的装置,故而,关于所述装置300的各个单元的具体实现,可以参考以上方法实施例的描述,此处不再赘述。

由此可见,采用本申请实施例提供函数定位装置,可以利用目标宏确定出调用目标函数的上级函数的函数信息,无需为每一个上级函数添加日志打印语句,减少了对程序代码的修改量,由于所述上级函数的函数信息在一定程度上可以表征所述上级函数对目标函数的调用过程是否出现问题,从而可以根据该上级函数的函数信息,快速定位出导致所述目标函数执行出现问题的目标上级函数。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制

以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1