一种获取应用的代码执行记录的方法及装置制造方法及图纸

技术编号:32130581 阅读:34 留言:0更新日期:2022-01-29 19:28
本发明专利技术涉及金融科技(Fintech)领域,公开一种获取应用的代码执行记录的方法及装置,针对应用中满足设定要求的函数,设置所述函数的代理对象;在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;运行所述拷贝函数,并基于所述代理对象获取所述拷贝函数运行时中的代码执行记录;将各函数的代码执行记录进行上报。基于代理的方式,可实现以无插桩的方式获取代码执行记录,不需要有构建环节的侵入、接入成本低,此外,能够获取的代码执行记录维度更多,最终产出物相比于代码插装技术的产出物,文件体积更小,从而程序执行的性能更优。的性能更优。的性能更优。

【技术实现步骤摘要】
一种获取应用的代码执行记录的方法及装置


[0001]本申请实施例涉及金融科技(Fintech)领域,尤其涉及一种获取应用的代码执行记录的方法及装置。

技术介绍

[0002]随着计算机技术的发展,越来越多的技术(例如:大数据、云计算或区块链)应用在金融领域,传统金融业正在逐步向金融科技转变,比如对于一些银行业务,用户通过日常使用的终端就可以进行办理了,从而免于去线下的实体银行办理。其中,用户主要是通过银行提供的网上银行服务进行业务办理的。因此,从银行的角度出发,不断优化网上银行服务,提升用户对网上银行服务的满意度,这对银行的持久化发展具有深远意义。其中,银行可通过获取代码执行记录来分析代码覆盖率,进而为网上银行服务的优化提供思路。
[0003]目前,为了获取代码的执行记录,多使用代码插桩技术。如对于一段需要分析代码覆盖率的目标代码,技术人员可以根据实际的代码检测需求、而在该段目标代码的不同位置插入完成相应工作的代码,即插桩代码。如此,当该段目标代码在执行的时候,插桩代码也会随之执行,这个时候可将对应的信息通过接口请求的方式发送至后台服务器,以此获取代码的执行记录,实现对代码覆盖率的检测。
[0004]对于上述获取代码执行记录的方案,其因为需要依赖代码插桩技术,因此具有以下几个缺点:
[0005]第一,插桩代码的引入时机在于对目标代码的构建与编译过程,因此对于不同的目标代码,当要对它们分别执行代码覆盖率的检测时,则需要更改或适配该些目标代码,即存在一定的改造成本;
[0006]第二,代码插桩技术的实现需要在目标代码构建的时候就进行插桩代码的二次加工与注入,这是具有侵入性的,某种程度会破坏目标代码的纯净,导致开发者实际产出的代码与编译时的产物不同,从而引发一些不在开发者掌控之中的未知错误;
[0007]第三,在实际产出的代码中,因为还包含了一些插桩代码,该部分插桩代码可能是重复及冗余的,这样有可能导致构建、打包出来的代码体积变得很大,增加了应用加载与渲染的时间,不利于用户体验。
[0008]因此,目前亟需一种文件体量小、接入成本低及无侵入性的代码执行记录的获取方案。

技术实现思路

