CN112445706A - 程序异常代码获取方法、装置、电子设备以及存储介质 - Google Patents

程序异常代码获取方法、装置、电子设备以及存储介质 Download PDF

Info

Publication number
CN112445706A
CN112445706A CN202011359452.0A CN202011359452A CN112445706A CN 112445706 A CN112445706 A CN 112445706A CN 202011359452 A CN202011359452 A CN 202011359452A CN 112445706 A CN112445706 A CN 112445706A
Authority
CN
China
Prior art keywords
code
program
enhancement
target program
exception
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202011359452.0A
Other languages
English (en)
Inventor
陈晓丹
殷凇
李宗波
邬秋元
杨永帮
张卓韬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
WeBank Co Ltd
Original Assignee
WeBank Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by WeBank Co Ltd filed Critical WeBank Co Ltd
Priority to CN202011359452.0A priority Critical patent/CN112445706A/zh
Publication of CN112445706A publication Critical patent/CN112445706A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请实施例提供一种程序异常代码获取方法、装置、电子设备以及存储介质,获取用于加载目标程序和增强程序的触发指令,根据触发指令将目标程序和增强程序加载至内存,运行增强程序,以将增强代码增加至目标程序生成增强后的目标程序,其中,增强代码用于输出目标程序的异常代码,运行增强后的目标程序,以在目标程序异常时输出异常代码。相较于现有技术由人工确定异常代码的方式,本方案可以自动输出异常代码,通过增强程序在目标程序内增加增强代码,且无需人工修改目标代码。

Description

