一种基于代码对象的Python钩子函数方法和装置制造方法及图纸

技术编号:19691617 阅读:28 留言:0更新日期:2018-12-08 11:07
一种基于代码对象的Python钩子函数方法,包括以下步骤:获取目标函数相对应的目标函数信息,所述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数;根据所获取的信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;分别获取的目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调用目标函数以触发调试函数。本发明专利技术的有益效果为:通过创建与待监控的目标函数相对应的调试函数,将运行中的程序对目标函数的调用重定向至调试函数,提供了一种对回调函数进行监控的方式。

【技术实现步骤摘要】
一种基于代码对象的Python钩子函数方法和装置
本专利技术涉及一种测试系统,尤其涉及一种基于代码对象的Python钩子函数方法和装置。
技术介绍
随着计算机软件行业的发展,以及电子设备的硬件性能不断提高,应用程序的功能变得越来越复杂,且规模也越来越大。在应用程序的开发阶段,为了对其内部各个函数的实际调用情况进行分析,相关函数往往要被执行hook操作。对函数执行hook操作是一种监控函数运行的方法,其指通过拦截应用程序运行时对原函数的访问,并将应用程序重定向到开发人员自定义的函数上。由于开发人员在其自定义的函数上方便地调用各种测试工具,因此对函数的hook操作能够监控应用程序中关键函数的执行并修改相关函数的具体行为,从而为测试的自动化提供了很多方便。因为在Python中,函数是以对象的形式存在;所以在Python中调用函数时,应用程序需要根据函数名字找到函数对象,从而调用相应的函数。目前,行业内对Python中的函数进行hook操作时一般采用所谓的MonkeyPatch的方法。该方法通过把函数名字所对应的函数对象替换为自定义的函数对象,从而将应用程序重定向至自定义的函数对象。由于该方法可以在应用程序运行时对已有的代码进行修改,显著地提高了开发人员调试的效率,因此在行业内被广泛地使用(例如用于实现“绿色线程”的函数库eventlet)。然而,在实际使用中,MonkeyPatch的方法存在以下的缺陷:当目标函数的对象被事先保存下来(这种用法常见于回调函数的场合),此时开发人员若再采用MonkeyPatch的方法调试目标函数,则由于相关的函数已经被事先保存下来,因此应用程序在调用相关的函数时,不再需要再通过函数名字访问目标函数的对象,从而无法将应用程序重定向至开发人员的自定义函数中。
技术实现思路
本专利技术的目的是解决现有技术的不足,提供一种基于代码对象的Python钩子函数方法和装置,能够获得在服务器运行时,对注册到回调函数中的函数进行监测的效果。为了实现上述目的,本专利技术采用以下的技术方案。首先,本专利技术提出一种基于代码对象的Python钩子函数方法,包括以下步骤:获取目标函数相对应的目标函数信息;根据所获取的目标函数信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;分别获取的目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调用目标函数以触发调试函数。其中,上述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数。在上述方法的一个或多个实施例中,在执行上述方法前还包括以下预处理:注入运行中的服务器进程,以获取与Python虚拟机交互的shell。在上述方法的一个或多个实施例中,第二函数对象包含打印外部日志文件的语句。进一步地,在上述实施例中,第二函数对象所生成的外部日志文件被保存在测试服务器和/或运行测试用例的终端上。在上述方法的一个或多个实施例中,上述调试函数是通过执行脚本创建的。在上述方法的一个或多个实施例中,第一函数对象和调试函数相对应的第二函数对象是通过脚本获取的,且上述脚本将第一函数对象中func_code成员赋值给第二函数对象的func_code成员。其次,本专利技术还提出一种基于代码对象的Python钩子函数装置,其包括以下模块:第一获取模块:用于获取目标函数相对应的目标函数信息,上述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数;创建模块,用于根据所获取的目标函数信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;第二获取模块,用于分别获取的目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调试模块,用于调用目标函数以触发调试函数。在上述装置的一个或多个实施例中,上述装置还包括以下的预处理模块:注入模块,用于注入运行中的服务器进程,以获取与Python虚拟机交互的shell。在上述装置的一个或多个实施例中,第二函数对象包含打印外部日志文件的语句。进一步地,在上述实施例中,调试模块将第二函数对象所生成的外部日志文件保存在测试服务器和/或运行测试用例的终端上。在上述装置的一个或多个实施例中,创建模块通过执行脚本创建上述调试函数。在上述装置的一个或多个实施例中,第二获取模块通过脚本获取第一函数对象和调试函数相对应的第二函数对象,且上述脚本将第一函数对象中func_code成员赋值给第二函数对象的func_code成员。最后,本专利技术还公开了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如前述任一项所述的方法的步骤。本专利技术的有益效果为:通过创建与待监控的目标函数相对应的调试函数,将运行中的程序对目标函数的调用重定向至调试函数,提供了一种对回调函数进行监控的方式。附图说明图1所示为基于代码对象的Python钩子函数方法的一个实施例的流程图;图2所示为图1所示流程的执行过程示意图;图3所示为本专利技术的一个实施例保存外部日志文件方式的示意图;图4所示为基于代码对象的Python钩子函数装置的一个实施例的模块图。具体实施方式以下将结合实施例和附图对本专利技术的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本专利技术的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。附图中各处使用的相同的附图标记指示相同或相似的部分。在本文中,目标函数是Python应用程序中待调试的函数,尤其是Python应用程序中的回调函数。相应地,调试函数是根据目标函数编写,用于监控目标函数执行状况的函数。在调试函数中,目标函数原有的功能可以仅部分执行或者不执行。然而,调试函数可以通过诸如将所接收的输入变量或者函数调用堆栈打印为外部日志文件的方式,向开发人员提供执行目标函数时,目标函数的外部运行环境。然而在Python中,某些目标函数由于各种原因,函数相应的对象被事先保存下来,使得此类函数被调用时可以不需要通过函数的名字访问。例如对于目标函数是回调函数的情况,此时由于目标函数在应用程序初始化的时候已经被定义,并注册相应的指针(地址)给应用程序,因此这使得目标函数的对象已被保存。当需要调用回调函数时,应用程序可以直接通过指针(地址)而不是回调函数的对象访问函数,从而无法将应用程序重定向至调试函数。参照图1所示的方法流程图,本专利技术公开了一种基于代码对象的Python钩子函数方法,包括以下步骤:获取目标函数相对应的目标函数信息;根据所获取的目标函数信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;分别获取的目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调用目标函数以触发调试函数。其中,上述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数。参照图2所示的执行过程示意图,当待调试的目标函数被应用程序回调时,由于目标函数的func_code成员已被调试函数的对应成员本文档来自技高网
...