[0009]本申请提供一种获取应用的代码执行记录的方法及装置,用以低成本地、无侵入性地获取代码的执行记录。
[0010]第一方面,本申请实施例提供一种获取应用的代码执行记录的方法,该方法包括:针对应用中满足设定要求的函数,设置所述函数的代理对象;在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;运行所述拷贝函数,并基于所述代理对
象获取所述拷贝函数运行时的代码执行记录;将各函数的代码执行记录进行上报。
[0011]上述方案中,基于代理的方式,可实现以无插桩的方式获取代码执行记录,不需要有构建环节的侵入、接入成本低,此外,能够获取的代码执行记录维度更多,最终产出物相比于代码插装技术的产出物,文件体积更小,从而程序执行的性能更优。
[0012]在一种可能实现的方法中,针对应用中满足设定要求的函数,设置所述函数的代理对象,包括:在所述应用的主入口文件中引入配置代码;基于所述配置代码中的工厂函数,对所述应用的构造类中满足设定要求的函数创建代理对象。
[0013]上述方案中,通过在应用的主入口文件中引入配置代码,从而可以基于配置代码中的工厂函数对应用的构造类中的函数进行遍历,进而筛选出满足设定要求的函数并为其创建代理对象,最后基于所创建的代理对象则可以获取到函数执行的时机和操作信息,即函数的代码执行记录。该方式避免了在源码构建时候由于需要引入插桩代码而进行的二次加工与注入操作所带来的侵入性。
[0014]在一种可能实现的方法中,在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数,包括:在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的函数上下文和函数入参数组;将所述函数上下文和所述函数入参数组作为所述函数的绑定函数的入参,得到所述函数的拷贝函数。
[0015]上述方案中,通过代理对象获取函数的代码执行记录时,则首先要求准确地对原函数予以执行,如此后续所获取的代码执行记录将是可信的;该过程中,由于已经先用代理对象替换掉了原函数的属性,因此为了实现对原函数的准确执行,则在对原函数进行调用之前,通过代理对象获取到原函数的函数上下文和函数入参数组,接着可将获取到的函数上下文和函数入参数组作为绑定函数的入参,从而可以得到原函数的拷贝函数。
[0016]在一种可能实现的方法中,基于所述代理对象获取所述拷贝函数运行中的代码执行记录,包括:基于所述代理对象,创建全局化的异常对象;通过所述异常对象,获取所述拷贝函数运行过程对应的堆栈信息;所述堆栈信息包括函数的调用链路;基于所述堆栈信息,得到所述拷贝函数的代码执行记录;在得到所述代码执行记录之后,删除所述异常对象。
[0017]上述方案中,在函数被准确地执行后,为了可以获取到函数对应的代码执行记录,则可以基于代理对象创建出一个全局化的异常对象,该异常对象可用于获取原函数运行过程中对应的堆栈信息,从而基于堆栈信息可以获取到原函数的代码执行记录,显然该种获取代码执行记录的方案与传统代码插装技术相比,利用全局化的异常对象可以将分析的步骤从构建过程后置到代码运行时,而不需要任何构建过程的接入,从而节省了在构建时分析代码文本的额外成本;此外,在获取到代码执行记录之后,通过删除异常对象,则可确保异常不对外抛出,这样就不会因为没有捕获异常错误导致向上层堆栈传递反馈,引起应用非正常阻塞,同时也优化了内存。
[0018]在一种可能实现的方法中,基于所述堆栈信息,得到所述拷贝函数的代码执行记录,包括:对所述堆栈信息进行解析,得到所述拷贝函数在堆栈信息解析时间下的元纪录信息;所述元记录信息包括按执行顺序倒序排列的各函数信息。
[0019]上述方案中,对于函数执行后对应得到的堆栈信息,通过对堆栈信息进行解析,从而就可以得到按执行顺序倒序排列的各函数信息,即元记录信息,且任一条元记录信息同时被打上函数被解析堆栈信息时候的时间戳,时间戳信息可以为后续的函数去重处理提供
快捷处理的条件。
[0020]在一种可能实现的方法中,将各函数的代码执行记录进行上报,包括:将各函数的代码执行记录按照各函数的堆栈信息解析时间倒序排列;针对倒序排列的各函数的代码执行记录中的各函数信息进行去重处理;若去重后的函数信息满足预设数量要求,则将满足预设数量要求的各函数信息发送至后台服务器。
[0021]上述方案中,在JavaScript中由于函数是自上而下的执行顺序,在一次函数执行的过程中,最后一个函数执行的堆栈信息中会包含有整个调用链路,而链路上位于上层的函数又有可能被记录一次,这个过程中会产生大量的冗余数据,造成统计的偏差。本方案为了清理冗余数据,可进行过滤操作,因此,通过此方式的过滤操作,可以有效地过滤掉重复的数据,为后续后台服务器执行代码覆盖率的检测奠定基础。此外,根据对堆栈信息处本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种获取应用的代码执行记录的方法,其特征在于,所述方法包括:针对应用中满足设定要求的函数,设置所述函数的代理对象;在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;运行所述拷贝函数,并基于所述代理对象获取所述拷贝函数运行时中的代码执行记录;将各函数的代码执行记录进行上报。2.如权利要求1所述的方法,其特征在于,所述针对应用中满足设定要求的函数,设置所述函数的代理对象,包括:在所述应用的主入口文件中引入配置代码;基于所述配置代码中的工厂函数,对所述应用的构造类中满足设定要求的函数创建代理对象。3.如权利要求1所述的方法,其特征在于,所述在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数,包括:在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的函数上下文和函数入参数组;将所述函数上下文和所述函数入参数组作为所述函数的绑定函数的入参,得到所述函数的拷贝函数。4.如权利要求1所述的方法,其特征在于,所述基于所述代理对象获取所述拷贝函数运行中的代码执行记录,包括:基于所述代理对象,创建全局化的异常对象;通过所述异常对象,获取所述拷贝函数运行过程对应的堆栈信息;所述堆栈信息包括函数的调用链路;基于所述堆栈信息,得到所述拷贝函数的代码执行记录;在得到所述代码执行记录之后,删除所述异常对象。5.如权利要求4所述的方法,其特征在于,所述基于所述堆栈信息,得到所述拷贝函数的代码执行记录,包括:对所述堆栈信息进行解析,得到所述拷贝函数在堆栈信息解析时间下的元纪录信息;所述元记录信息包括按执行顺...

【专利技术属性】
技术研发人员:方启涵
申请(专利权)人:深圳前海微众银行股份有限公司
类型:发明
国别省市:

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

1