程序异常代码获取方法、装置、电子设备以及存储介质
技术领域
本申请实施例涉金融科技(Fintech),尤其涉及一种程序异常代码获取方法、装置、电子设备以及存储介质。
背景技术
随着计算机技术的飞速发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性和实时性要求,也对技术提出了更高的要求。
金融业务程序系统支持金融企业从事各种金融业务。在对金融业务程序系统进行开发测试过程中出现异常时,开发人员需要通过异常堆栈信息到金融业务程序系统对应项目工程的源代码中找到对应的代码行,再通过源码上下文信息来确定异常发生的可能原因。另外,在Java异常堆栈信息中只有程序调用链,没有程序调用参数。
然而,现有技术由开发人员根据异常堆栈信息人工确定出现异常的代码,导致确定异常代码的效率低。又异常堆栈信息中不包含调用参数,导致无法准确确定异常原因。
发明内容
本申请实施例提供一种程序异常代码获取方法、装置、电子设备以及存储介质,旨在输出程序的异常代码和属性数据,无需人工根据异常堆栈信息确定异常代码,提高确定异常代码的效率。
第一方面,本申请提供一种程序异常代码获取方法,包括:
获取用于加载目标程序和增强程序的触发指令;
根据触发指令将目标程序和增强程序加载至内存;
运行增强程序,以将增强代码增加至目标程序生成增强后的目标程序;其中,增强代码用于输出目标程序的异常代码;
运行增强后的目标程序,以在目标程序异常时输出异常代码。
可选地,运行增强程序,具体包括:
执行解析代码,以对目标程序的源代码进行解析获得解析结果;
当解析结果满足预设插入条件时执行增强代码,以生成增强后的目标程序;
其中,增强程序包括解析代码和增强代码。
可选地,当解析结果满足预设插入条件时执行增强代码以生成增强后的目标程序,具体包括:
当解析结果指示解析到方法主体时插入位置代码;其中,位置代码用于获取异常代码的异常位置信息;
插入输出代码;其中,输出代码是根据目标程序的源代码和位置代码生成的,输出代码用于输出异常代码;
增强代码包括位置代码和输出代码。
可选地,当解析结果满足预设插入条件时插入位置代码,具体包括:
当解析结果指示解析到方法主体时插入用于捕获异常的捕获代码和用于调用异常堆栈信息的堆栈代码。
可选地,当解析结果满足预设插入条件时执行增强代码以生成增强后的目标程序,还包括:
当解析结果指示解析到参数定义标识时插入用于获取属性数据的属性代码,其中,增强程序还包括属性代码。
可选地,当解析结果满足预设插入条件时执行增强代码以生成增强后的目标程序,还包括:
当解析结果指示解析到方法结束标识时插入用于获取异常类型的类型代码;
其中,增强程序还包括类型代码,类型代码是根据位置代码生成的。
可选地,当解析结果满足预设插入条件时执行增强代码以生成增强后的目标程序,具体包括:
当解析结果指示解析到方法结束标识时插入用于存储异常代码的存储代码;
其中,增强程序还包括存储代码,存储代码是根据输出代码生成的。
第二方面,本申请提供一种程序异常代码获取装置,包括:
获取模块,用于获取用于加载目标程序和增强程序的触发指令;
处理模块,用于根据触发指令将目标程序和增强程序加载至内存;
处理模块还用于运行增强程序,以将增强代码增加至目标程序生成增强后的目标程序;其中,增强代码用于输出目标程序的异常代码;
处理模块还用于运行增强后的目标程序,以在目标程序异常时输出异常代码。
第三方面,本申请提供一种电子设备,包括:
存储器,用于存储程序;
处理器,用于执行存储器存储的程序,当程序被执行时,处理器用于执行第一方面及可选方案所涉及的程序异常代码获取方法。
第四方面,本申请提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令;其中,计算机执行指令被处理器执行时用于第一方面及可选方案所涉及的程序异常代码获取方法。
第五方面,本申请提供一种计算机程序产品,包括计指令,指令被处理器执行时实现第一方面及可选方案所涉及的程序异常代码获取方法。
本申请实施例提供一种程序异常代码获取方法、装置、电子设备以及存储介质,根据触发指令将目标程序和增强程序加载至内存中,运行增强程序,以将增强代码增加至目标程序获得增强后的目标程序,当运行增强后的目标程序时,能够输出目标程序出现异常时的异常代码。相较于现有技术由程序开发人员根据异常堆栈信息确定异常代码,本方案可以自动输出异常代码,可以提高异常定位效率。不需要对目标程序的源代码进行修改,减少开发人员的开发量。
另外,运行增强程序可在目标程序中插入属性代码,在运行增强后的目标代码时可以输出目标程序的属性数据,程序开发人员无需在重现异常,可以根据属性数据和异常代码确定异常原因,简化查找异常原因的过程。此外,运行增强程序可在目标程序中插入存储代码可实现将异常代码存储至指定区域,以便程序开发人员随时查看异常代码。运行增强程序可在目标程序中插入类型代码,以便程序开发人员确定目标代码出现异常的类型。
附图说明
图1为本申请一实施例提供的程序异常代码获取系统的结构示意图;
图2为本申请另一实施例提供的程序异常代码获取系统的结构示意图;
图3为本申请另一实施例提供的程序异常代码获取方法的流程示意图;
图4为本申请另一实施例提供的Java异常的体系结构示意图;
图5为本申请另一实施例提供的程序异常代码获取装置的结构示意图;
图6为本申请另一实施例提供的电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
程序开发人员在对金融业务系统进行开发测试过程中,若金融业务系统抛出异常,现有技术是由程序开发人员根据异常堆栈信息,到对应项目工程的源代码中找到对应的异常代码行。再通过源码的上下文信息来推敲定位异常发生的可能原因。
然而,现有技术中通过人工方式定位异常代码的方式过程繁琐且效率低下。又Java的异常堆栈只有调用链信息,没有调用参数。对于分析复杂的异常原因,需要程序开发人员复现问题,加剧了问题定位和修复的难度。
下面描述本申请实施例中的术语。
Git:一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本源代码,从一般开发者的角度来看,Git有以下功能:1、从服务器上克隆完整的Git仓库到单机上,包括代码和版本信息;2、在本地机器上根据不同的开发目的创建分支以及修改代码;3、在本地机器上创建的分支的提交代码;4、在本地机器上合并分支。5、把服务器上最新版的代码拷贝下来,然后跟本地机器上的主分支合并;6、生成补丁,把补丁发送给主开发者。
Gitlab:是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
ASM:ASM是一个Java字节码的操控框架。它能被用来动态生成类或者增强既有类的功能。ASM可以直接产生二进制类文件,也可以在类被加加载Java虚拟机之前动态改变类行为。
Jenkins:是一个开源软件项目,基于Java开发的一种持续继承工具,可以从Git仓库中根据源码构建应用。
Java虚拟机(JAVA Virtual Machine,简称JVM),JVM是一种用于计算机设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Javaparser:是一个可以将Java源码解析为一个语法树的工具包。
本申请实施例提供一种程序异常代码获取方法、装置、电子设备以及存储介质,旨在当程序运行出现异常时,可以直接获得程序的异常代码和属性数据。本申请的发明构思是:当确定异常标识的状态指示程序出现异常时,根据属性数据生成程序的调用标识,再根据程序的调用标识和路径获取方法确定程序的异常代码和属性数据,以实现自动输出异常代码和属性数据的目的。
如图1所示,本申请实施例提供的程序异常代码获取系统包括第一设备11、第二设备12以及第三设备13。其中,第一设备11内运行有源代码管理程序,用于管理程序的源代码。第二设备12内运行有目标程序的构建程序,第二设备12用于生成目标程序的Jar包,第二设备12还用于生成目标程序的构建信息以及Agent包。第三设备13内设置有目标程序的Jar包、Agent包以及目标程序的构建信息。
在使用JVM运行目标程序的Jar包、Agent包以及目标程序的构建信息时,先加载Agent包,在加载Agent包时也会加载目标程序的构建信息,再加载目标程序的Jar包。
更具体地,在目标程序的Jar包的类档加载前,使用Agent包对类档进行代码增强,插入自定义逻辑。其中,Agent包的增强内容包括:拦截方法属性数据、增加try-catch语句用于拦截异常、修改异常栈消息内容、访问Git获取源码、将异常代码和属性数据输出到本地存档等。
需要说明的是,如图2所示,本申请实施例提供的程序异常代码获取系统可以仅包括一个电子设备,该电子设备内运行有源代码管理程序、目标程序的构建程序、目标程序的Jar包、Agent包以及目标程序的构建信息。Agent包和目标程序的Jar包的加载过程已经在上述实施例中详细说明,此处不再赘述。
还需要说明的是,本申请实施例提供的程序异常代码获取方法除了可以输出金融业务系统的异常代码和属性数据外,还可以用于对其他应用场景下的程序,此处不做限制。
如图3所示,本申请另一实施例提供一种程序异常代码获取方法,该定位方法的执行主体为个人计算机、服务器、平板计算机等电子设备。当定位系统采用图1所示结构时,该程序异常代码获取方法运行于第三设备13内。该程序异常代码获取方法包括如下步骤:
S101、获取用于加载目标程序和增强程序的触发指令。
其中,本方案用于检测目标程序的异常代码,增强程序用于获得目标程序的异常代码。目标程序是使用JAVA语言编写的程序。
增强程序包括增强代码。增强代码用于输出目标程序的异常代码,增强代码还可以输出目标程序的属性数据。当需要加载目标程序时生成触发指令,该触发指令用于加载目标程序和增强程序。
S102、根据触发指令将目标程序和增强程序加载至内存。
其中,在获得触发指令后,获取目标程序和增强程序的存储路径,从存储路径下将目标程序的和增强程序加载至内存。
S103、运行增强程序,将增强代码增加目标程序生成增强后的目标程序。
其中,增强程序包括增强代码和解析代码。在运行增强程序时,先执行解析代码,以对目标程序的源代码进行解析获得解析结果。其中,解析结果用于表示目标程序中源代码所实现内容。
在解析代码在对源代码进行解析时,实时判断解析结果是否满足预设插入条件,若满足预设插入条件时执行增强代码,以实现在目标程序中插入增强代码获得增强后的目标程序。
S104、运行增强后的目标程序。
其中,增强代码可以用于输出目标程序的异常代码,增强后的目标程序包括增强代码,在运行增强后的目标程序时,可以输出异常代码。
在本申请实施例提供的程序异常代码获取方法中,根据触发指令将目标程序和增强程序加载至内存中,再运行增强程序,将增强代码增加至目标程序获得增强后的目标程序,在运行增强后的目标程序时可以输出目标程序出现异常时的异常代码,且无需对目标程序的源代码进行修改,仅需编写增强程序即可,减少开发人员的工作量。
本申请另一实施例提供的程序异常代码获取方法,该方法包括如下步骤:
S201、获取用于加载目标程序和增强程序的触发指令。
S202、根据触发指令将目标程序和增强程序加载至内存。
其中,步骤S201和步骤S202已经在上述实施例中详细说明,此处不再赘述。
S203、运行增强程序,将增强代码增加目标程序生成增强后的目标程序。
其中,增强程序包括解析代码、位置代码、属性代码、类型代码、输出代码以及存储代码。
在运行增强程序时,先执行解析代码,以对目标程序的源代码进行解析获得解析结果。
当解析结果指示解析至参数定义标识时,也就是指示源代码用于定义输入参数以及方法名称等属性信息时,提取该行源代码中的属性数据,根据所获取的属性数据生成用于获取属性数据的属性代码,并在目标程序的源代码中插入属性代码。
当解析结果指示解析至方法主体时,也就是源代码为方法主体,提取方法主体的源代码,并根据方法主体的源代码生成用于获取异常代码的异常位置信息的异常位置代码,在目标程序的源代码中插入位置代码。在获取位置代码后,根据位置代码生成用于获取异常类型的类型代码,并插入类型代码。
运行增强程序可在目标程序中插入类型代码,以便程序开发人员确定目标代码出现异常的类型。
更具体地,当解析结果指示源代码为方法主体,提取方法主体的源代码,并根据方法主体的源代码和捕获指令生成用捕获异常的捕获代码。在生成捕获代码后,根据捕获代码生成用于调用异常堆栈信息的堆栈调用代码。并分别插入捕获代码和堆栈调用代码。
当解析结果指示解析至方法结束标识时,也就是指示已经解析完成,根据位置代码以及属性代码生成用于输出异常代码的输出代码,并在目标程序的源代码中插入输出代码。在获得输出代码后,根据输出代码生成用于存储异常代码的存储代码,并插入存储代码。
运行增强程序可在目标程序中插入存储代码可实现将异常代码存储至指定区域,以便程序开发人员随时查看异常代码。
S204、运行增强后的目标程序。
其中,运行增强后的目标程序时,属性代码获取程序的属性数据,其中,程序的属性数据是程序的方法名称、程序的类名称、程序的方法属性数据。程序的方法名称是指将程序封装后所提供调用方式中方法名称。
程序的异常标识用于指示程序是否出现异常,也就是程序的异常标识设有两种状态,一种是指示处于异常状态,另一种是指示处于正常状态。
捕获代码异常标识的状态,当异常标识的状态指示程序出现异常时,则继续执行堆栈调用代码、类型代码、输出代码以及存储代码,否则仅执行捕获代码中方法主体。
堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。在捕获代码确定当异常标识的状态指示程序出现异常时,继续执行堆栈调用代码和输出代码。在运行堆栈调用代码时,根据目标程序的属性数据从堆栈信息中确定目标程序的异常代码的位置信息。
输出代码用于根据程序的异常代码的标识和程序的源代码确定程序的异常代码,更具体地,提取程序的源代码的标识和异常代码的标识,将源代码的标识与异常代码的标识进行比较获得比较结果,根据比较结果确定程序的异常代码。
例如:提取程序的源代码中每一行所使用指令名称,异常代码的标识也是指令名称,将源代码中指令名称和异常代码的标识比较获得比较结果。也就是当二者相同时,将源代码中对应行代码作为异常代码。
程序的异常类型包括运行时异常和非运行时异常,在捕获代码捕获异常后,执行类型代码,以确定出现异常类型。
在运行输出代码时,输出目标程序的属性数据,也就是输出目标程序的方法名称、目标程序的类名称、程序的方法、输入参数等属性数据。根据异常类型代码输出代码异常类型,再根据异常代码的位置信息从目标程序的源代码中截取出异常代码。
其中,在确定程序的异常代码和属性数据后,可以为程序的异常代码和属性数据预留存储区域,将程序的异常代码和属性数据存储至指定存储区域。还可以使用程序的异常代码和属性数据更新程序的异常堆栈信息。还可以在获得程序的异常代码和属性数据之后生成提示信息,以提示程序开发人员程序出现异常。
在本申请实施例提供的程序异常代码获取方法中,在本申请实施例提供的程序异常代码获取方法中,根据触发指令将目标程序和增强程序加载至内存中,再运行增强程序,可以将解析代码、位置代码、属性代码、类型代码、输出代码以及存储代码增加至目标程序,获得增强后的目标程序,以使增强后的目标程序能够输出目标程序出现异常时的异常代码和属性数据。不需要对目标程序的源代码进行修改,减少开发人员的开发量。无需人工推断异常代码,提高获得异常代码的效率。另外,本方案可以输出属性数据,便于程序开发人员根据属性数据和异常代码确定异常原因。
下面结合具体工具以及图1或者图2中的定位系统,以及JAVA语言编写的目标程序为例说明本申请另一实施例提供的程序异常代码获取方法。
首先说明本申请所使用的工具语言。
Git工具获取目标程序的源代码,Gitlab提供了接口能够用于获取对应的源代码,具体为:
GET/projects/:ID/repository/files/:file_path
具体使用方式为:
curl request GET header'PRIVATE-TOKEN:<your_access_token>''https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master'
为了从Git中获取到对应档的源码,再解析源码内容得到异常发生点所在方法的代码内容。还需要获得如下构建信息:
该项目对应的仓库ID;
文件对应的路径,也就是file_path字段;
文件对应的分支,也就是ref字段。
在获得上述构建信息,可以从类的全限定名中获得类文件的路径,即file_path字段。对于文件对应的仓库ID和分支信息,可以通过应用构建时提供的Git信息来获取。再将上述信息写入应用,并读取到的某个指定目录下,以辅助信息的获取。
如下为某次构建输出的结果样例:
PROJECT_ID=2671
GIT_COMMIT=ca320009938dadc919eb44d779c14a1a5d61807
GiT_BRANCH=origin/master
VERSION=----
BLJILD_ID=4
下面描述JAVA的抛出异常的过程。
如图4所示,Java中异常都是Throwable的子类,可分为错误Error、运行时异常RuntimeException和非运行时异常Exception。运行时异常代码上不需要进行显示的处理,非运行时异常代码上需要进行显示的处理。又Error是程序无法处理的错误,因而在代码中以抛出Exception异常为主。
下面举例说明运行时异常的示例:
Figure BDA0002803595860000101
非运行时异常的示例如下:
Figure BDA0002803595860000102
Java内置的instanceof语句可以判断异常对象实例属于哪个父类的子类。具体使用如下所示:
If(inst instanceof RuntimeException)
{//运行时异常
}
Else
{//非运行时异常
}
Java程序抛出异常时,可以从Exception对象中获取到异常发生的堆栈。
doSomeThing1方法发生异常时的堆栈信息为:
Exception in thread“main”java.lang.string.Index0ut0fBoundsException:string index out of range:4
at java.lang.string.suhstring(string.java:1963)
at cam.wb.xthrow.Source.dosomeThing1(Source.java:7)
at com.w6.xthrow.source.main(source.java:64)
从上述异常堆栈信息中可以得到如下信息:
异常类别为运行时异常,StringIndexOutOfBoundsExcetion属于运行时异常,是RuntimeException的子类。
异常原因为String index out of range;
异常涉及的类为com.wb.xthrow.Source;
异常涉及到的方法为doSomeThing1;
异常涉及到的文件名为Source.java;
异常涉及到的行号为7。
因而可以遍历异常堆栈信息,找到异常堆栈信息同当前拦截点位置类信息一致的异常信息,从而得到异常发生时的行号,对目标行进行高亮提示。
ASM以visitor模式来遍历目标程序的类文件,当加载到某个指令时,可以通过自定义的visitor来重写该目标程序的字节码,以达到改变该目标程序执行逻辑的目的。
ASM框架提供了几个扩展点,通过重写扩展点的方法即可完成遍历过程中的方法插桩。
常见的扩展点包括:onMethodEnter表示在方法进入时插入,visitMax表示方法结束前插入,onMethodExit表示方法退出时插入。
本申请另一实施例提供一种程序异常代码获取方法包括具体如下步骤:
S301、获取用于加载目标程序和增强程序的触发指令。
S302、根据触发指令将目标程序和增强程序加载至内存。
其中,该步骤已经在上述实施例中详细说明,此处不再赘述。
S203、运行增强程序,将增强代码增加目标程序生成增强后的目标程序。
其中,增强程序包括解析代码、位置代码、属性代码、类型代码、输出代码以及存储代码。
重写ClassVisitor和MethodVisitor,以生成位置代码、属性代码、类型代码、输出代码以及存储代码,进而用于修改目标程序的方法字节码。
下面详细描述重写过程具体为:
1)重写ClassVisitor和MethodVisitor,以生成属性代码。
从ClassVisitor的visit方法参数中获得当前类名,赋值给clazzName变数。从MethodVisitor的visitMethod方法参数中获取目标程序的方法名,赋值给methodName变量。重写onMethodEnter方法,在目标程序的方法中将入参缓存起来,赋值给args变数。
2)重写ClassVisitor和MethodVisitor,以生成位置代码。
在onMethodEnter方法中访问visitTryCatchBlock指令,插入try代码块,重写visitMaxs方法,插入try代码块结束指令,catch代码块开始指令。visitMaxs方法中获取异常对象赋值给变量t,传递参数clazzName、methodName、args、t,通知异常发生,返回调用标识id。visitMaxs方法中根据调用标识id获取故障代码的输出路径。
3)重写ClassVisitor和MethodVisitor,以生成类型代码。
visitMaxs方法中重置异常消息,并根据t实例使用instanceof指令判断异常类型,如果是运行时异常则构造RuntimeException,否则构造Exception。使用throwException指令抛出新的异常对象,重写onMethodExit方法,确定原方法如果有返回值,则保留该对象并返回。
3)重写ClassVisitor和MethodVisitor,以生成输出代码以及存储代码。
根据调用标识id赋值给变数invokeId。遍历异常堆栈信息,根据claaName和methodName找到异常点的行号赋值给lineNum。根据类名调用gitlab api获取该类的源码内容赋值给变量srcContent。使用javaparser解析源码。遍历源码方法,找到方法名同参数列表描述符一致的方法定义源码块和方法开始行号,赋值给变量content和beginLine。将arg按照json格式写入目标文件。将content按行切割为列表lines[],设定光标idx=0。判断idx+beginLine==lineNum是否成立,若是,则表明当前行为异常行需要高亮显示,前面再加上***;否则,在各行前均加上行号idx+beginLine。将lines[idx+beginLine]行写入文件,然后自增光标idx++。将异常堆栈内容写入文件。
增强后的目标程序具体为:
Figure BDA0002803595860000131
在出现非运行时异常时,经过agent包增强后的目标程序的Jar包增加了统一的处理逻辑,所执行逻辑如下:
Figure BDA0002803595860000132
Figure BDA0002803595860000141
S304、运行增强后的目标程序。
其中,在运行增强后的目标程序出现异常时,可以抛出如下异常消息。
Exception in thread“main”java.lang.string.Index0ut0fBoundsException:string index out of range:4|请查看错误明细,路径:/data/logs/000000000000.outat java.lang.string.suhstring(string.java:1963)
at cam.wb.xthrow.Source.dosomeThing1(Source.java:7)
at com.w6.xthrow.source.main(source.java:64)
Caused by:java.lang.string.Index0ut0fBoundsException:string index outof range:4;
at java.lang.string.suhstring(string.java:1963)
at cam.wb.xthrow.Source.dosomeThing1(Source.java:7)
at com.w6.xthrow.source.main(source.java:64)
根据异常消息查看异常点相关信息内容如下:
方法属性数据为:
[“a”]
异常代码如下所示:
Figure BDA0002803595860000142
Figure BDA0002803595860000151
异常堆栈内容为:
Exception in thread"main"java.long.StringIndexOutOfBoundsExceptian:String index out of range:{
at java.long.String.substrinq{String.java:1963}
at cam.wb.xthraw.Source.doSomeThingl{Source.java:7}
at com.wb.xthrow.3ource.main{Source.java:64}
将异常堆栈发生方法涉及到的入参以及源码内容输出到档中,开发人员直接查看该档从而可以快速精准的定位问题发生的原因,提高排查效率。
在本申请实施例提供的程序异常代码获取方法中,通过ASM字节码增加技术,对编译后的目标程序内容进行统一的处理,避免开发人员的重复动作,以实现无感知的逻辑织入,实现自动输出异常代码和属性数据。
如图5所示,本申请另一实施例提供一种程序异常代码获取装置,该程序异常代码获取装置400包括:
获取模块401,用于获取用于加载目标程序和增强程序的触发指令;
处理模块402,用于根据触发指令将目标程序和增强程序加载至内存;
处理模块402还用于运行增强程序,以将增强代码增加至目标程序生成增强后的目标程序;其中,增强代码用于输出目标程序的异常代码;
处理模块402还用于运行增强后的目标程序,以在目标程序异常时输出异常代码。
可选地,处理模块402具体用于:
执行解析代码,以对目标程序的源代码进行解析获得解析结果;
当解析结果满足预设插入条件时执行增强代码,以生成增强后的目标程序;
其中,增强程序包括解析代码和增强代码。
可选地,处理模块402具体用于:
当解析结果指示解析到方法主体时插入位置代码;其中,位置代码用于获取异常代码的异常位置信息;
插入输出代码;其中,输出代码是根据目标程序的源代码和位置代码生成的,输出代码用于输出异常代码;
增强代码包括位置代码和输出代码。
可选地,处理模块402具体用于:
当解析结果指示解析到方法主体时插入用于捕获异常的捕获代码和用于调用异常堆栈信息的堆栈代码。
可选地,处理模块402具体用于:
当解析结果指示解析到参数定义标识时插入用于获取属性数据的属性代码,其中,增强程序还包括属性代码。
可选地,处理模块402具体用于:
当解析结果指示解析到方法结束标识时插入用于获取异常类型的类型代码;
其中,增强程序还包括类型代码,类型代码是根据位置代码生成的。
可选地,处理模块402具体用于:
当解析结果指示解析到方法结束标识时插入用于存储异常代码的存储代码;
其中,增强程序还包括存储代码,储存代码是根据输出代码生成的。
如图6所示,本申请另一实施例提供的电子设备500包括:发送器501、接收器502、内存503以及处理器504。
发送器501,用于发送指令和数据;
接收器502,用于接收指令和数据;
内存503,用于存储计算机执行指令;
处理器504,用于执行内存存储的计算机执行指令,以实现上述实施例中区块链的共识方法所执行的各个步骤。具体可以参见前述区块链的共识方法实施例中的相关描述。
可选地,上述内存503既可以是独立的,也可以跟处理器504集成在一起。当内存503独立设置时,该电子设备还包括总线,用于连接内存503和处理器504。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁盘或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (11)

1.一种程序异常代码获取方法,其特征在于,包括:
获取用于加载目标程序和增强程序的触发指令;
根据所述触发指令将所述目标程序和所述增强程序加载至内存;
运行所述增强程序,以将增强代码增加至所述目标程序生成增强后的目标程序;其中,所述增强代码用于输出所述目标程序的异常代码;
运行所述增强后的目标程序,以在所述目标程序异常时输出异常代码。
2.根据权利要求1所述的方法,其特征在于,所述运行所述增强程序,具体包括:
执行解析代码,以对所述目标程序的源代码进行解析获得解析结果;
当所述解析结果满足预设插入条件时执行所述增强代码,以生成所述增强后的目标程序;
其中,所述增强程序包括所述解析代码和所述增强代码。
3.根据权利要求2所述的方法,其特征在于,当所述解析结果满足预设插入条件时执行所述增强代码以生成所述增强后的目标程序,具体包括:
当所述解析结果指示解析到方法主体时插入位置代码;其中,所述位置代码用于获取所述异常代码的异常位置信息;
插入输出代码;其中,所述输出代码是根据所述目标程序的源代码和所述位置代码生成的,所述输出代码用于输出所述异常代码;
所述增强代码包括所述位置代码和所述输出代码。
4.根据权利要求3所述的方法,其特征在于,当所述解析结果满足预设插入条件时插入位置代码,具体包括:
当所述解析结果指示解析到方法主体时插入用于捕获异常的捕获代码和用于调用异常堆栈信息的堆栈代码。
5.根据权利要求2至4中任一项所述的方法,其特征在于,当所述解析结果满足预设插入条件时执行所述增强代码以生成所述增强后的目标程序,还包括:
当所述解析结果指示解析到参数定义标识时插入用于获取属性数据的属性代码,其中,所述增强程序还包括所述属性代码。
6.根据权利要求3或4所述的方法,其特征在于,当所述解析结果满足预设插入条件时执行所述增强代码以生成所述增强后的目标程序,还包括:
当所述解析结果指示解析到方法结束标识时插入用于获取异常类型的类型代码;
其中,所述增强程序还包括类型代码,所述类型代码是根据所述位置代码生成的。
7.根据权利要求2至4中任一项所述的方法,其特征在于,当所述解析结果满足预设插入条件时执行增强代码以生成所述增强后的目标程序,具体包括:
当解析结果指示解析到方法结束标识时插入用于存储所述异常代码的存储代码;
其中,所述增强程序还包括所述存储代码,所述存储代码是根据所述输出代码生成的。
8.一种程序异常代码获取装置,其特征在于,包括:
获取模块,用于获取用于加载目标程序和增强程序的触发指令;
处理模块,用于根据所述触发指令将所述目标程序和所述增强程序加载至内存;
所述处理模块还用于运行所述增强程序,以将增强代码增加至所述目标程序生成增强后的目标程序;其中,所述增强代码用于输出所述目标程序的异常代码;
所述处理模块还用于运行所述增强后的目标程序,以在所述目标程序异常时输出异常代码。
9.一种电子设备,其特征在于,包括:
存储器,用于存储程序;
处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如权利要求1至7中任一项所述的程序异常代码获取方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令;
其中,所述计算机执行指令被处理器执行时用于实现如权利要求1至7中任一项所述的程序异常代码获取方法。
11.一种计算机程序产品,包括指令,其特征在于,所述指令被处理器执行时实现权利要求1至7中任一项所述的程序异常代码获取方法。
CN202011359452.0A 2020-11-27 2020-11-27 程序异常代码获取方法、装置、电子设备以及存储介质 Pending CN112445706A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011359452.0A CN112445706A (zh) 2020-11-27 2020-11-27 程序异常代码获取方法、装置、电子设备以及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011359452.0A CN112445706A (zh) 2020-11-27 2020-11-27 程序异常代码获取方法、装置、电子设备以及存储介质

Publications (1)

Publication Number Publication Date
CN112445706A true CN112445706A (zh) 2021-03-05

Family

ID=74737784

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011359452.0A Pending CN112445706A (zh) 2020-11-27 2020-11-27 程序异常代码获取方法、装置、电子设备以及存储介质

Country Status (1)

Country Link
CN (1) CN112445706A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113342657A (zh) * 2021-06-09 2021-09-03 网易(杭州)网络有限公司 一种检测代码异常的方法和装置
CN114610406A (zh) * 2022-03-02 2022-06-10 维塔科技(北京)有限公司 代码注入方法、装置、存储介质及电子设备

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100218175A1 (en) * 2009-02-26 2010-08-26 Foley Sean C Exception declaration refactoring to reduce memory footprint
CN104346148A (zh) * 2013-07-30 2015-02-11 阿里巴巴集团控股有限公司 获取程序性能消耗信息的方法、装置及系统
CN105808266A (zh) * 2016-03-29 2016-07-27 广州华多网络科技有限公司 代码运行方法及装置
CN106909498A (zh) * 2015-12-22 2017-06-30 阿里巴巴集团控股有限公司 一种Java程序注入故障的方法和系统
CN108132850A (zh) * 2017-12-22 2018-06-08 北京比特大陆科技有限公司 代码定位方法、装置及电子设备
CN108228461A (zh) * 2018-01-08 2018-06-29 平安科技(深圳)有限公司 一种日志生成方法、装置、计算机设备及存储介质

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100218175A1 (en) * 2009-02-26 2010-08-26 Foley Sean C Exception declaration refactoring to reduce memory footprint
CN104346148A (zh) * 2013-07-30 2015-02-11 阿里巴巴集团控股有限公司 获取程序性能消耗信息的方法、装置及系统
CN106909498A (zh) * 2015-12-22 2017-06-30 阿里巴巴集团控股有限公司 一种Java程序注入故障的方法和系统
CN105808266A (zh) * 2016-03-29 2016-07-27 广州华多网络科技有限公司 代码运行方法及装置
CN108132850A (zh) * 2017-12-22 2018-06-08 北京比特大陆科技有限公司 代码定位方法、装置及电子设备
CN108228461A (zh) * 2018-01-08 2018-06-29 平安科技(深圳)有限公司 一种日志生成方法、装置、计算机设备及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
小傅哥: "ASM字节码编程 | 用字节码增强技术给所有方法加上 TryCatch捕获异常并输出", 《HTTPS://SEGMENTFAULT.COM/A/1190000022403863》, pages 1 - 14 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113342657A (zh) * 2021-06-09 2021-09-03 网易(杭州)网络有限公司 一种检测代码异常的方法和装置
CN114610406A (zh) * 2022-03-02 2022-06-10 维塔科技(北京)有限公司 代码注入方法、装置、存储介质及电子设备

Similar Documents

Publication Publication Date Title
US11151018B2 (en) Method and apparatus for testing a code file
US9274923B2 (en) System and method for stack crawl testing and caching
US8458681B1 (en) Method and system for optimizing the object code of a program
CN110941528B (zh) 一种基于故障的日志埋点设置方法、装置及系统
US20230325513A1 (en) Method for detecting vulnerabilities in software
EP3660684A1 (en) Efficient and comprehensive source code fuzzing
US9588872B2 (en) Discovery of code paths
CN108614702B (zh) 字节码优化方法及装置
US8429632B1 (en) Method and system for debugging merged functions within a program
US8364691B2 (en) Dynamic query-based debug point mapper
US9104781B2 (en) Obtaining metadata set by imperative statement
CN111158741A (zh) 监控业务模块对第三方类库依赖关系变化的方法及装置
CN112445706A (zh) 程序异常代码获取方法、装置、电子设备以及存储介质
CN112419057A (zh) 智能合约的日志生成及保存方法、装置、设备和存储介质
CN111352631B (zh) 一种接口兼容性检测方法及装置
CN111309402B (zh) 数据监测及针对应用程序的处理方法、装置及设备
CN111625225A (zh) 一种程序指定数据输出方法和装置
EP2885712A1 (en) Imperative attribution for elements in managed runtimes
CN111240728A (zh) 应用程序更新方法、装置、设备和存储介质
CN108304230B (zh) 调整应用属性的实现方法、装置及可读存储介质
US11023214B2 (en) System and method for eliminating runtime out-of-bounds errors and exceptions
CN109308256B (zh) 一种java程序动态分析方法、设备和存储介质
Chen et al. Tracking down dynamic feature code changes against Python software evolution
CN110795358A (zh) 代码插桩检测方法、装置、设备及介质
CN109426601B (zh) 一种对程序进行无状态检测的方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination