掌桥专利:专业的专利平台
掌桥专利
首页

代码块监测方法、装置、电子设备及可读存储介质

文献发布时间:2023-06-19 19:30:30


代码块监测方法、装置、电子设备及可读存储介质

技术领域

本申请涉及软件领域,尤其涉及一种代码块监测方法、装置、电子设备及可读存储介质。

背景技术

应用代码运行时(如java代码),可能会出现消耗过大的问题。当出现消耗过大的问题时,可以使用应用性能监测软件(Application Performance Monitor,APM)进行监控,寻找问题。

但是,目前的APM中大部分都是通过预埋点的方式,监控数据库(Data Base,DB),远程调用等。定位精度不足,无法定位导致消耗过大的代码。

发明内容

基于上述技术问题,本申请提供一种代码块监测方法、装置、电子设备及可读存储介质,能够解决定位精度不足,无法定位导致消耗过大的代码的问题。

为解决上述技术问题,本申请采用如下技术方案:

第一方面,本申请提供一种代码块监测方法,包括:

根据预先设置的代码块识别特征,对目标代码数据进行分析,获取目标代码数据中存在的代码块的位置。根据代码块的位置,对至少一个代码块嵌入对应的监控代码,通过监控代码获取代码块的运行参数。当确定至少一个代码块的消耗大于预设阈值时,展示代码块的运行参数。

一些实施方式中,代码块包括循环代码块,循环代码块的识别特征包括循环代码块的开始指令和结束指令。

根据预先设置的代码块识别特征,对目标代码数据进行分析,获取目标代码数据中存在的代码块的位置,包括:

在目标代码数据中识别开始指令和结束指令。当识别到的开始指令存在对应的结束指令时,根据开始指令和结束指令在目标代码数据中的位置,得到循环代码块的位置。

一些实施方式中,通过监控代码获取代码块的运行参数,包括:根据执行开始指令和结束指令的时间,获取循环代码块的总执行时间。开始指令包括前跳指令,根据前跳指令指示跳转的目标指令,获取循环代码块的执行次数。根据每次执行目标指令的间隔,获取循环代码块的每次执行时间。

一些实施方式中,代码块包括同步代码块,同步代码块的识别特征包括持锁语句和放锁语句。

根据预先设置的代码块识别特征,对目标代码数据进行分析,获取目标代码数据中存在的代码块的位置,包括:在目标代码数据中识别持锁语句和放锁语句。当识别到持锁语句和放锁语句时,根据持锁语句和放锁语句的在目标代码数据中的位置,得到同步代码块的位置。

一些实施方式中,通过监控代码获取代码块的运行参数,包括:获取持锁语句执行阻塞的时间,阻塞的时间为获取锁的等待时间。根据持锁语句和放锁语句执行的时间,获取同步代码块的持锁时间。

一些实施方式中,对至少一个代码块嵌入对应的监控代码,包括:当目标代码数据中存在多个代码块时,获取每个代码块的标识并展示。接收用户指令,用户指令包括至少一个代码块的标识。对用户指令中包含的代码块的标识指示的代码块嵌入对应的监控代码。

一些实施方式中,当确定至少一个代码块的消耗大于预设阈值时,展示代码块的运行参数,包括:当代码块的运行时长大于预设阈值时,展示代码块的运行参数。

在第一方面中,通过代码块的识别特征在目标代码数据中识别代码块,并对代码块嵌入对应的监控代码。通过监控代码获取代码块的运行参数。并在代码块的消耗大于预设阈值时展示代码块的运行参数。可以精确地定位导致消耗过大的代码块,便于用户对代码进行维护。

第二方面,本申请提供一种代码块监测装置,包括:

分析模块,用于根据预先设置的代码块识别特征,对目标代码数据进行分析,获取所述目标代码数据中存在的所述代码块的位置;

嵌入模块,用于根据所述代码块的位置,对至少一个所述代码块嵌入对应的监控代码,通过所述监控代码获取所述代码块的运行参数;

展示模块,用于当确定至少一个所述代码块的消耗大于预设阈值时,展示所述代码块的所述运行参数。

一些实施方式中,代码块包括循环代码块,循环代码块的识别特征包括循环代码块的开始指令和结束指令。

