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

处理代码的方法、处理异常的方法以及各自的装置与流程

2022-05-27 01:46:54 来源:中国专利 TAG:
1.本说明书实施例涉及计算机
技术领域
:,特别涉及处理代码的方法、处理异常的方法。本说明书一个或者多个实施例同时涉及处理代码的装置,处理异常的装置、计算设备,以及计算机可读存储介质。
背景技术
::2.随着计算机技术的发展,软件产品提供的功能越来越丰富。软件产品例如sdk(软件开发工具包)可以接入供应商的应用程序,为其补充一些软件能力。由于软件产品会接入不同供应商的应用程序,而每个供应商库的稳定性不一,包括软件产品自身也可能因为测试例覆盖度、供应商的应用程序的场景适配等问题,而引发各种各样的异常。这些异常可能导致应用程序crash(崩溃),给供应商的应用程序带来较差的用户体验。3.因此,如何增强稳定性,成了软件产品的一个非常核心的考量要素。技术实现要素:4.有鉴于此,本说明书实施例提供了处理代码的方法、处理异常的方法。本说明书一个或者多个实施例同时涉及处理代码的装置、处理异常的装置、计算设备以及计算机可读存储介质,以解决现有技术中存在的技术缺陷。5.根据本说明书实施例的第一方面,提供了一种处理代码的方法,包括:读取程序源代码经编译后生成的字节码文件;定位所述字节码文件包含的目标方法中需要捕获异常的代码区域;基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理。6.可选地,所述定位所述字节码文件包含的目标方法中需要捕获异常的代码区域,包括:基于asm框架提供的methodvisitor接口遍历所述字节码文件中的目标方法;所述基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,包括:基于methodvisitor接口,每遍历到一个目标方法,在该目标方法的原有代码的开始位置添加受监测块的开始标签,在该目标方法的原有代码的结尾位置添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块。7.可选地,所述在目标方法的原有代码的开始位置添加受监测块的开始标签,包括:利用methodvisitor接口的onmethodenter,或者,利用methodvisitor接口的visitlabel的第一次进入,在该目标方法的原有代码的开始位置添加受监测块的开始标签。8.可选地,所述在目标方法的原有代码的结尾位置添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,包括:利用methodvisitor接口的onmethodexit,在目标方法的原有代码的结尾位置添加受监测块的结束标签,并通过解释器得到该目标方法的返回值,通过调用所述返回值的类型对应的添加代码块程序,在受监测块的结束标签之后添加对应的异常处理块。9.根据本说明书实施例的第二方面,提供了一种处理代码的装置,包括:读取模块,被配置为读取程序源代码经编译后生成的字节码文件。定位模块,被配置为定位所述字节码文件包含的目标方法中需要捕获异常的代码区域。代码添加模块,被配置为基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理。10.根据本说明书实施例的第三方面,提供了一种处理异常的方法,包括:当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置;基于所述软件产品中的异常处理块对所述异常进行处理。11.可选地,还包括:通过捕获全局异常的方式捕获跨线程的异常,得到异常信息;判断所述异常信息是否来源于子线程;如果是,确定引发所述异常信息的方法;判断所述方法是否为所述软件产品内的方法;如果是,对所述异常信息对应的异常进行处理。12.可选地,所述基于所述软件产品中的异常处理块对所述异常进行处理,包括:基于所述软件产品中的异常处理块,阻止所述受监测块捕获的异常向程序运行其上的系统传递。13.可选地,所述基于所述软件产品中的异常处理块对所述异常进行处理,还包括:基于所述软件产品中的异常处理块,将受监测块捕获的异常上报给异常处理平台。14.根据本说明书实施例的第四方面,提供了一种处理异常的装置,包括:捕获模块,被配置为当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置。处理模块,被配置为基于所述软件产品中的异常处理块对所述异常进行处理。15.根据本说明书实施例的第五方面,提供了一种计算设备,包括:存储器和处理器;所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:读取程序源代码经编译后生成的字节码文件,定位所述字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理;或者,当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置;基于所述软件产品中的异常处理块对所述异常进行处理。16.根据本说明书实施例的第六方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现本说明书任意实施例所述处理代码的方法的步骤,或者,实现本说明书任意实施例所述处理异常的方法的步骤。17.本说明书一个实施例提供了处理代码的方法,由于该方法读取程序源代码经编译后生成的字节码文件,定位字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式自动对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,因此,基于该处理后的字节码文件生成软件产品,能够有效提高代码处理效率,避免在开发阶段由程序员人工添加异常捕获块而降低效率且代码无法阅读。而且,由于添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理,因此,本说明书实施例提供的处理代码的方法能够为软件产品中需要监测的代码区域添加异常捕获模块,从而软件产品运行时能够及时在软件产品内部对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。18.本说明书另一个实施例提供了处理异常的方法,由于该方法中的软件产品是基于字节码文件生成的,而所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置,也即,软件产品是经自动动态插入异常捕获块后得到的字节码文件所生成的软件产品,因此,当软件产品接入应用程序并运行时,能够基于所述软件产品中的受监测块捕获异常,基于所述软件产品中的异常处理块对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。附图说明19.图1是本说明书一个实施例提供的一种处理代码的方法的流程图;20.图2是本说明书一个实施例提供的gradle的transform机制的示意图;21.图3是本说明书一个实施例提供的代码示意图;22.图4是本说明书一个实施例提供的onmethodenter的代码示意图;23.图5是本说明书一个实施例提供的exceptiontable示意图;24.图6是本说明书另一个实施例提供的exceptiontable示意图;25.图7是本说明书一个实施例提供的visitlable代码示意图;26.图8是本说明书一个实施例提供的onmethodexit代码示意图;27.图9是本说明书另一个实施例提供的onmethodexit代码示意图;28.图10是本说明书一个实施例提供的一种处理代码的装置的结构示意图;29.图11是本说明书一个实施例提供的一种处理异常的方法的流程图;30.图12是本说明书另一个实施例提供的一种处理异常的方法的流程图;31.图13是本说明书一个实施例提供的一种处理异常的装置的结构示意图;32.图14是本说明书另一个实施例提供的一种处理异常的装置的结构示意图;33.图15是本说明书一个实施例提供的一种计算设备的结构框图。具体实施方式34.在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。35.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。36.应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。37.首先,对本说明书一个或多个实施例涉及的名词术语进行解释。38.崩溃(crash),是指运行在系统上的应用程序发生异常而导致的闪退,发生异常的进程被杀死重启。39.移动端,例如android系统和ios系统两个移动端生态领域。40.为了使本说明书实施例提供的方法更加易于理解,首先对捕获异常以及异常处理的一些实施方式的情况进行分析说明:为了增强软件产品的稳定性,首先要捕获异常。一种方案是通过对线程的未处理异常进行自定义捕获,另一种是对目标方法进行异常捕获块的添加(例如,异常捕获块,基于java的trycatch块)。第一种方案,几乎可以捕获所有的java虚拟机异常,但是如果异常发生在主线程,是不能对异常进行保护处理来阻塞异常的,否则会引起系统报警,因此,第一种方案可能会造成供应商应用程序的一些逻辑无法执行。第二种方案,异常捕获块可以相对比较精确的将异常控制在软件产品内部,且不会引发主线程的报警问题。但是,在开发阶段,由研发人员人工将每个目标方法都使用异常捕获块包起来,显然不可行,代码将变得无法阅读而且导致开发效率低下。基于此,本说明书实施例提供的处理代码的方法,可以利用基于字节码的操作方式例如asm框架(通用的java字节码操作和分析框架)在编译期自动为目标方法中需要捕获异常的代码区域添加异常捕获块。本说明书实施例提供的处理异常的方法,可以基于添加了异常捕获块的软件产品处理异常。41.下面,对本说明书中提供的处理代码的方法、处理异常的方法、处理代码的装置、处理异常的装置,计算设备以及计算机可读存储介质,在下面的实施例中逐一进行详细说明。42.图1示出了根据本说明书一个实施例提供的一种处理代码的方法的流程图,包括步骤102至步骤106。43.步骤102:读取程序源代码经编译后生成的字节码文件。44.例如,所述程序源代码可以是基于jvm语言的程序源代码。45.步骤104:定位所述字节码文件包含的目标方法中需要捕获异常的代码区域。46.例如,可以将一个或多个目标方法中部分或全部的代码作为需要捕获异常的代码区域,具体可以根据实施场景需要进行设置。例如,一个或多个实施例中,可以将字节码文件包含的每个方法的全部代码作为需要捕获异常的代码区域。47.步骤106:基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理。48.例如,可以进一步基于添加异常捕获块处理后的字节码文件,生成软件产品。49.由于该方法读取程序源代码经编译后生成的字节码文件,定位字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式自动批量对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,因此,基于该处理后的字节码文件生成软件产品,能够有效提高代码处理效率,避免在开发阶段由程序员人工添加异常捕获块而降低效率且代码无法阅读。而且,由于添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理,因此,本说明书实施例提供的处理代码的方法能够为软件产品中需要监测的代码区域添加异常捕获模块,从而软件产品运行时能够及时在软件产品内部对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。50.其中,异常处理块的异常处理逻辑的具体实施方式并不进行限制,只要能够对异常进行保护处理避免应用程序崩溃即可。例如,本说明书一个或多个实施例中,所述异常处理逻辑,可以包括:阻止所述受监测块捕获的异常向程序运行其上的系统传递。在该实施例中,通过阻止异常返回给系统,将异常阻塞在软件产品的范围之内,有效避免系统获知异常杀死进程导致应用程序崩溃。在阻塞异常返回系统之后,为了进一步对异常的原因进行精确分析处理,所述异常处理逻辑还可以包括:将捕获的异常上报给异常处理平台,以便异常处理平台通过多种方式进一步分析处理该异常。例如,该异常处理平台可以是软件产品的服务提供方。51.需要说明的是,本说明书实施例提供的处理代码的方法对于用于动态修改字节码的字节码操作方式的具体实施方式并不进行限制。例如,asm框架是通用的java字节码操作和分析框架,基于asm框架提供的各种接口和方法的操作方式能够根据本说明书实施例提供的处理代码的方法动态修改字节码。52.为了能够全面处理软件产品中发生的异常,本说明书一个或多个实施例中,将每个方法的全部代码区域作为需要捕获异常的代码区域。因此,所述定位所述字节码文件包含的方法中需要捕获异常的代码区域,可以包括:基于asm提供的methodvisitor接口遍历所述字节码文件中的方法。所述基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,包括:基于methodvisitor接口,每遍历到一个目标方法,在该目标方法的原有代码的开始位置添加受监测块的开始标签,在该目标方法的原有代码的结尾位置添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块。53.methodvisitor,是asm提供的核心接口。methodvisitor可以用来遍历方法的各个组成部分(如签名、注解、参数、异常等等)。异常捕获块trycatchblock的添加可以在遍历过程中插入。54.更具体地,例如,可以结合gradle的transform机制实施本说明书实施例提供的处理代码的方法。如图2所示的gradle的transform机制的示意图,对编译后对字节码文件进行动态处理。例如,“app源代码文件”经过“java编译器”得到一个或多个“class文件”。一个或多个“class文件”如“a.class、b.class…z.class”进入“transformnode1”以便进行字节码修改,即添加trycatch块。“transformnode1”的底层是asm框架。asm框架提供的methodvisitor接口有两个用法,一个用法是通过classreader使用,一个用法是通过classwriter使用。首先通过classreader遍历方法,定位需要添加异常捕获块对应指令的位置,进而通过classwriter添加异常捕获块对应的指令,得到处理后的字节码文件如“a.class、b.class…z.class”。处理后的字节码文件可以进入其他transformnode以进行后续诸如混淆代码等其他流程,再经过dex化、打包压缩、最终得到软件产品apk文件。55.下面,结合asm框架的核心methodvisitor接口的具体使用进行详细说明。56.例如,如图3所示的代码示意图,假设在methoda这个目标方法的开头和结尾加trycatch,那么添加后的代码结构大致如图3所示:在methoda这个目标方法的开始处增加了一个tryblock(受监测块)的开始标签“try{”,在methoda这个目标方法的结尾位置增加了一个tryblock的结束标签“}”以及catchblock(异常处理块)“catch(exceptione){...}”。其中,exceptionhandler.processexception(e)对应所述异常处理逻辑。catch块中调用exceptionhandler.processexception(e),用来对捕获到的异常做统一处理。57.需要说明的是,methodvisitor接口提供了多种多样的方法可以用来修改字节码。下面,对利用methodvisitor接口添加受监测块的开始标签的实施方式进行说明:58.例如,visitcode和visitend。visitcode和visitend是指令访问方法,可以用来访问目标方法的入口和出口。通过visitcode和visitend可以用来添加异常捕获块。59.再例如,由于adviceadapter,简化了methodvisitor的使用复杂度,作为一个专业的method改造器,提供了onmethodenter方法,会在进入目标方法时被调用,代表目标方法的入口,使用更加便捷。因此,可以利用onmethodenter在目标方法的原有代码的开始位置添加受监测块的开始标签。具体地,如图4所示的使用onmethodenter的代码示意图,在目标方法的入口处增加了受监测块tryblock的开始标签,tryblock的开始就是目标方法的入口处。60.又例如,可以通过重写visitlable方法的方式,利用methodvisitor接口的visitlabel的第一次进入,在该目标方法的原有代码的开始位置添加受监测块的开始标签。该实施例主要用于解决exceptiontable错序的问题。61.exceptiontable错序发生的原因是:在class文件里面,每个方法的结尾处都有一个exceptiontable,这个是作为属性被对待的。asm在处理异常的时候会有一个visittrycatchblock()回调,对应代码里的每一个trycatch块,包括后添加的trycatch块也会通过visittrycatchblock回调回来。用javap-c查看一个未额外添加trycatchblock的class文件的反汇编代码,可以看到,在方法的结尾处有一个如图5所示的exceptiontable。若直接在onmethodenter里面加入一个trycatchblock,不做任何特殊处理,通过ide反编译class文件看到的代码一切正常,但是执行起来就会有问题,因为所有方法内部的异常并没有被目标方法原有代码的trycatchblock给捕获处理,而是都被onmethodenter新添加的trycatchblock给处理了。这是因为,通过onmethodenter修改字节码文件,是在代码开始的地方就加入了一个包含全部方法体的受监测块。直接在onmethodenter里面加trycatchblock反汇编看到的代码如图6所示,exceptiontable的第一个异常就是新添加的trycatchblock捕获的异常,即从代码的0行到代码的15行,也即从tryblock开始到结尾包含了所有原有代码。若catch是一个throwable的异常,所有继承自throwable的excetion、error都会被他处理了。这就是exceptiontable错序问题。62.要解决exceptiontable错序问题,根据visittrycatchblock先于visitlabel被访问的机制,可以在第一次visitlabel的时候为目标方法添加自定义的异常捕获块trycatchblock。这样,能够保证目标方法代码里原有的trycatchblock已经都被处理完毕之后,才添加自定义的异常捕获块,保证自定义的异常捕获块trycatchblock被添加到exceptiontable的最后。所以在该实施例中,可以如图7所示的visitlable代码示意图,通过重写visitlable方法,利用methodvisitor接口的visitlabel的第一次进入,在该目标方法的原有代码的开始位置添加受监测块的开始标签。图7所示代码示意图中的label,用来标记代码位置,比如trycatch的起始点,跳转的目标位置等等。63.接下来,对利用methodvisitor接口添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块的实施方式进行说明:64.例如,adviceadapter的另一个生命周期函数——onmethodexit,代表目标方法结束。如图8所示的onmethodexit代码示意图,利用onmethodexit,可以在原有方法的代码处理完后,添加受监测块的结束标签即tryend的结束标签“}”,保证整个目标方法的原有代码被新增的“try{”、“}”包住。然后,接着增加异常处理块catchblock的代码。65.需要说明的是,图8所示代码示意图只考虑到了返回值为void类型的情况。实际上,目标方法的返回值可能是多种数据类型中的某一种,例如primitivetype、非primitivetype的类、整型、long型、字符串型等等。因此,考虑到这种情况,如图9所示的onmethodexit代码示意图,可以在onmethodexit中,对返回类型做个判断,然后分类处理。目标方法的返回类型,可以在methodvisitor构造时,通过解释器“descriptor”拿到。例如,如果解释器得到的是整形,则调用整形对应的添加代码块程序,是void类型,则调用void类型对应的添加代码块程序,是long类型,则调用long类型对应的添加代码块程序。各个返回类型对应的添加代码块程序的处理逻辑是相同的,都是添加对应的异常处理块。66.另外,如图9所示的代码示意图可知,本说明书实施例提供的处理代码的方法,还对“athrow”的事件进行了判断。这是因为:目标方法内部本身有抛出异常的情况。具体来说,在asm里,目标方法抛出一个异常会被当作目标方法的终结,其触发的事件opcode为“athrow”。由于onmethodexit代表的是方法终结,因此当遇到抛出一个异常时候,会触发onmethodexit。对于这类异常,根据实施场景需要,可以通过直接返回的方式吃掉这个异常,当然,也可以选择继续上抛。如果需要吃掉异常,可以在onmethodexit代码里对opcode做过滤,如果是athrow,返回即可,不做任何处理。67.与上述处理代码的方法实施例相对应,本说明书还提供了处理代码的装置实施例,图10示出了本说明书一个实施例提供的一种处理代码的装置的结构示意图。如图10所示,该装置包括:读取模块1002、定位模块1004及代码添加模块1006。68.该读取模块1002,可以被配置为读取程序源代码经编译后生成的字节码文件。69.该定位模块1004,可以被配置为定位所述字节码文件包含的目标方法中需要捕获异常的代码区域。70.该代码添加模块1006,可以被配置为基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理。71.由于该装置读取程序源代码经编译后生成的字节码文件,定位字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式自动对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,因此,基于该处理后的字节码文件生成软件产品,能够有效提高代码处理效率,避免在开发阶段由程序员人工添加异常捕获块而降低效率且代码无法阅读。而且,由于添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理,因此,本说明书实施例提供的处理代码的装置能够为软件产品中需要监测的代码区域添加异常捕获模块,从而软件产品运行时能够及时在软件产品内部对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。72.其中,所述定位模块1004,可以被配置为基于asm提供的methodvisitor接口遍历所述字节码文件中的目标方法。所述代码添加模块1006,可以被配置为基于methodvisitor接口,每遍历到一个目标方法,在该目标方法的原有代码的开始位置添加受监测块的开始标签,在该目标方法的原有代码的结尾位置添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块。73.例如,所述代码添加模块1006,可以被配置为利用methodvisitor接口的onmethodenter,或者,利用methodvisitor接口的visitlabel的第一次进入,在该目标方法的原有代码的开始位置添加受监测块的开始标签。74.再例如,所述代码添加模块1006,可以被配置为利用methodvisitor接口的onmethodexit,在目标方法的原有代码的结尾位置添加受监测块的结束标签,并通过解释器得到该目标方法的返回值,通过调用所述返回值的类型对应的添加代码块程序,在受监测块的结束标签之后添加对应的异常处理块。75.上述为本实施例的一种处理代码的装置的示意性方案。需要说明的是,该处理代码的装置的技术方案与上述的处理代码的方法的技术方案属于同一构思,处理代码的装置的技术方案未详细描述的细节内容,均可以参见上述处理代码的方法的技术方案的描述。76.下述结合附图11,对本说明书中提供的处理异常的方法进行说明。图11示出了根据本说明书一个实施例提供的一种处理异常的方法的流程图,包括步骤1102至步骤1104。77.步骤1102:当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置。78.步骤1104:基于所述软件产品中的异常处理块对所述异常进行处理。79.由于该方法中的软件产品是基于字节码文件生成的,而所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置,也即,软件产品是经自动动态插入异常捕获块后得到的字节码文件所生成的软件产品,因此,当软件产品接入应用程序并运行时,能够基于所述软件产品中的受监测块捕获异常,基于所述软件产品中的异常处理块对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。80.根据所述处理异常的方法,可以对软件产品进行方法级的保护,但是方法级的保护无法处理跨线程的异常,因此,本说明书实施例提供的方法还可以对无法基于异常捕获块trycatchblock处理异常的线程进行线程异常捕获,进而进行堆栈分析,处理异常。具体地,图12示出了根据该实施例提供的一种处理异常的方法的流程图,包括步骤1202至步骤1214。81.步骤1202:当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常。82.步骤1204:基于所述软件产品中的异常处理块对所述异常进行处理。83.步骤1206:通过捕获全局异常的方式捕获跨线程的异常,得到异常信息。84.步骤1208:判断所述异常信息是否来源于子线程。85.步骤1210:如果是,确定引发异常信息的方法。86.步骤1212,判断所述方法是否为所述软件产品内的方法。87.步骤1214:如果是,对所述异常信息对应的异常进行处理。88.例如,所述异常处理逻辑,可以是阻止所述受监测块捕获的异常向程序运行其上的系统传递,更进一步地,还可以将受监测块捕获的异常上报给异常处理平台。89.可见,根据图12所示的实施例,本说明书实施例提供的处理异常的方法,还可以包括:通过捕获全局异常的方式捕获跨线程的异常,得到异常信息;判断所述异常信息是否来源于子线程;如果是,确定引发所述异常信息的方法;判断所述方法是否为所述软件产品内的方法;如果是,对所述异常信息对应的异常进行处理。通过该实施例,对异常捕获块不能处理的异常,进行了有效地补充,进一步增强了软件产品的稳定性。90.具体地,例如,可以通过注册线程的uncaughtexceptionhandler进行异常捕获。捕获得到的信息存储在堆栈中。通过对堆栈信息进行关键字如“backtracestarts”和“backtraceends”的截取,可以得到引发异常的核心堆栈信息。按照关键字如“at”进行分割,可以确定引发异常的堆栈各层级方法。按照预先设置的包名(例如,可以是软件产品的所有包名列表),对上一步确定的引发异常的方法进行查找,一旦找到对应包含关系的包名,则可以确定异常发生在软件产品内部,满足保护的关系。对于需要保护的异常,阻止向应用程序运行其上的终端系统的传递,上报到异常处理平台。91.结合上述多个实施例,本说明书实施例提供的处理异常的方法中,软件产品可以是具有号码认证功能的sdk,接入sdk的应用程序可以运行于移动端。根据本说明书实施例提供的处理异常的方法,可以利用java的trycatch机制对软件产品的代码内的异常进行阻塞和上报平台处理。而且,在使用asm对sdk进行方法级保护的情况下,还进一步对线程进行未捕获异常的自定义处理,如果是主线程的异常,不做处理,如果是子线程的异常,分析堆栈是发生在sdk内部的,则阻止异常返回至sdk接入的供应商程序运行其上的移动端系统,从而,避免移动端系统收到异常杀死线程而导致应用程序崩溃,有效增强了sdk的稳定性,提高用户体验。92.与上述处理异常的方法实施例相对应,本说明书还提供了处理异常的装置实施例,图13示出了本说明书一个实施例提供的一种处理异常的装置的结构示意图。如图13所示,该装置包括:捕获模块1302以及处理模块1304。93.该捕获模块1302,可以被配置为当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置。94.该处理模块1304,可以被配置为基于所述软件产品中的异常处理块对所述异常进行处理。95.由于该装置中的软件产品是基于字节码文件生成的,而所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置,也即,软件产品是经自动动态插入异常捕获块后得到的字节码文件所生成的软件产品,因此,当软件产品接入应用程序并运行时,能够基于所述软件产品中的受监测块捕获异常,基于所述软件产品中的异常处理块对异常进行保护处理,避免系统杀死异常的线程导致应用程序崩溃,有效增强软件产品的稳定性。96.图14示出了本说明书另一个实施例提供的一种处理异常的装置的结构示意图。如图14所示,该处理异常的装置还可以包括:跨线程异常捕获模块1306,可以被配置为通过捕获全局异常的方式捕获跨线程的异常,得到异常信息。线程判断模块1308,可以被配置为判断所述异常信息是否来源于子线程。方法确定模块1310,可以被配置为如果所述线程判断模块1308判定为是,确定引发所述异常信息的方法。范围判断模块1312,可以被配置为判断所述方法是否为所述软件产品内的方法。线程异常处理模块1314,可以被配置为如果所述范围判断模块1312判定为是,对所述异常信息对应的异常进行处理。97.其中,所述线程异常处理模块1314,可以被配置为基于所述软件产品中的异常处理块,阻止所述受监测块捕获的异常向程序运行其上的系统传递,或者,更进一步地,将受监测块捕获的异常上报给异常处理平台。98.上述为本实施例的一种处理异常的装置的示意性方案。需要说明的是,该处理异常的装置的技术方案与上述的处理异常的方法的技术方案属于同一构思,处理异常的装置的技术方案未详细描述的细节内容,均可以参见上述处理异常的方法的技术方案的描述。99.图15示出了根据本说明书一个实施例提供的一种计算设备1500的结构框图。该计算设备1500的部件包括但不限于存储器1510和处理器1520。处理器1520与存储器1510通过总线1530相连接,数据库1550用于保存数据。100.计算设备1500还包括接入设备1540,接入设备1540使得计算设备1500能够经由一个或多个网络1560通信。这些网络的示例包括公用交换电话网(pstn)、局域网(lan)、广域网(wan)、个域网(pan)或诸如因特网的通信网络的组合。接入设备1540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic))中的一个或多个,诸如ieee802.11无线局域网(wlan)无线接口、全球微波互联接入(wi-max)接口、以太网接口、通用串行总线(usb)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc)接口,等等。101.在本说明书的一个实施例中,计算设备1500的上述部件以及图15中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图15所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。102.计算设备1500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备1500还可以是移动式或静止式的服务器。103.其中,处理器1520用于执行如下计算机可执行指令:104.读取程序源代码经编译后生成的字节码文件,定位所述字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理;105.或者,106.当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置;基于所述软件产品中的异常处理块对所述异常进行处理。107.上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的处理代码的方法、处理异常的方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述处理代码的方法、处理异常的方法的技术方案的描述。108.本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于:109.读取程序源代码经编译后生成的字节码文件,定位所述字节码文件包含的目标方法中需要捕获异常的代码区域,基于字节码操作方式对所述代码区域进行添加异常捕获块的处理,得到处理后的字节码文件,其中,所述添加异常捕获块的处理包括:在所述代码区域的开始添加受监测块的开始标签、在所述代码区域的结尾添加受监测块的结束标签以及为所述受监测块添加对应的异常处理块,其中,所述异常处理块,用于对所述受监测块捕获的异常进行处理;110.或者,111.当软件产品接入应用程序并运行时,基于所述软件产品中的受监测块捕获异常,其中,所述软件产品是基于字节码文件生成的,所述字节码文件是程序源代码经编译后、基于字节码操作方式添加异常捕获块得到的字节码文件,所述异常捕获块包括受监测块和异常处理块,所述受监测块的开始标签位于目标方法中需要捕获异常的代码区域的开始位置,所述受监测块的结束标签以及所述异常处理块位于所述代码区域的结尾位置;基于所述软件产品中的异常处理块对所述异常进行处理。112.上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的处理代码的方法、处理异常的方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述处理代码的方法、处理异常的方法的技术方案的描述。113.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。114.所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。115.需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书实施例并不受所描述的动作顺序的限制,因为依据本说明书实施例,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书实施例所必须的。116.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。117.以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书实施例的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书实施例的原理和实际应用,从而使所属
技术领域
:技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。当前第1页12当前第1页12
再多了解一些

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

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

相关文献