CN111625225A - 一种程序指定数据输出方法和装置 - Google Patents
一种程序指定数据输出方法和装置 Download PDFInfo
- Publication number
- CN111625225A CN111625225A CN202010469930.7A CN202010469930A CN111625225A CN 111625225 A CN111625225 A CN 111625225A CN 202010469930 A CN202010469930 A CN 202010469930A CN 111625225 A CN111625225 A CN 111625225A
- Authority
- CN
- China
- Prior art keywords
- target
- program
- bytecode
- data output
- class
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/22—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开实施例提供了一种程序指定数据输出方法、装置、电子设备及存储介质。预先编写包含指定数据的输出逻辑的输出控制程序,将所述输出控制程序与线上程序的目标进程建立通信通道,通过该输出控制程序提供接口接收用户选定的目标方法,并通过所述输出控制程序调用字节码增强工具依据所述指定数据的输出逻辑修改目标方法的原字节码,得到具有指定数据输出功能的目标方法的新字节码,最后通过所述通信通道以所述新字节码替换所述原字节码。本方案可依据用户输入的目标方法,动态修改线上程序的字节码,使目标方法具有指定数据的输出功能。
Description
技术领域
本公开涉计算机技术领域,尤其涉及一种程序指定数据输出方法、装置、电子设备及存储介质。
背景技术
在业务系统正式上线投入运行后,可能会出现各种各样的异常情况,需要对线上程序进行排查,在排查线上问题时,作为开发者,通常想快速得到一些日志数据,日志中可包括线上运行某个方法的真实耗时,线上接收的某些用户请求的真实返回值,等等。
在现有方案中,通常使用AOP方案(面向切面编程)解决该问题,AOP是Java中的一种打印方法执行时间、参数、返回值的常用解决方案。但AOP方案需要依赖特定的框架,需要提前好编写相应的代码到工程代码中。如果线上程序没有提前写入AOP方案的特定框架,则需要将代码修改完毕后再重新启动业务系统的运行,耗时较久。
发明内容
针对上述技术问题,本公开实施例提供一种程序指定数据输出方法,技术方案如下:
根据本公开实施例的第一方面,提供一种程序指定数据输出方法,所述方法包括:
所述输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,并通过所述通信通道获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
输出控制程序调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到所述目标方法的具有指定数据输出功能的目标方法的新字节码;
通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
可选的,所述调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码,包括:
调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
可选的,所述指定数据的输出逻辑包括:输出指定方法的开始时间与结束时间,以统计所述指定方法的耗时,和/或输出指定方法的参数及返回值。
可选的,所述输出控制程序为Java agent程序,所述输出控制程序与线上程序的目标进程之间建立通信通道的方式,包括:
利用Java虚拟机提供的Attach功能,将所述Java agent程序与正在运行的业务程序建立通信通道。
可选的,所述通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换原字节码,包括:
通过所述Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
可选的,所述通过指定接口接收用户选定的目标进程中的目标方法,包括:
启动命令行程序,通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法。
可选的,所述通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法,包括:
通过所述命令行程序接收用户输入的类标识与方法标识,依据所述类标识在目标进程中查找到目标类,依据所述方法标识在所述目标类中查找到目标方法,所述类标识用于唯一标识所述目标进程中的一个类,所述方法标识用于唯一标识所述目标类中的一个方法。
根据本公开实施例的第二方面,提供一种目标程序指定数据输出装置,所述装置包括:
目标方法确定模块,被配置为所述输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,并通过所述通信通道获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
字节码增强模块,被配置为输出控制程序调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码;
字节码注入模块,被配置为通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
可选的,所述字节码增强模块,在调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码时,被配置为:
调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
可选的,所述指定数据的输出逻辑包括:输出指定方法的开始时间与结束时间,以统计所述指定方法的耗时,和/或输出指定方法的参数及返回值。
可选的,所述输出控制程序为Java agent程序,所述装置还包括:
通信通道建立模块,被配置为利用Java虚拟机提供的Attach功能,将所述Javaagent程序与正在运行的业务程序建立通信通道。
可选的,所述字节码注入模块,在通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换原字节码时,被配置为:
通过所述Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
可选的,所述目标方法确定模块,在通过指定接口接收用户选定的目标进程中的目标方法时,被配置为:
启动命令行程序,通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法。
可选的,所述目标方法确定模块,在通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法时,被配置为:
通过所述命令行程序接收用户输入的类标识与方法标识,依据所述类标识在目标进程中查找到目标类,依据所述方法标识在所述目标类中查找到目标方法,所述类标识用于唯一标识所述目标进程中的一个类,所述方法标识用于唯一标识所述目标类中的一个方法。
根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如第一方面所述的方法。
根据本公开实施例的第四方面,提供一种存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如第一方面所述的方法。
本公开实施例提供了一种程序指定数据输出方法、装置、电子设备及存储介质。预先编写包含指定数据的输出逻辑的输出控制程序,将所述输出控制程序与线上程序的目标进程建立通信通道,通过该输出控制程序提供接口接收用户选定的目标方法,并通过所述输出控制程序调用字节码增强工具依据所述指定数据的输出逻辑修改目标方法的原字节码,得到具有指定数据输出功能的目标方法的新字节码,最后通过所述通信通道以所述新字节码替换所述原字节码。本方案可依据用户输入的目标方法,动态修改线上程序的字节码,使目标方法具有指定数据的输出功能。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开实施例。
此外,本公开实施例中的任一实施例并不需要达到上述的全部效果。
附图说明
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1是本公开一示例性实施例示出的程序指定数据输出方法的一种流程图;
图2是本公开一示例性实施例示出的程序指定数据输出方法的另一种流程图;
图3是本公开一示例性实施例示出的程序指定数据输出方法的另一种流程图;
图4是本公开一示例性实施例示出的Java程序的指定数据输出装置的一种示意图;
图5是本公开一示例性实施例示出的电子设备的一种示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
在业务系统正式上线投入运行后,可能会出现各种各样的异常情况,需要对线上程序进行排查,在排查线上问题时,作为开发者,通常想快速得到一些日志数据,日志中可包括线上运行某个方法的真实耗时,线上接收的某些用户请求的真实返回值,等等。
在现有方案中,通常使用AOP方案(面向切面编程)解决该问题,AOP是Java中的一种打印方法执行时间、参数、返回值的常用解决方案。但AOP方案需要依赖特定的框架,需要提前好编写相应的代码到工程代码中。如果线上程序没有提前写入AOP方案的特定框架,则需要将代码修改完毕后再重新启动业务系统的运行,耗时较久。
为了解决这一问题,本公开提供了一种程序指定数据输出方法,以及应用所述程序指定数据输出方法的程序指定数据输出设备。该方法主要针对的是Java(一种面向对象的程序设计语言)语言编写而成的程序。下面结合说明书附图对本公开实施例作进一步详细描述。
首先对本公开提供的程序指定数据输出方法进行说明,该方法应用于预先编写的输出控制程序,参见图1,包括以下步骤S101~步骤S103:
在步骤S101中,输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
在本公开一实施例中,所述通过指定接口接收用户选定的目标进程中的目标方法,包括:启动命令行程序,通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法。
具体而言,输出控制程序是预先配置而成的,其被预先写入了用户命令接收逻辑,该用户命令接收逻辑可通过指定接口接收用户选定的目标进程中的目标方法。其中一种实施方式为启动命令行程序,通过调用命令行程序为用户提供目标方法的输入接口。举例说明:用户可通过在命令行程序中输入命令行(类名方法名)的方式指定目标方法。
在本公开一实施例中,在执行步骤S101时,可以采用但不限于以下方式:
(1-1)调用命令行程序接收用户输入的类标识与方法标识;
(1-2)依据所述类标识在目标进程中查找对应的类,依据所述方法标识在对应的类中确定目标方法,所述类标识用于唯一标识所述目标进程中的一个类,所述方法标识用于唯一标识所述目标类中的一个方法。
即,确定用户选定的目标进程中的目标方法的具体方式为:通过命令行程序接收用户输入的类标识和方法标识,该类标识和方法标识可以为类名称、类ID,方法名称、方法ID等。根据输入数据在目标进程中查找到对应的目标方法。
例如,用户在命令行程序中输入“类A001方法B002”,A002为用户输入的类标识,B002为用户输入的方法标识,则根据类标识和方法标识,可在目标进程的类A001中确定到方法B002,将该方法B002确定为目标方法。
其中,通过命令行程序接收用户输入的目标方法,用户只需要在命令行程序中输入想要增加数据输出的目标方法即可,不需要为每个目标方法手动编写代码,效率较高。
在步骤S102中,输出控制程序调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码;
在本公开一实施例中,所述预置的指定数据输出逻辑用于输出用户需要的指定数据。
在Java环境中,类是具有共同属性和行为的对象的集合。类中的变量被称为字段,类中的函数被称为方法。
方法本质上是具备特定功能的一段代码块,将具有特定功能的代码块设定为方法,后续可以通过调用方法实现对代码块的复用,不需要为不同场景下的相同功能需求重新撰写代码。即,方法的存在目的是为了提高程序代码的复用性和可读性。
在方法中存在参数和返回值,参数为传递给被调用方法的值,参数需要预先创建并赋予确定值,通常地,可先将一个确定的参数值传递给方法后,再运行该方法。
返回值为所调用的方法运行后返回的值,可以知道。对于一个方法来说,参数不同会导致返回值不同。
在本公开中,预置的指定数据输出逻辑可以包括:输出指定方法的开始时间与结束时间,以统计所述指定方法的耗时,进而判断该方法是否耗时过短或过长,可用于初步确定该方法是否存在问题;输出方法的参数和返回值,可用于具体的问题定位。
需要注意的是,在一些方法中,既存在参数也存在返回值;在另一些方法中,可能只存在参数、只存在返回值、或既不存在参数也不存在返回值。在本公开一实施例中,预置的指定数据输出逻辑可以具体设定为:在方法存在参数和返回值时,输出参数,以及方法在该参数下运行后得到的返回值;在方法只存在参数或返回值时,只输出参数或返回值;在方法既不存在参数也不存在返回值时,输出为空。
在本公开一实施例中,在执行步骤S102时,可以采用但不限于以下方式:
(2-1)调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
(2-2)将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
上述步骤(2-1)至(2-2)的具体实现过程,可详见图2所示实施例。
在步骤S103中,通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
在本公开一实施例中,所述输出控制程序为Java agent程序,在执行步骤S103时,可以采用但不限于以下方式:
(3-1)通过Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
(3-2)确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
上述步骤(3-1)至(3-2)的具体实现过程,可详见图3所示实施例。
本公开实施例预先配置了输出控制程序,该输出控制程序预先写入用户命令接收逻辑和字节码增强逻辑,该用户命令接收逻辑用于接收用户选定的目标进程中的目标方法,该字节码增强逻辑用于对目标方法的字节码进行修改,使所述目标方法运行时能够输出Java agent程序中预先配置的指定数据。
在本公开一实施例中,所述输出控制程序为Java agent程序,所述输出控制程序与线上程序的目标进程之间建立通信通道的方式,包括:
利用Java虚拟机提供的Attach功能,将所述Java agent程序与正在运行的业务程序建立通信通道。
具体而言,启动该Java agent程序的过程为:通过VirtualMachine(虚拟机)类的attach(附加)方法启动所述Java agent程序。在SUM函数提供的tools.jar工具包里有一种类,名为VirtualMachine。通过VirtualMachine类的attach方法,可以启动所述Java agent程序,并可以将所述Java agent程序attach在指定的JVM(Java Virtual Machine,Java虚拟机)进程上。
本公开实施例中将所述JVM进程称为所述目标进程。在Java agent程序编写完成后,会形成一个jar文件。通过attach功能包的loadAgent方法,加载所述jar文件,即可将Java agent程序基于attach方法attach到目标进程。
将Java agent程序基于attach方法attach到目标进程后,视为两者之间建立了通信通道。所述Java agent程序可基于该通信通道与目标进程进行通信,并可以修改目标进程中的数据。
图2是根据一示例性实施例示出的另一种程序指定数据输出方法的流程图,该程序指定数据输出方法可以用于能够执行Java程序的指定数据输出的平台上,并建立在图1所示方法的基础上,如图2所示,可以包括以下步骤S201-S202:
在步骤S201中,调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
在步骤S202中,将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
可以知道,在Java程序中,开发者开发时编写的代码为Java源代码,将Java源代码进行编译后得到字节码,字节码是可以被Java虚拟机(JVM)直接识别的指令格式。字节码通常以Java class文件的方式进行存储。
在本公开一实施例中,所述字节码增强工具为ASM工具。ASM工具是基于Java字节码层面的代码分析和修改工具,无需提供源代码即可对应用嵌入所需代码。ASM的目标是生成,转换和分析已编译的Java class文件,可使用ASM工具读/写/转换JVM指令集。对于手动操纵字节码的需求来说,使用ASM可以直接生成.class字节码文件,也可以在类被加载入JVM之前动态修改类行为。
具体而言,使用ASM工具分析指定的class的字节码,可以通过ASM工具中的定制修改规则对这个class的字节码做修改,生成新的class的类的字节码。这样就可以实现在旧的class基础上添加耗时、参数、返回值等的指定数据的输出逻辑,并生成具有指定数据输出逻辑的新的字节码。
本实施例在输出控制程序中预先配置了指定数据的输出逻辑,并依据用户指定的目标方法,在不修改目标方法的源代码的情况下,直接生成适应于所述目标方法的,具有指定数据输出功能的字节码,并插入目标方法的原字节码中。
举例说明,该输出控制程序中预先配置了时间数据输出逻辑,该时间数据输出逻辑包括:在方法运行开始时打印一次时间数据,在方法运行结束时再打印一次时间数据,则开发者可通过两次时间数据计算出方法的运行耗时。
接收到用户指定的目标方法后,基于该时间数据输出逻辑为目标方法生成具有时间数据输出功能的字节码,该具有时间数据输出功能的字节码可包括字节码段A和字节码段B。其中,字节码段A用于在目标方法运行开始时打印一次时间数据;字节码段B用于在目标方法运行结束时再打印一次时间数据。
获取目标方法的原字节码,将字节码段A插入到目标方法的原字节码的开头,将字节码段B插入到目标方法的原字节码的结尾,插入完成后,即得到具有目标方法的耗时数据输出功能的新字节码。
需要注意的是,用户仅能通过命令行指定需要增加指定数据输出逻辑的目标方法,具体需要输出的指定数据需要配置在输出控制程序中。如:输出控制程序中只配置了打印时间数据的逻辑,则用户选择任一种目标方法后,也只会在该目标方法的类的字节码中增加打印时间数据的逻辑。如果需要增加/删除/修改需要输出的指定数据,则需要更改输出控制程序中的配置。
图3是根据一示例性实施例示出的另一种程序指定数据输出方法的流程图,该Java程序的指定数据输出可以用于能够执行Java程序的指定数据输出的平台上,并建立在图1所示方法的基础上,如图3所示,可以包括以下步骤S301-S302:
在步骤S301中,通过所述Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
在步骤S302中,确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
可以知道,由于本公开中的线上程序是运行中的Java虚拟机(JVM)的程序,若要将目标类的原字节码替换为目标类的新字节码,则需要在运行中的Java程序中重新加载目标类的字节码。
但JVM是不允许在运行时动态重载一个类的,为了实现在JVM运行时动态的重新加载类文件,本实施例利用Java下的类库接口,通过Instrumentation类库实现类文件的重新加载。
Instrumentation是JVM提供的一个可以修改已加载类的类库。它需要依赖JVMTI的Attach API机制实现,具体而言,要使用Instrumentation的类修改功能,需要通过其中的ClassFileTransformer接口,定义一个类文件转换器。接口中的transform()方法会在类文件被加载时调用。
由此可见,本公开实施例提出了一种程序指定数据输出方法,这种方法无需对现有系统做任何适应性改变,只需要将一个新的JAR(Java Archive,Java归档文件)包,即输出控制程序的JAR包放入线上程序的LIB(library,库文件)目录下就可以使用,实施较为方便。
在本公开实施例提供的方法中,预先编写包含指定数据的输出逻辑的输出控制程序,将所述输出控制程序与线上程序的目标进程建立通信通道,通过该输出控制程序提供接口接收用户输入的目标方法,并通过所述输出控制程序调用字节码增强工具依据所述指定数据的输出逻辑修改目标方法的原字节码,得到具有指定数据输出功能的目标方法的新字节码,最后通过所述通信通道以所述新字节码替换所述原字节码。本方案可依据用户输入的目标方法,动态修改线上程序的字节码,使目标方法具有指定数据的输出功能。最后接收目标方法的新字节码运行后输出的指定数据,基于该指定数据可实现对目标程序的线上问题的排查。
相应于上述方法实施例,本公开实施例还提供一种目标程序指定数据输出装置,参见图4所示,所述装置可以包括:目标方法确定模块410,字节码增强模块420和字节码注入模块430。
目标方法确定模块410,被配置为输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,并通过所述通信通道获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
字节码增强模块420,被配置为调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到所述目标方法的具有指定数据输出功能的目标方法的新字节码;
字节码注入模块430,被配置为通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
可选的,所述字节码增强模块,在调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码时,被配置为:
调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
可选的,所述指定数据的输出逻辑包括:输出指定方法的开始时间与结束时间,以统计所述指定方法的耗时,和/或输出指定方法的参数及返回值。
可选的,所述输出控制程序为Java agent程序,所述装置还包括:
通信通道建立模块,被配置为利用Java虚拟机提供的Attach功能,将所述Javaagent程序与正在运行的业务程序建立通信通道。
可选的,所述字节码注入模块,在通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换原字节码时,被配置为:
通过所述Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
可选的,所述目标方法确定模块,在通过指定接口接收用户选定的目标进程中的目标方法时,被配置为:
启动命令行程序,通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法。
可选的,所述目标方法确定模块,在通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法时,被配置为:
通过所述命令行程序接收用户输入的类标识与方法标识,依据所述类标识在目标进程中查找到目标类,依据所述方法标识在所述目标类中查找到目标方法,所述类标识用于唯一标识所述目标进程中的一个类,所述方法标识用于唯一标识所述目标类中的一个方法。
本公开实施例还提供一种电子设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述程序指定数据输出方法,所述方法包括:
所述输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,并通过所述通信通道获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码;
通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
图5示出了根据本公开的一示例性实施例的基于主设备侧电子设备的示意结构图。请参考图5,在硬件层面,该电子设备包括处理器502、内部总线504、网络接口506、内存504以及非易失性存储器510,当然还可能包括其他业务所需要的硬件。处理器502从非易失性存储器510中读取对应的计算机程序到内存502中然后运行,在逻辑层面上形成执行程序指定数据输出方法的装置。当然,除了软件实现方式之外,本公开并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述的程序指定数据输出方法,所述方法包括:
所述输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,并通过所述通信通道获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码;
通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁存储设备存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本公开方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
以上所述仅是本公开实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开实施例的保护范围。
Claims (10)
1.一种程序指定数据输出方法,其特征在于,所述方法包括:
输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,获取所述目标方法的原字节码,其中,所述输出控制程序与待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
输出控制程序调用字节码增强工具,依据预置的指定数据输出逻辑修改所述原字节码,得到所述目标方法的具有指定数据输出功能的新字节码;
通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
2.如权利要求1所述的方法,其特征在于,所述调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到具有指定数据输出功能的目标方法的新字节码,包括:
调用所述字节码增强工具依据所述输出控制程序中预置的指定数据输出逻辑生成适应于所述目标方法的,具有指定数据输出功能的字节码;
将所述具有指定数据输出功能的字节码插入目标方法的原字节码中,得到具有指定数据输出功能的目标方法的新字节码。
3.如权利要求1所述的方法,其特征在于,所述指定数据的输出逻辑包括:
输出指定方法的开始时间与结束时间,以统计所述指定方法的耗时,和/或输出指定方法的参数及返回值。
4.如权利要求1所述的方法,其特征在于,所述输出控制程序为Java agent程序,所述输出控制程序与线上程序的目标进程之间建立通信通道的方式,包括:
利用Java虚拟机提供的Attach功能,将所述Java agent程序与正在运行的业务程序建立通信通道。
5.如权利要求1所述的方法,其特征在于,所述通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换原字节码,包括:
通过所述Java agent程序确定Instrumentation类库,在所述Instrumentation类库中确定所述目标进程中已加载的类;
确定所述目标方法所在的目标类,通过基于Attach功能建立的通信通道将目标类的原字节码替换为目标类的新字节码。
6.如权利要求1所述的方法,其特征在于,所述通过指定接口接收用户选定的目标进程中的目标方法,包括:
启动命令行程序,通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法。
7.如权利要求6所述的方法,其特征在于,所述通过所述命令行程序接收用户的输入命令,基于所述输入命令在目标进程中确定目标方法,包括:
通过所述命令行程序接收用户输入的类标识与方法标识,依据所述类标识在目标进程中查找到目标类,依据所述方法标识在所述目标类中查找到目标方法,所述类标识用于唯一标识所述目标进程中的一个类,所述方法标识用于唯一标识所述目标类中的一个方法。
8.一种目标程序指定数据输出装置,其特征在于,所述装置包括:
目标方法确定模块,被配置为输出控制程序通过指定接口接收用户选定的目标进程中的目标方法,获取所述目标方法的原字节码,其中,所述输出控制程序与所述待检测程序的目标进程之间预先建立了通信通道,所述待检测程序为运行中的线上程序;
字节码增强模块,被配置为输出控制程序调用字节码增强工具,依据所述输出控制程序中预置的指定数据输出逻辑修改所述原字节码,得到所述目标方法的具有指定数据输出功能的目标方法的新字节码;
字节码注入模块,被配置为通过所述通信通道将所述新字节码注入所述目标进程,以所述新字节码替换所述原字节码,并接收所述目标方法的新字节码运行时输出的指定数据。
9.一种电子设备,其特征在于,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如权利要求1至7中任一项所述的方法。
10.一种存储介质,其特征在于,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如权利要求1至7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010469930.7A CN111625225A (zh) | 2020-05-28 | 2020-05-28 | 一种程序指定数据输出方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010469930.7A CN111625225A (zh) | 2020-05-28 | 2020-05-28 | 一种程序指定数据输出方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111625225A true CN111625225A (zh) | 2020-09-04 |
Family
ID=72259276
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010469930.7A Pending CN111625225A (zh) | 2020-05-28 | 2020-05-28 | 一种程序指定数据输出方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111625225A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112256448A (zh) * | 2020-09-30 | 2021-01-22 | 北京达佳互联信息技术有限公司 | 远程控制方法、装置、电子设备、系统及存储介质 |
CN113076119A (zh) * | 2021-03-25 | 2021-07-06 | 北京车和家信息技术有限公司 | 一种车机程序的更新方法、装置、介质和电子设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140245275A1 (en) * | 2013-02-26 | 2014-08-28 | Red Hat, Inc. | Bytecode modification |
CN104346148A (zh) * | 2013-07-30 | 2015-02-11 | 阿里巴巴集团控股有限公司 | 获取程序性能消耗信息的方法、装置及系统 |
CN104462943A (zh) * | 2014-11-21 | 2015-03-25 | 用友软件股份有限公司 | 业务系统中非侵入式性能监控装置和方法 |
CN109445878A (zh) * | 2018-10-12 | 2019-03-08 | 北京宝兰德软件股份有限公司 | 在运行时对Java类进行注入的方法及装置 |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控系统及方法 |
CN110347406A (zh) * | 2019-07-12 | 2019-10-18 | 四川虹美智能科技有限公司 | 一种采集应用的运行数据的方法及装置 |
CN110471787A (zh) * | 2019-08-22 | 2019-11-19 | 中国工商银行股份有限公司 | 线上问题捕获方法、系统、装置、电子设备及存储介质 |
-
2020
- 2020-05-28 CN CN202010469930.7A patent/CN111625225A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140245275A1 (en) * | 2013-02-26 | 2014-08-28 | Red Hat, Inc. | Bytecode modification |
CN104346148A (zh) * | 2013-07-30 | 2015-02-11 | 阿里巴巴集团控股有限公司 | 获取程序性能消耗信息的方法、装置及系统 |
CN104462943A (zh) * | 2014-11-21 | 2015-03-25 | 用友软件股份有限公司 | 业务系统中非侵入式性能监控装置和方法 |
CN109445878A (zh) * | 2018-10-12 | 2019-03-08 | 北京宝兰德软件股份有限公司 | 在运行时对Java类进行注入的方法及装置 |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控系统及方法 |
CN110347406A (zh) * | 2019-07-12 | 2019-10-18 | 四川虹美智能科技有限公司 | 一种采集应用的运行数据的方法及装置 |
CN110471787A (zh) * | 2019-08-22 | 2019-11-19 | 中国工商银行股份有限公司 | 线上问题捕获方法、系统、装置、电子设备及存储介质 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112256448A (zh) * | 2020-09-30 | 2021-01-22 | 北京达佳互联信息技术有限公司 | 远程控制方法、装置、电子设备、系统及存储介质 |
CN113076119A (zh) * | 2021-03-25 | 2021-07-06 | 北京车和家信息技术有限公司 | 一种车机程序的更新方法、装置、介质和电子设备 |
CN113076119B (zh) * | 2021-03-25 | 2023-12-12 | 北京车和家信息技术有限公司 | 一种车机程序的更新方法、装置、介质和电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9274768B2 (en) | Runtime code hooking for print driver and functionality testing | |
US6542167B1 (en) | System and method for flexible software linking | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
EP1582985A2 (en) | Test case inheritance controlled via attributes | |
CN108614702B (zh) | 字节码优化方法及装置 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
CN112882732A (zh) | 一种软件开发工具包sdk中功能代码的更新方法和装置 | |
CN111880804A (zh) | 应用程序代码的处理方法及装置 | |
CN112748905B (zh) | 基础库的初始化调用方法、装置、电子设备及存储介质 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
CN110688320B (zh) | 全局变量的检测方法、装置及终端设备 | |
CN109388770B (zh) | Web页面生成方法及装置 | |
CN114610516B (zh) | 应用程序的修复方法、装置、计算机设备以及存储介质 | |
CN113835748B (zh) | 基于html5的应用程序的打包方法、系统和可读介质 | |
CN114020278B (zh) | 数据处理方法、装置、设备及存储介质 | |
CN111045891B (zh) | 基于java多线程的监控方法、装置、设备以及存储介质 | |
CN111625463B (zh) | 一种程序状态检测方法和装置 | |
CN116775147B (zh) | 一种可执行文件处理方法、装置、设备及存储介质 | |
CN112765676B (zh) | 一种智能合约执行方法、智能合约执行装置及节点设备 | |
CN116700840B (zh) | 文件执行方法、装置、电子设备及可读存储介质 | |
CN115543486B (zh) | 面向无服务器计算的冷启动延迟优化方法、装置和设备 | |
CN114996128B (zh) | 基于asm框架的脚本处理方法、装置、设备及存储介质 | |
CN111061467B (zh) | 一种前端工程请求模块高效管理的方法 | |
CN117931374A (zh) | 基于容器隔离的应用处理方法、装置、设备及存储介质 | |
CN118331575A (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 |