分析模块,具体用于在目标代码数据中识别开始指令和结束指令。当识别到的开始指令存在对应的结束指令时,根据开始指令和结束指令在目标代码数据中的位置,得到循环代码块的位置。

一些实施方式中,嵌入模块,具体用于根据执行开始指令和结束指令的时间,获取循环代码块的总执行时间。开始指令包括前跳指令,根据前跳指令指示跳转的目标指令,获取循环代码块的执行次数。根据每次执行目标指令的间隔,获取循环代码块的每次执行时间。

一些实施方式中,代码块包括同步代码块,同步代码块的识别特征包括持锁语句和放锁语句。

分析模块,具体用于在目标代码数据中识别持锁语句和放锁语句。当识别到持锁语句和放锁语句时,根据持锁语句和放锁语句的在目标代码数据中的位置,得到同步代码块的位置。

一些实施方式中,嵌入模块,具体用于获取持锁语句执行阻塞的时间,阻塞的时间为获取锁的等待时间。根据持锁语句和放锁语句执行的时间,获取同步代码块的持锁时间。

一些实施方式中,嵌入模块,具体用于当目标代码数据中存在多个代码块时,获取每个代码块的标识并展示。接收用户指令,用户指令包括至少一个代码块的标识。对用户指令中包含的代码块的标识指示的代码块嵌入对应的监控代码。

一些实施方式中,展示模块,用于当代码块的运行时长大于预设阈值时,展示代码块的运行参数。

第三方面,本申请提供一种电子设备,该电子设备包括处理器和存储器;存储器中存储有处理器可执行的指令;处理器被配置为执行指令时,使得电子设备实现上述第一方面的方法。

第四方面,一种存储有计算机指令的非瞬时计算机可读存储介质,所述计算机指令用于使所述计算机执行上述的方法。

第五方面,本申请提供一种计算机程序产品,当该计算程序产品在电子设备上运行时,使得电子设备执行上述第一方面相关方法的步骤,以实现上述第一方面的方法。

上述第二方面至第五方面的有益效果可以参照第一方面和第二方面,不再赘述。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了本申请一实施例中提供的代码块监测方法的流程示意图;

图2示出了本申请一实施例提供的代码块监测装置的结构框图;

图3示出了可以用来实施本公开的实施例的电子设备300的示意性框图。

具体实施方式

以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。

图1示出了本申请一实施例中提供的代码块监测方法的流程示意图。

一些实施方式中,代码块监测方法可以应用于电子设备,电子设备可以是能够运行代码的设备,如服务器、计算机、智能手机、平板电脑、笔记本电脑等,本申请对此不作限制。

参考图1,代码块监测方法包括步骤S101至步骤S103。

S101、根据预先设置的代码块识别特征,对目标代码数据进行分析,获取目标代码数据中存在的代码块的位置。

一些实施方式中,每个代码块均具有其独特的识别特征。以常见的java循环代码块和java同步代码块为例。

作为示例,当代码块为循环代码块时,循环代码块可以包括for i循环(java增强for循环)、for each循环(for循环)、while true循环(while循环)以及do while循环等。

其中,while循环可以以以下形式实现:

do while循环可以以以下形式实现:

java的循环代码块本质上只是java的语法糖(Syntactic sugar)。无论上述的哪一种语法糖,在通过对应的代码实现时,存在两个重要的点,即:开始指令和结束指令。其中,开始指令可以是向前跳转的跳转指令。例如,“testfor”对应的java字节码中,包括一条“goto”指令;“testForNotFinish”对应的java字节码中,包括一条“goto”指令。结束指令则可以是跳出循环的跳出指令,例如,“testfor”对应的java字节码中,存在多个“ifcmpg”指令,可以在符合条件时跳出循环。

一些实施方式中,循环体可能仅存在开始指令,不存在跳出指令,即循环体为死循环。例如,“testForNotFinish”对应的java字节码中,没有一个跳转指令可以跳转出循环体,即该循环体为死循环。对于死循环,本申请实施例暂不做处理。

一些实施方式中,可以在目标代码数据中识别开始指令和结束指令。当识别到的开始指令存在对应的结束指令时,根据开始指令和结束指令在目标代码数据中的位置,得到循环代码块的位置。

例如,“testfor”对应的java字节码中,“goto”指令所在行为循环代码块的起始位置,“ifcmpg”指令所在的行为循环代码块的结束位置。

另一些示例中,当代码块为java同步代码块时,例如,可以是同步(Synchronized)同步代码块。本申请中提供的方法,可以实现对使用synchronized修饰非方法级别的监控。

作为示例,使用synchronized修饰非方法可以是手动执行锁定对象。例如,可以是“this”指令,也可以是自定义的锁。实现代码可以包括:

/>

使用synchronized修饰非方法还可以是指定锁对象为class对象。实现代码可以包括:

/>

其中,java的synchronized同步代码块,本质也只是java的语法糖,synchronized同步代码块的识别特征包括持锁语句和放锁语句。

一些实施方式中,可以在目标代码数据中识别持锁语句和放锁语句。当识别到持锁语句和放锁语句时,根据持锁语句和放锁语句的在目标代码数据中的位置,得到同步代码块的位置。

作为示例,synchronized同步代码块的持锁语句可以是在代码块开始时的“monitorenter”指令。这个指令对应锁阻塞的实现。例如,如果当前锁对象没有被别的线程占用,那么会继续执行下一条指令,如果当前锁已经被持有,那么会被阻塞在这条monitorenter指令上面,直到锁被放开,才会继续执行下一条指令。

synchronized同步代码块的放锁语句可以是“monitorexit”指令。这个指令用于实现放锁。需要说明的是,一个synchronized同步代码块中可能存在多个“monitorexit”指令,但并不代表会执行多次“monitorexit”指令,多个“monitorexit”指令仅用于在异常情况下可以再次执行放锁,提高放锁的准确性。

S102、根据代码块的位置,对至少一个代码块嵌入对应的监控代码,通过监控代码获取代码块的运行参数。

一些实施方式中,参考S101,当代码块为循环代码块时,可以在前跳指令、跳出指令处嵌入监控代码以及在前跳指令指示跳转的目标指令处嵌入监控代码。根据执行开始指令和结束指令的时间,获取循环代码块的总执行时间。开始指令包括前跳指令,根据前跳指令指示跳转的目标指令,获取循环代码块的执行次数。根据每次执行目标指令的间隔,获取循环代码块的每次执行时间。

另一些实施方式中,参考S102,当代码块为同步代码块时,可以在持锁语句前后进行嵌码,以及在放锁语句。当识别到持锁语句和放锁语句时,根据持锁语句和放锁语句的在出进行嵌码。获取持锁语句执行阻塞的时间,阻塞的时间为获取锁的等待时间。根据持锁语句和放锁语句执行的时间,获取同步代码块的持锁时间。

一些实施方式中,当识别得到目标代码数据中包括多个代码块时,可以对每个代码块均进行嵌码。

或者,当目标代码数据中存在多个代码块时,还可以获取每个代码块的标识并展示。然后等待用户确定需要嵌码的代码块。用户确定后返回用户指令,接收用户指令,用户指令中包括至少一个代码块的标识。对用户指令中包含的代码块的标识指示的代码块嵌入对应的监控代码。

一些实施方式中,代码块包括循环代码块,循环代码块的运行参数包括:执行的次数、总时间、单次最大时间、最小时间和循环次数等。

一些实施方式中,获取得到的循环代码块的运行参数可以通过以下代码记录:

其中,TransactionId为对应的代码块标识,该标识全局唯一。TracerId为对应的“tracemethod”的标识,在一个ActionTrace中唯一。startTime为监控开始时间。Clazz为class的限定名,Method为方法名。codeLine为代码行相关监控数据。Type为类型,例如,“loop”表示监控类型为循环代码块,“monitorenter”表示监控类型为监控获取锁的时间,“monitorexit”表示监控类型为监控持有锁的时间。startLine为代码块的开始行号,endLine为代码块的结束行号,Metric为测量(metric)数据。例如,在本示例中,loop的测量数据为:

一些实施方式中,代码块包括同步代码块,同步代码块的运行参数包括:获取锁的时间和持有锁的时间等。

S103、当确定至少一个代码块的消耗大于预设阈值时,展示代码块的运行参数。

一些实施方式中,当代码块的运行时长大于预设阈值时,展示代码块的运行参数。应当理解,代码块的消耗还可由一个或多个其他指标确定,本申请实施例对此不作限定。

例如,当循环代码块运行时间过长(如大于10秒)时,可以调取每个循环代码块的运行参数,并根据运行参数中的指标,帮助用户优化代码。