【技术保护点】
1.一种基于代码对象的Python钩子函数方法,其特征在于,包括以下步骤:获取目标函数相对应的目标函数信息,所述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数;根据所获取的目标函数信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;分别获取目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调用目标函数以触发调试函数。

【技术特征摘要】
1.一种基于代码对象的Python钩子函数方法,其特征在于,包括以下步骤:获取目标函数相对应的目标函数信息,所述目标函数信息至少包含由以下项组成的组:目标函数的参数类型和闭包函数的闭包变量个数;根据所获取的目标函数信息,创建与目标函数具有相同参数类型和闭包变量个数的调试函数;分别获取目标函数相对应的第一函数对象和调试函数相对应的第二函数对象,并将第一函数对象中func_code成员赋值给第二函数对象的func_code成员;调用目标函数以触发调试函数。2.根据权利要求1所述的方法,其特征在于,在执行所述方法前还包括以下预处理:注入运行中的服务器进程,以获取与Python虚拟机交互的shell。3.根据权利要求1所述的方法,其特征在于,第二函数对象包含打印外部日志文件的语句。4.根据权利要求3所述的方法,其特征在于,第二函数对象所生成的外部日志文件被保存在测试服务器和/或运行测试用例的终端上。5.根据权利要求1所述的方法,其特征在于,所述调试函数是...

【专利技术属性】
技术研发人员:黎健钧刘青云廖泉辉李邦戈刘鼎三杨明邦
申请(专利权)人:珠海金山网络游戏科技有限公司珠海西山居互动娱乐科技有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1