一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种获取应用的代码执行记录的方法及装置与流程

2022-02-22 06:13:40 来源:中国专利 TAG:


1.本技术实施例涉及金融科技(fintech)领域,尤其涉及一种获取应用的代码执行记录的方法及装置。


背景技术:

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


技术实现要素:

9.本技术提供一种获取应用的代码执行记录的方法及装置,用以低成本地、无侵入性地获取代码的执行记录。
10.第一方面,本技术实施例提供一种获取应用的代码执行记录的方法,该方法包括:针对应用中满足设定要求的函数,设置所述函数的代理对象;在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;运行所述拷贝函数,并基于所述代理对
象获取所述拷贝函数运行时的代码执行记录;将各函数的代码执行记录进行上报。
11.上述方案中,基于代理的方式,可实现以无插桩的方式获取代码执行记录,不需要有构建环节的侵入、接入成本低,此外,能够获取的代码执行记录维度更多,最终产出物相比于代码插装技术的产出物,文件体积更小,从而程序执行的性能更优。
12.在一种可能实现的方法中,针对应用中满足设定要求的函数,设置所述函数的代理对象,包括:在所述应用的主入口文件中引入配置代码;基于所述配置代码中的工厂函数,对所述应用的构造类中满足设定要求的函数创建代理对象。
13.上述方案中,通过在应用的主入口文件中引入配置代码,从而可以基于配置代码中的工厂函数对应用的构造类中的函数进行遍历,进而筛选出满足设定要求的函数并为其创建代理对象,最后基于所创建的代理对象则可以获取到函数执行的时机和操作信息,即函数的代码执行记录。该方式避免了在源码构建时候由于需要引入插桩代码而进行的二次加工与注入操作所带来的侵入性。
14.在一种可能实现的方法中,在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数,包括:在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的函数上下文和函数入参数组;将所述函数上下文和所述函数入参数组作为所述函数的绑定函数的入参,得到所述函数的拷贝函数。
15.上述方案中,通过代理对象获取函数的代码执行记录时,则首先要求准确地对原函数予以执行,如此后续所获取的代码执行记录将是可信的;该过程中,由于已经先用代理对象替换掉了原函数的属性,因此为了实现对原函数的准确执行,则在对原函数进行调用之前,通过代理对象获取到原函数的函数上下文和函数入参数组,接着可将获取到的函数上下文和函数入参数组作为绑定函数的入参,从而可以得到原函数的拷贝函数。
16.在一种可能实现的方法中,基于所述代理对象获取所述拷贝函数运行中的代码执行记录,包括:基于所述代理对象,创建全局化的异常对象;通过所述异常对象,获取所述拷贝函数运行过程对应的堆栈信息;所述堆栈信息包括函数的调用链路;基于所述堆栈信息,得到所述拷贝函数的代码执行记录;在得到所述代码执行记录之后,删除所述异常对象。
17.上述方案中,在函数被准确地执行后,为了可以获取到函数对应的代码执行记录,则可以基于代理对象创建出一个全局化的异常对象,该异常对象可用于获取原函数运行过程中对应的堆栈信息,从而基于堆栈信息可以获取到原函数的代码执行记录,显然该种获取代码执行记录的方案与传统代码插装技术相比,利用全局化的异常对象可以将分析的步骤从构建过程后置到代码运行时,而不需要任何构建过程的接入,从而节省了在构建时分析代码文本的额外成本;此外,在获取到代码执行记录之后,通过删除异常对象,则可确保异常不对外抛出,这样就不会因为没有捕获异常错误导致向上层堆栈传递反馈,引起应用非正常阻塞,同时也优化了内存。
18.在一种可能实现的方法中,基于所述堆栈信息,得到所述拷贝函数的代码执行记录,包括:对所述堆栈信息进行解析,得到所述拷贝函数在堆栈信息解析时间下的元纪录信息;所述元记录信息包括按执行顺序倒序排列的各函数信息。
19.上述方案中,对于函数执行后对应得到的堆栈信息,通过对堆栈信息进行解析,从而就可以得到按执行顺序倒序排列的各函数信息,即元记录信息,且任一条元记录信息同时被打上函数被解析堆栈信息时候的时间戳,时间戳信息可以为后续的函数去重处理提供
快捷处理的条件。
20.在一种可能实现的方法中,将各函数的代码执行记录进行上报,包括:将各函数的代码执行记录按照各函数的堆栈信息解析时间倒序排列;针对倒序排列的各函数的代码执行记录中的各函数信息进行去重处理;若去重后的函数信息满足预设数量要求,则将满足预设数量要求的各函数信息发送至后台服务器。
21.上述方案中,在javascript中由于函数是自上而下的执行顺序,在一次函数执行的过程中,最后一个函数执行的堆栈信息中会包含有整个调用链路,而链路上位于上层的函数又有可能被记录一次,这个过程中会产生大量的冗余数据,造成统计的偏差。本方案为了清理冗余数据,可进行过滤操作,因此,通过此方式的过滤操作,可以有效地过滤掉重复的数据,为后续后台服务器执行代码覆盖率的检测奠定基础。此外,根据对堆栈信息处理的结果,可以一种较佳的反馈方式,即在满足数量要求后才向后台服务器发送各函数分别对应的代码执行记录,避免短时间内因为需要反馈大量函数的代码执行记录状态下发生的频繁的网络请求对应用的性能造成的影响。
22.在一种可能实现的方法中,运行所述拷贝函数,包括:通过try cache语法对所述拷贝函数进行包裹;通过临时变量对cache语句中传入的异常信息进行存储;在所述拷贝函数运行结束后,上报所述临时变量中存储的异常信息。
23.上述方案中,由于拷贝函数在执行过程中可能存在有异常信息,而未捕获的异常会阻塞函数的执行过程,导致有一些产生异常的函数无法被记录。为了规避这种情况,需要先使用try cache语法将拷贝函数的执行语句进行包裹,然后在cache语句中将传入的异常信息用临时变量存储,并在拷贝函数运行结束后,视临时变量中存在异常信息的情况确定是否进行异常信息的上报,如此保证了对用户进行了真实、有效的反馈。
24.第二方面,本技术实施例提供一种获取应用的代码执行记录的装置,该装置包括:代理对象设置单元,用于针对应用中满足设定要求的函数,设置所述函数的代理对象;函数获取单元,用于在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;函数处理单元,用于运行所述拷贝函数,并基于所述代理对象获取所述拷贝函数运行时的代码执行记录;上报单元,用于将各函数的代码执行记录进行上报。
25.第三方面,本技术实施例提供了一种计算设备,包括:
26.存储器,用于存储程序指令;
27.处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行如第一方面任一实现方法。
28.第四方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如第一方面任一实现方法。
附图说明
29.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
30.图1为本技术实施例提供的一种系统架构的示意图;
31.图2为本技术实施例提供的一种获取应用的代码执行记录的方法的示意图;
32.图3为本技术实施例提供的一种获取应用的代码执行记录的装置的示意图;
33.图4为本技术实施例提供的一种计算设备。
具体实施方式
34.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
35.针对于目前的通过代码插桩技术以获取函数的代码执行记录的方案,因为对于不同的目标代码则要求不断的适配与之对应的插桩代码,这显然需要付出很多的时间和人力成本,以及,引入插桩代码的时机主要在于对目标代码进行构建的过程,这是一个二次加工与注入的过程,是具有侵入性的,某种程度会破坏目标代码的纯净,并引发一些不在开发者掌控之中的未知错误,此外,由于引入了插桩代码,这将导致构建打包出来的代码体积明显变大,如此会延长应用加载与渲染的时间,拉低了用户体验。
36.针对上述技术问题,本技术提供一种可能的系统架构,如图1所示,为本技术实施例提供的一种系统架构的示意图,包括终端110和服务器120。
37.其中,终端110可以为智能手机、电脑、ipad等智能设备,其上安装有各种应用程序。在本技术的场景下,为了检测一应用程序本身或者该应用程序的局部服务对应的代码覆盖率,则可以将该应用程序基于ecmascript 6.0(es6)的规范进行构建。
38.服务器120为终端110中的各应用程序分别对应的服务器,用于为用户提供各种服务,以及在本技术的场景下,服务器120支持对应用程序的代码覆盖率进行检测。服务器120可以为一台物理服务器,也可以为若干台物理服务器构建而成的服务器集群。
39.其中,es6是javascript语言的下一代标准,已经于2015年6月进行正式发布。其中,proxy(代理)是es6标准中新增的功能,proxy用于创建一个目标对象的代理,以实现基本操作的拦截和自定义,如可包括属性查找、赋值、枚举、函数调用等内容。可以理解成,在目标对象之前架设了一层“拦截”,外界对该目标对象的访问,都必须先通过这层拦截,因此proxy提供了一种机制,即支持对外界的访问进行过滤和改写。
40.针对背景技术的问题,以及基于本技术提供的系统架构,本技术实施例提供一种获取应用的代码执行记录的方法。如图2所示,为本技术实施例提供的一种获取应用的代码执行记录的方法的示意图,该方法可以由图1所示的终端110予以执行,该方法包括以下步骤:
41.步骤201,针对应用中满足设定要求的函数,设置所述函数的代理对象。
42.可选的,在所述应用的主入口文件中引入配置代码;基于所述配置代码中的工厂函数,对所述应用的构造类中满足设定要求的函数创建代理对象。
43.例如,在程序初始执行时,可在应用的主函数入口文件中,增加对相关逻辑代码的引用。其中,所增加的逻辑代码至少可提供以下三方面的能力,包括:
44.1、提供配置化的能力。比如初始化各配置项,如后台服务器的接口地址、向后台服
务器发送函数的代码执行记录的条件(即数据发送策略)等内容;
45.2、提供临时存储代码执行记录的能力,以及根据配置的数据发送策略适时地与后台服务器进行交互的能力;
46.3、提供代理行为的工厂函数。工厂函数也即一种能力,该能力是整个服务中最重要的一项,在工厂函数内部可利用proxy功能创建一个代理对象,基于所创建的代理对象,可以获取被代理的函数执行的时机和操作信息,即函数的代码执行记录。
47.在引入相关逻辑代码后,可对应用所在的框架进行适配并创建代理对象。例如,在本技术的场景下,以为属性为实例方法的函数创建代理对象进行说明。具体的,在相关逻辑代码引入后,可向当前运行程序的全局环境中注入一工厂函数,其中,该工厂函数的入参是应用所在的框架用于实例化的构造函数,通过该工厂函数,可对构造函数进行处理。其中,工厂函数对构造函数进行处理的内容可包括:
48.工厂函数可对构造函数的各属性进行遍历,其中,如果当前被遍历的属性并非为实例方法,则继续对下一个属性进行判别;如果当前被遍历的属性为实例方法,则工厂函数可以通过一个临时变量对该属性进行存储;在工厂函数结束对构造函数的全部属性的遍历后,工厂函数可以将临时变量中所存储的各属性依次传入proxy函数,通过proxy函数,临时变量中的各属性可一一被创建出与之相对应的一个代理对象。这表示,在遍历结束后,构造函数内部的所有实例方法,都将被新创建的代理对象一一替换。
49.步骤202,在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数。
50.可选的,在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的函数上下文和函数入参数组;将所述函数上下文和所述函数入参数组作为所述函数的绑定函数的入参,得到所述函数的拷贝函数。
51.在es 6.0的规范中,当在对函数进行proxy代理的拦截处理后,用户触发动作所对应到的对相关函数的调用,实际上执行的,则是基于该函数实例化出来的代理对象中名为apply的实例方法,该实例方法的作用是实现对被代理函数的调用拦截。
52.例如,对于用户对应用程序作出的某一动作,设该动作对应的函数为函数f;进一步的,如果函数f属于实例方法,则函数f在应用程序初始化过程中就将被配置的工厂函数使用proxy函数创建了代理对象;从而在用户真的发出函数f对应的动作时,实际上执行的是基于函数f实例化出来的代理对象中名为apply的实例方法,也即函数f被拦截了,而不再是直接对函数f进行执行了。其中,在函数f被拦截的同时,应用可向apply的实例方法传入三个参数,分别为函数f的指针、函数f的上下文信息和函数f的入参数组。
53.在函数f被拦截处理后,本技术实施例中为了获取函数f对应的代码执行记录,首先需对函数f进行准确地执行。其中,为了实现对函数f的准确执行,则要求函数的上下文和作用域必须跟被代理前保持一致。为此,本技术实施例中采用函数原型链上的bind(绑定)方法,该bind方法可用于拷贝一个函数并允许手动修改上下文的指向。以函数f为例,该bind方法具体可包括:首先,获取传入到apply实例方法中的第一个参数,即函数f的指针,即得到了被代理前的函数f;接着,通过查找原型链的方式找到函数f中的bind方法并执行,同时将apply实例方法中的第二个参数和第三个参数,即函数f的上下文信息和函数f的入参数组作为bind方法的入参传入,如此将得到的函数f的拷贝函数。
54.步骤203,运行所述拷贝函数,并基于所述代理对象获取所述拷贝函数运行时的代码执行记录。
55.基于步骤202,在一函数满足代理条件并被创建代理对象后,用户在发出该函数的对应的动作时,应用将不再是直接对该函数进行执行,而是执行所创建的代理对象中的名为apply的实例方法。该实例方法的第一步则是准确地执行被代理的函数,即原函数。为了准确地执行原函数,本步骤则可以基于步骤202提供的(原函数的)拷贝函数进行执行。
56.可选的,通过try cache语法对所述拷贝函数进行包裹;通过临时变量对cache语句中传入的异常信息进行存储;在所述拷贝函数运行结束后,上报所述临时变量中存储的异常信息。
57.例如,本步骤在对(原函数的)拷贝函数进行执行时,由于函数执行过程中可能存在有异常信息,而未捕获的异常会阻塞本步骤的获取行为,导致有一些产生异常的函数无法被记录。为了规避这种情况,需要先使用try cache语法将拷贝函数的执行语句进行包裹,然后在cache语句中将传入的异常信息用临时变量存储,以便在后续流程使用到,具体参见下文的说明。
58.可选的,基于所述代理对象获取所述拷贝函数运行中的代码执行记录,包括:基于所述代理对象,创建全局化的异常对象;通过所述异常对象,获取所述拷贝函数运行过程对应的堆栈信息;所述堆栈信息包括函数的调用链路;基于所述堆栈信息,得到所述拷贝函数的代码执行记录;在得到所述代码执行记录之后,删除所述异常对象。
59.可选的,基于所述堆栈信息,得到所述拷贝函数的代码执行记录,包括:对所述堆栈信息进行解析,得到所述拷贝函数在堆栈信息解析时间下的元纪录信息;所述元记录信息包括按执行顺序倒序排列的各函数信息。
60.例如,在对原函数的拷贝函数执行调用,并使用临时变量存储好拷贝函数在被调用时可能抛出的异常信息后,从而就产生出原函数对应的代码执行记录。针对形成的代码执行记录,本技术实施例中,可通过error全局对象实例化出一个全新的异常对象,该异常对象是应用基于es规范的标准实现的,不会存在兼容性的问题,因此当异常对象被实例化出来后,应用可自动为该异常对象堆栈信息字段“stack”赋值,该字段会包含函数的调用链路和顺序。与传统的代码插装技术相比,本技术实施例利用error全局异常对象可以将分析的步骤从构建过程后置到代码运行时,不需要任何构建过程的接入,从而节省了在构建时分析代码文本的额外成本。
61.进一步的,对于获取到的“stack”堆栈信息,其数据结构是以特定的格式存储的一段字符串,内容是将每一条堆栈以字符串“at”、“\n”相连接。使用“at”、“\n”这两个标识符切割堆栈信息字符串,就可以得到一个按执行顺序倒序排列的堆栈信息数组,数组中的每一项都是字符串,内容是将函数名、函数文件名、代码行数等具体信息用空格连接。对得到的堆栈信息数组进行二次遍历,用空格切割每一项,就能分别得到每个执行记录的函数名、函数文件名、代码行数等信息,并将得到的函数名、函数文件名和代码行数等信息存储为对象形式,同时扩展时间戳属性,可以得到一条元记录信息,最后将这些元记录信息存储在终端内存的一临时存储点中,该临时存储点令为记录池。在完成对堆栈信息的解析并获取到代码的执行记录后,需要将本技术实施例中主动实例化出来的error全局对象销毁掉,确保异常不对外抛出,这样就不会因为没有捕获异常错误导致向上层堆栈传递反馈,引起程序
非正常阻塞,同时也优化了内存。
62.说明的是,当完成对堆栈信息的解析操作后,不管原函数的拷贝函数是正常执行还是在执行过程中产生了异常,本技术都可记录到一条或多条元记录信息。其中,对于原函数的拷贝函数在执行过程中可能产生的异常,本技术实施例已经在执行原函数的拷贝函数的过程中使用临时变量对可能产生的异常进行了存储;因此,在解析完堆栈信息后,为了实现对用户操作的正确响应,此时需要判断临时变量中的信息是否为空值,若为空值则说明原函数的拷贝函数在执行过程中并没有产生任何异常,因此可以继续后续的代码执行记录的上报步骤;若不为空值,本技术实施例中可先使用throw语句将存储的异常信息原封不动向外抛出,这样能最大程度确保函数与代理外部的异常捕获逻辑不受影响,而后继续后续的代码执行记录的上报步骤。
63.步骤204,将各函数的代码执行记录进行上报。
64.可选的,将各函数的代码执行记录按照各函数的堆栈信息解析时间倒序排列;针对倒序排列的各函数的代码执行记录中的各函数信息进行去重处理;若去重后的函数信息满足预设数量要求,则将满足预设数量要求的各函数信息发送至后台服务器。
65.本技术实施例中,对于应用所在框架对应的构造函数中属性为实例方法的各函数,通过proxy函数为之创建代理对象,各函数目前已经拥有了记录和代理拦截的能力,因此当应用运行时,响应于用户对应用作出的各个动作,记录池中将不断记录到元记录信息。在javascript中,函数是按照自上而下的顺序进行执行,在一次函数执行的过程中,最后一个函数执行的堆栈信息中会包含有整个调用链路的信息,如此容易发生调用链路上位于上层的函数又有可能被记录一次的情况,显然该过程中会产生大量的冗余数据,造成统计的偏差,不利于准确检测代码覆盖率。因此,本技术实施例中为了清理冗余数据,可先进行过滤操作,然后将经过过滤操作得到的函数信息发送至后台服务器,以供后台服务器进行代码覆盖率的检测。其中,过滤操作的具体方法可以如下:
66.先将记录池中的元记录信息按时间戳倒序进行排列,再依次遍历堆栈信息,时间越靠后的越先执行。遍历过程中,先将当前项的堆栈信息中的函数名临时记录,再匹配堆栈信息中是否有与临时记录同名的记录,当函数名完全一致时就把当前项剔除。
67.例如,设用户对应用触发的一个动作涉及到函数s,其中,设函数s的属性为实例方法,则表示函数s满足了由proxy函数创建代理对象的条件,因此在用户发出的动作对应到函数s时,则实际上是在执行所创建的代理对象中的apply的实例方法,其中第一步即为对函数s的拷贝函数的正确执行。其中,设函数s又包括有函数a、函数b和函数c共3个子函数,且设该3个子函数的链路调用关系为:函数a调用了函数b,函数b又调用了函数c。则,在执行函数a时候对应的堆栈信息仅包括函数a,在执行函数b时候对应的堆栈信息包括有函数b和函数a,在执行函数c时候对应的堆栈信息包括有函数c、函数b和函数a;那么,在对函数a、函数b和函数c分别对应的堆栈信息依次进行解析而获得的元记录信息对应的时间戳指示的时间依次变大,比如,函数a、函数b和函数c分别对应的时间戳指示的时间依次为10:01分、10:02分和10:03分,则在执行过滤操作时,可先对函数c对应的堆栈信息进行处理,再对函数b对应的堆栈信息处理,最后对函数a对应的堆栈信息进行处理,具体步骤为:将函数c对应的堆栈信息中包括的函数名依次记录在临时记录(比如设当前的临时记录为空)中,即经过该步骤,临时记录中存储有函数c、函数b和函数a;接着,针对于函数b对应的堆栈信息包
括的函数b,通过将其与临时记录中的各记录进行比较,由于临时记录中已经存在有函数b,则表示无需将函数b对应的堆栈信息中包括的函数b添加到临时记录中;同理,继续对函数b对应的堆栈信息包括的函数a按照相同的处理逻辑进行处理,并确定依然无需将函数b对应的堆栈信息中包括的函数a添加到临时记录中;同理,对函数a对应的堆栈信息包括的函数a按照相同的处理逻辑进行处理,并确定依然无需将函数a对应的堆栈信息中包括的函数a添加到临时记录中,因此,该场景下,临时记录中记载的函数包括函数a、函数b和函数c这3个函数,而避免出现将同一函数重复记载的问题。
68.经过过滤操作后,将当前记录池的条目数,与配置项中的最大条目数做比对,在记录池中的函数条目数超过最大条目数时,则将记录池的记录批量地以接口形式提交至后台服务器,如此可避免短时间内大量目标代码的记录操作、频繁的网络请求对应用的性能造成影响。
69.基于同样的构思,本技术实施例提供一种获取应用的代码执行记录的装置,如图3所示,为本技术实施例提供的一种获取应用的代码执行记录的装置的示意图,该装置包括代理对象设置单元301、函数获取单元302、函数处理单元303和上报单元304;
70.代理对象设置单元301,用于针对应用中满足设定要求的函数,设置所述函数的代理对象;
71.函数获取单元302,用于在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的拷贝函数;
72.函数处理单元303,用于运行所述拷贝函数,并基于所述代理对象获取所述拷贝函数运行时的代码执行记录;
73.上报单元304,用于将各函数的代码执行记录进行上报。
74.进一步的,对于该装置,代理对象设置单元301,具体用于:在所述应用的主入口文件中引入配置代码;基于所述配置代码中的工厂函数,对所述应用的构造类中满足设定要求的函数创建代理对象。
75.进一步的,对于该装置,函数获取单元302,具体用于:在调用所述应用中的所述函数时,通过所述代理对象获取所述函数的函数上下文和函数入参数组;将所述函数上下文和所述函数入参数组作为所述函数的绑定函数的入参,得到所述函数的拷贝函数。
76.进一步的,对于该装置,函数处理单元303,具体用于:基于所述代理对象,创建全局化的异常对象;通过所述异常对象,获取所述拷贝函数运行过程对应的堆栈信息;所述堆栈信息包括函数的调用链路;基于所述堆栈信息,得到所述拷贝函数的代码执行记录;在得到所述代码执行记录之后,删除所述异常对象。
77.进一步的,对于该装置,函数处理单元303,还用于:对所述堆栈信息进行解析,得到所述拷贝函数在堆栈信息解析时间下的元纪录信息;所述元记录信息包括按执行顺序倒序排列的各函数信息。
78.进一步的,对于该装置,上报单元304,具体用于:将各函数的代码执行记录按照各函数的堆栈信息解析时间倒序排列;针对倒序排列的各函数的代码执行记录中的各函数信息进行去重处理;若去重后的函数信息满足预设数量要求,则将满足预设数量要求的各函数信息发送至后台服务器。
79.进一步的,对于该装置,函数处理单元303,具体用于:通过try cache语法对所述
拷贝函数进行包裹;通过临时变量对cache语句中传入的异常信息进行存储;在所述拷贝函数运行结束后,上报所述临时变量中存储的异常信息。
80.本技术实施例还提供了一种计算设备,该计算设备具体可以为桌面计算机、便携式计算机、智能手机、平板电脑、个人数字助理(personal digital assistant,pda)等。该计算设备可以包括中央处理器(center processing unit,cpu)、存储器、输入/输出设备等,输入设备可以包括键盘、鼠标、触摸屏等,输出设备可以包括显示设备,如液晶显示器(liquid crystal display,lcd)、阴极射线管(cathode ray tube,crt)等。
81.存储器,可以包括只读存储器(rom)和随机存取存储器(ram),并向处理器提供存储器中存储的程序指令和数据。在本技术实施例中,存储器可以用于存储获取应用的代码执行记录的方法的程序指令;
82.处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行获取应用的代码执行记录的方法。
83.如图4所示,为本技术实施例提供的一种计算设备的示意图,该计算设备包括:
84.处理器401、存储器402、收发器403、总线接口404;其中,处理器401、存储器402与收发器403之间通过总线405连接;
85.所述处理器401,用于读取所述存储器402中的程序,执行上述获取应用的代码执行记录的方法;
86.处理器401可以是中央处理器(central processing unit,简称cpu),网络处理器(network processor,简称np)或者cpu和np的组合。还可以是硬件芯片。上述硬件芯片可以是专用集成电路(application-specific integrated circuit,简称asic),可编程逻辑器件(programmable logic device,简称pld)或其组合。上述pld可以是复杂可编程逻辑器件(complex programmable logic device,简称cpld),现场可编程逻辑门阵列(field-programmable gate array,简称fpga),通用阵列逻辑(generic array logic,简称gal)或其任意组合。
87.所述存储器402,用于存储一个或多个可执行程序,可以存储所述处理器401在执行操作时所使用的数据。
88.具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器402可以包括易失性存储器(volatile memory),例如随机存取存储器(random-access memory,简称ram);存储器402也可以包括非易失性存储器(non-volatile memory),例如快闪存储器(flash memory),硬盘(hard disk drive,简称hdd)或固态硬盘(solid-state drive,简称ssd);存储器402还可以包括上述种类的存储器的组合。
89.存储器402存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:
90.操作指令:包括各种操作指令,用于实现各种操作。
91.操作系统:包括各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
92.总线405可以是外设部件互连标准(peripheral component interconnect,简称pci)总线或扩展工业标准结构(extended industry standard architecture,简称eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
93.总线接口404可以为有线通信接入口,无线总线接口或其组合,其中,有线总线接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线总线接口可以为wlan接口。
94.本技术实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行获取应用的代码执行记录的方法。
95.本领域内的技术人员应明白,本技术的实施例可提供为方法、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
96.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
97.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
98.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
99.尽管已描述了本技术的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本技术范围的所有变更和修改。
100.显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的精神和范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献