示例性实施例中,本公开实施例还提供一种代码块监测装置,可以用于实现如前述实施例提供的旁路测试方法。

图2示出了本申请一实施例提供的代码块监测装置的结构框图。

参考图2,一种代码块监测装置,包括:

分析模块21,用于根据预先设置的代码块识别特征,对目标代码数据进行分析,获取所述目标代码数据中存在的所述代码块的位置;

嵌入模块22,用于根据所述代码块的位置,对至少一个所述代码块嵌入对应的监控代码,通过所述监控代码获取所述代码块的运行参数;

展示模块23,用于当确定至少一个所述代码块的消耗大于预设阈值时,展示所述代码块的所述运行参数。

一些实施方式中,代码块包括循环代码块,循环代码块的识别特征包括循环代码块的开始指令和结束指令。

分析模块21,具体用于在目标代码数据中识别开始指令和结束指令。当识别到的开始指令存在对应的结束指令时,根据开始指令和结束指令在目标代码数据中的位置,得到循环代码块的位置。

一些实施方式中,嵌入模块22,具体用于根据执行开始指令和结束指令的时间,获取循环代码块的总执行时间。开始指令包括前跳指令,根据前跳指令指示跳转的目标指令,获取循环代码块的执行次数。根据每次执行目标指令的间隔,获取循环代码块的每次执行时间。

一些实施方式中,代码块包括同步代码块,同步代码块的识别特征包括持锁语句和放锁语句。

分析模块21,具体用于在目标代码数据中识别持锁语句和放锁语句。当识别到持锁语句和放锁语句时,根据持锁语句和放锁语句的在目标代码数据中的位置,得到同步代码块的位置。

一些实施方式中,嵌入模块22,具体用于获取持锁语句执行阻塞的时间,阻塞的时间为获取锁的等待时间。根据持锁语句和放锁语句执行的时间,获取同步代码块的持锁时间。

一些实施方式中,嵌入模块22,具体用于当目标代码数据中存在多个代码块时,获取每个代码块的标识并展示。接收用户指令,用户指令包括至少一个代码块的标识。对用户指令中包含的代码块的标识指示的代码块嵌入对应的监控代码。

一些实施方式中,展示模块23,用于当代码块的运行时长大于预设阈值时,展示代码块的运行参数。

根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。

电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如以上实施例中提供的方法。

示例性实施例中,可读存储介质可以是存储有计算机指令的非瞬时计算机可读存储介质,所述计算机指令用于使所述计算机执行根据以上实施例中提供的方法。

示例性实施例中,计算机程序产品包括计算机程序,所述计算机程序在被处理器执行时实现根据以上实施例中提供的方法。

图3示出了可以用来实施本公开的实施例的示例电子设备300的示意性框图。

电子设备旨在表示各种形式的具有计算能力的设备,诸如,个人计算机、膝上型计算机、平板电脑、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。

如图3所示,第一设备300包括计算单元301,其可以根据存储在只读存储器(ROM)302中的计算机程序或者从存储单元308加载到随机访问存储器(RAM)303中的计算机程序,来执行各种适当的动作和处理。在RAM 303中,还可存储设备300操作所需的各种程序和数据。计算单元301、ROM 302以及RAM 303通过总线304彼此相连。输入/输出(I/O)接口305也连接至总线304。

设备300中的多个部件连接至I/O接口305,包括:输入单元306,例如键盘、鼠标等;输出单元307,例如各种类型的显示器、扬声器等;存储单元308,例如磁盘、光盘等;以及通信单元309,例如网卡、调制解调器、无线通信收发机等。通信单元309允许设备300通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。

计算单元301可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元301的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元301执行上文所描述的各个方法和处理,例如页面渲染方法。例如,在一些实施例中,页面渲染方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元305。

在一些实施例中,计算机程序的部分或者全部可以经由ROM 302和/或通信单元309而被载入和/或安装到设备300上。当计算机程序加载到RAM 303并由计算单元301执行时,可以执行上文描述的页面渲染方法的一个或多个步骤。备选地,在其他实施例中,计算单元301可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行代码块监测方法。

本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。

用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。

在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。

为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。

可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。

计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式系统的服务器,或者是结合了区块链的服务器。

应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。

上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

技术分类

06120115933021