一种代码调试方法、装置、电子设备及存储介质
技术领域
本申请涉及计算机数据处理和计算机编程通信的技术领域,具体而言,涉及一种代码调试方法、装置、电子设备及存储介质。
背景技术
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发;Java编程语言的风格十分接近C++语言;Java继承了面向对象技术的核心,舍弃了C++语言中容易引起错误的指针,以引用取代指针;用接口取代C++中的运算符重载和多重继承特性,并增加了垃圾回收器功能。
Java虚拟机(Java Virtual Machine,JVM),是指一种能够运行Java字节码(bytecode)的虚拟机平台;Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统,Java语言可以通过JVM实现平台无关性。
目前,针对JVM中的字节码进行调试大部分都是通过侵入式调试工具调试,这里的侵入式调试是指调试代码需要附加到目标程序,并暂停目标程序的所有线程并访问目标程序的内存、注册表和其他信息,以及直接能够控制目标程序的调试过程;上述的侵入式调试工具例如:BTrace工具和Arthas工具等;若使用BTrace工具对目标设备上的JVM中的字节码进行调试,需要提前写好一些增强程序,使用时动态切入到执行点;若使用Arthas工具对目标设备上的JVM中的字节码进行调试,只能通过命令行动态调试在线程序。
在具体的实践过程中发现,在对目标设备上的JVM中的字节码进行调试时,需要先确定目标设备,并远程登录至目标设备,将侵入式调试工具发送至目标设备,并在目标设备上运行该侵入式调试工具调试,在获得调试结果后,再将调试结果返回至本地的终端设备,在本地的终端设备上对调试结果进行分析。在集群网络中的多个服务器的环境中,若需要对集群网络中的多个服务器上的Java虚拟机中的字节码进行调试,那么就需要反复地登录并发送侵入式调试工具,并返回调试结果;也就是说,使用侵入式调试工具对集群网络中的多个服务器中的Java虚拟机中的字节码进行调试操作繁琐且效率低下。
发明内容
本申请实施例的目的在于提供一种代码调试方法、装置、电子设备及存储介质,用于改善对集群网络中的多个服务器中的Java虚拟机中的字节码进行调试操作繁琐且效率低下的问题。
本申请实施例提供了一种代码调试方法,包括:接收终端设备发送的代码调试请求,代码调试请求包括目标服务器的唯一标识;根据唯一标识从集群网络中的多个服务器中确定目标服务器;使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,获得调试结果;向终端设备发送调试结果。在上述的实现过程中,根据终端设备发送的唯一标识确定目标服务器,并使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,向终端设备发送获得的调试结果;使得终端设备无需知道从集群网络中选择目标服务器的过程,以及通过程序代理对目标服务器上的程序虚拟机中的字节码进行调试的过程,从而极大地简化了对目标服务器上的程序虚拟机中的字节码进行调试的操作,且提高了对目标服务器上的程序虚拟机中的字节码进行调试的效率。
可选地,在本申请实施例中,使用程序代理对目标服务器的程序虚拟机中的字节码,包括:通过程序代理获取目标服务器的程序虚拟机中被调试的第一字节码;通过程序字节码操控框架运行第一字节码,并对第一字节码进行增强处理,获得第二字节码;通过程序代理向目标服务器发送第二字节码,其中,第二字节码被目标服务器执行时,对程序虚拟机中的字节码进行调试并向程序代理返回调试结果;通过程序代理接收目标服务器发送的调试结果。在上述的实现过程中,通过程序代理获取目标服务器的程序虚拟机中的第一字节码,然后使用程序字节码操控框架运行第一字节码,并对第一字节码进行增强处理,获得第二字节码;再通过程序代理向目标服务器发送第二字节码;最后通过程序代理接收目标服务器发送的调试结果;也就是说,使用字节码操作框架对字节码进行增强代替了手动调试过程中对字节码进行增强的过程,从而提高了对字节码进行增强的效率,更好地对目标服务器上的程序虚拟机中的字节码进行调试获得调试结果。
可选地,在本申请实施例中,对第一字节码进行增强处理,获得第二字节码,包括:判断代码调试请求中是否包括自定义代码,自定义代码表征对目标服务器上的程序虚拟机中的字节码进行调试的代码;若是,则使用程序字节码操控框架将自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码。在上述的实现过程中,通过使用程序字节码操控框架将用户自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码;从而使用字节码操作框架对字节码进行增强代替了手动使用工具对字节码进行自定义字节码编译、增强和添加的过程,极大地节约了调试过程中的人力成本,有效地增加了使用自定义代码对字节码进行增强的便捷性。
可选地,在本申请实施例中,在判断代码调试请求中是否包括自定义代码之后,还包括:若代码调试请求中不包括自定义代码,则使用程序字节码操控框架将默认预存的增强字节码添加至第一字节码中的指定位置,获得第二字节码。
可选地,在本申请实施例中,在获得第二字节码之后,还包括:接收终端设备发送的字节码请求;向终端设备发送字节码请求对应的第一字节码和第二字节码。在上述的实现过程中,通过接收终端设备发送的字节码请求;向终端设备发送字节码请求对应的第一字节码和第二字节码;从而使得终端设备无需获知字节码在增强前和增强后的细节,只需要在发送字节码请求后,即可获得与字节码请求对应的增强前的第一字节码和增强后的第二字节码,通过上述方式有效地提高了终端设备获得第一字节码和第二字节码的便捷性。
可选地,在本申请实施例中,调试结果包括:调试日志记录;在获得调试结果之后,还包括:接收终端设备发送的日志查询请求,日志查询请求包括:日志级别;从调试日志记录中获取与日志级别对应的日志记录;向终端设备发送日志级别对应的日志记录。在上述的实现过程中,通过接收终端设备发送的日志查询请求,日志查询请求包括:日志级别;从调试日志记录中获取与日志级别对应的日志记录;向终端设备发送日志级别对应的日志记录;从而使得终端设备无需获知如何获得日志级别对应的日志记录的过程,只需要在发送日志查询请求后,即可获得与日志查询请求对应的日志记录,通过上述方式有效地提高了终端设备获得日志记录的便捷性。
本申请实施例还提供了一种代码调试方法,应用于终端设备,包括:获得服务器信息列表,服务器信息列表包括多个服务器信息;响应于针对服务器信息列表的选择操作,从多个服务器信息中确定出目标服务器信息,并提取目标服务器信息中的唯一标识;根据目标服务器信息中的唯一标识生成代码调试请求;向电子设备发送代码调试请求,代码调试请求用于使电子设备根据唯一标识对目标服务器上的程序虚拟机中的字节码进行调试。在上述的实现过程中,终端设备根据目标服务器信息中的唯一标识生成并发送代码调试请求,使得终端设备无需知道对字节码进行调试的过程,即可完成对字节码进行调试,提高了对目标服务器上的程序虚拟机中的字节码进行调试的效率。
本申请实施例还提供了一种代码调试装置,包括:调试请求接收模块,用于接收终端设备发送的代码调试请求,代码调试请求包括目标服务器的唯一标识;目标设备确定模块,用于根据唯一标识从集群网络中的多个服务器中确定目标服务器;调试结果获得模块,用于使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,获得调试结果;调试结果发送模块,用于向终端设备发送调试结果。
可选地,在本申请实施例中,调试结果获得模块,包括:第一字节码获取模块,通过程序代理获取目标服务器的程序虚拟机中被调试的第一字节码;第二字节码获得模块,通过程序字节码操控框架运行第一字节码,并对第一字节码进行增强处理,获得第二字节码;第二字节码发送模块,通过程序代理向目标服务器发送第二字节码,其中,第二字节码被目标服务器执行时,对程序虚拟机中的字节码进行调试并向程序代理返回调试结果;调试结果接收模块,用于通过程序代理接收目标服务器发送的调试结果。
可选地,在本申请实施例中,第二字节码获得模块,包括:调试请求判断模块,用于判断代码调试请求中是否包括自定义代码,自定义代码表征对目标服务器上的程序虚拟机中的字节码进行调试的代码;自定义码增强模块,用于若代码调试请求中包括自定义代码,则使用程序字节码操控框架将自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码。
可选地,在本申请实施例中,第二字节码获得模块,还包括:默认代码增强模块,用于若代码调试请求中不包括自定义代码,则使用程序字节码操控框架将默认预存的增强字节码添加至第一字节码中的指定位置,获得第二字节码。
可选地,在本申请实施例中,调试结果获得模块,还包括:字节码请求接收模块,用于接收终端设备发送的字节码请求;字节码发送模块,用于向终端设备发送字节码请求对应的第一字节码和第二字节码。
可选地,在本申请实施例中,调试结果包括:调试日志记录;代码调试装置,还包括:查询请求接收模块,用于接收终端设备发送的日志查询请求,日志查询请求包括:日志级别;日志记录获取模块,用于从调试日志记录中获取与日志级别对应的日志记录;日志记录发送模块,用于向终端设备发送日志级别对应的日志记录。
本申请实施例还提供了一种电子设备,包括:处理器和存储器,存储器存储有处理器可执行的机器可读指令,机器可读指令被处理器执行时执行如上面描述的方法。
本申请实施例还提供了一种存储介质,该存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如上面描述的方法。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出的本申请实施例提供的代码调试方法的其中一种应用场景示意图;
图2示出的本申请实施例提供的代码调试方法的流程示意图;
图3示出的本申请实施例提供的代码调试装置的结构示意图;
图4示出的本申请实施例提供的电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整的描述。
在介绍本申请实施例提供的代码调试方法之前,先介绍本申请实施例中涉及的一些概念:
调试工具(Debugger),又被称为调试程序或调试器,是指一种用于调试其它程序的计算机程序工具;这里的调试工具能够让代码在指令组模拟器中可以检查运行状况以及选择性地运行,以便排错、调试。
计算机集群(computer cluster),又被简称为集群,是指一组松散或紧密连接在一起工作的计算机;由于这些计算机协同工作,在许多方面它们可以被视为单个系统;计算机集群与网格计算机不同,计算机集群将每个节点设置为执行相同的任务,由软件控制和调度。
集群网络,是指计算机集群的内部设备之间相互通信的网络设备以及连接的网络,这里的集群网络可以是处于广域网(例如互联网)或局域网的网络;这里的集群网络中运行有至少一个电子设备,这里的电子设备包括:终端设备、服务器和网络设备。
代码调试,是指使用调试工具对程序虚拟机中的字节码进行调试,此处的调试工具又被称为调试器,典型的调试器通常能够在程序运行时拥有以下这些功能,例如单步运行(single-stepping)、利用中断点(breakpoint)使程序遇到各种事件(event)时停止(breaking)(一般用于使程序停止在想要检查的状态)、以及追踪某些变量的变化。有些调试器也有能力在想要调试的程序在运行状态时,去改变调试器的状态。
需要说明的是,本申请实施例提供的代码调试方法可以被电子设备执行,这里的电子设备是指具有执行计算机程序功能的设备终端或者服务器,设备终端例如:智能手机、个人电脑(personal computer,PC)、平板电脑、个人数字助理(personal digitalassistant,PDA)、移动上网设备(mobile Internet device,MID)、网络交换机或网络路由器等。
请参见图1示出的本申请实施例提供的代码调试方法的其中一种应用场景示意图;该应用场景中的设备包括:集群网络中的服务器、集群网络的出口路由器,互联网、电子设备和两个终端设备;其中,集群网络中的服务器可以通过内部网络进行通信,集群网络中的服务器均与路由器可以相互通信,路由器可以分别与电子设备、互联网和与路由器直接相连的终端设备相互通信,此外,路由器还可以通过互联网与直接与互联网相连的终端设备通信;终端设备可以直接访问执行代码调试方法的电子设备,或者通过互联网使用命令行接口或者图形用户界面(Graphical User Interface,GUI)的方式访问该电子设备,并在该电子设备上完成代码调试任务。此处的电子设备可以理解为代码调试的代理服务器,接收终端设备的调试请求,并执行调试请求对应的代码调试动作,电子设备与终端设备的通信方式可以是浏览器和服务端(Browser/Server,B/S)方式,也可以是客户端和服务器(Client/Server,C/S)的方式,具体可以根据需要设置。
在介绍本申请实施例提供的代码调试方法之前,先介绍该代码调试方法适用的应用场景,这里的应用场景包括但不限于:该代码调试方法运行于电子设备上,使用该代码调试方法对集群网络中的服务器上的虚拟机运行的程序字节码进行调试,并获得调试结果,这里的调试结果包括但不限于:调试日志记录、替换前后的代码或者替换前后的字节码等,这里的集群网络可以是局域网,也可以是对广域网开放的网络,即上述的集群网络中的服务器即可以通过局域网访问,也可以通过广域网(例如互联网)访问;也就是说,终端设备可以通过局域网络访问运行代码调试方法的电子设备,并对集群网络中的服务器上的程序虚拟机中的字节码进行调试;也可以通过互联网访问运行代码调试方法的电子设备,并对集群网络中的服务器上的程序虚拟机中的字节码进行调试。
该代码调试方法的主要思路是,电子设备接收终端设备发送的调试请求,该调试请求包括目标服务器的唯一标识,电子设备根据该唯一标识确定目标服务器,并使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,获得调试结果,电子设备向终端设备发送获得的调试结果。在该方法中,终端设备无需知道从集群网络中选择目标服务器的过程,以及通过程序代理对目标服务器上的程序虚拟机中的字节码进行调试的过程,极大地简化了对目标服务器上的程序虚拟机中的字节码进行调试的操作,且提高了对目标服务器上的程序虚拟机中的字节码进行调试的效率。
下面先介绍终端设备生成及发送调试请求的过程,包括如下步骤:
步骤S101:终端设备获得服务器信息列表,服务器信息列表包括多个服务器信息。
上述步骤S101中的终端设备获得服务器信息列表的实施方式包括:
第一种实施方式,从电子设备获取服务器信息列表,具体例如:调试用户在终端设备上打开浏览器,并在浏览器的地址栏处输入电子设备的域名或者IP地址,调试用户通过终端设备向电子设备发送列表请求,该列表请求用于查看集群网络中的服务器信息列表,以便于从服务器信息列表里找到目标服务器;电子设备接收终端设备发送的列表请求,并向终端设备发送预先存储的服务器信息列表;终端设备接收电子设备的服务器信息列表。
第二种实施方式,从本地缓存中获取服务器信息列表,具体例如:在第一次从电子设备获取服务器信息列表之后,便将服务器信息列表存储于本地缓存中,在第二次需要获取服务器信息列表时,若本地缓存中的服务器信息列表没有失效,便可以从本地缓存中获取服务器信息列表;此处的本地缓存可以是浏览器的本地缓存机制,例如:cookie和storage等机制,也可以是内存数据库或者叫缓存数据库,例如:Memcached和Redis等。
步骤S102:终端设备响应于针对服务器信息列表的选择操作,从多个服务器信息中确定出目标服务器信息,并提取目标服务器信息中的唯一标识。
上述步骤S102的实施方式例如:调试用户在终端设备上从呈现多个服务器信息的下拉列表中选择出目标服务器信息,或者从多个呈现服务器信息的单选框中选择出目标服务器信息,终端设备响应于针对服务器信息列表的选择操作,从多个服务器信息中确定出用户选择的目标服务器信息,并提取出该目标服务器信息对应的唯一标识,这里的唯一标识例如可以是server1。
步骤S103:终端设备根据目标服务器信息中的唯一标识生成代码调试请求。
上述步骤S103的实施方式例如:终端设备根据目标服务器信息中的唯一标识server1生成代码调试请求,这里的代码调试请求可以是超文本传输协议(Hyper TextTransfer Protocol,HTTP)中的GET请求或者POST请求。
步骤S104:终端设备向电子设备发送代码调试请求。
上述步骤S104的实施方式例如:终端设备使用浏览器通过HTTP协议向电子设备发送代码调试请求。在上述的实现过程中,终端设备从多个服务器信息中确定出目标服务器信息,并根据目标服务器信息中的唯一标识生成并发送代码调试请求,使得终端设备无需知道从集群网络中选择目标服务器和对字节码进行调试的过程,即可完成对字节码进行调试,提高了对目标服务器上的程序虚拟机中的字节码进行调试的效率。
请参见图2示出的本申请实施例提供的代码调试方法的流程示意图;上述的电子设备可以接收终端设备发送的代码调试请求,并根据该代码调试请求对目标服务器上的程序虚拟机中的字节码进行调试,即上述的运行于电子设备中的代码调试方法可以包括如下步骤:
步骤S110:电子设备接收终端设备发送的代码调试请求,代码调试请求包括目标服务器的唯一标识。
代码调试请求,是指请求对目标服务器上的程序虚拟机中的字节码进行调试的请求,该代码调试请求用于对集群网络中的服务器上的程序虚拟机中的字节码进行调试,这里的代码调试请求可以包括:自定义代码和目标服务器的唯一标识等等,其中,此处的自定义代码将在下面进行详细地说明,这里的目标服务器的唯一标识是指目标服务器在集群网络中的唯一标识,此处的唯一标识的选择有很多种,可以作为服务器的唯一标识的包括:IP地址、MAC地址、服务器名称和自定义标识等。
上述步骤S110的实施方式例如:电子设备在接收到终端设备发送的代码调试请求之后,对代码调试请求按照约定格式进行解析,即可获得目标服务器的唯一标识;此处的约定格式包括但不限于:脚本对象简谱(JavaScript Object Notation,JSON)格式和可扩展标记语言(eXtensible Markup Language,XML)格式。在具体的实践过程中,在终端设备向电子设备发送列表请求之前,还可以使用Spring框架、Vue和ElementUI等技术在电子设备搭建应用于集群环境下的代码调试系统。
在步骤S110之后,执行步骤S120:电子设备根据唯一标识从集群网络中的多个服务器中确定目标服务器。
上述步骤S120的实施方式例如:假设将服务器的IP地址作为唯一标识,那么电子设备可以根据目标服务器的IP地址从集群网络中的多个服务器中确定目标服务器,电子设备直接根据IP地址与目标服务器通过传输控制协议(Transmission Control Protocol,TCP)或者用户数据报协议(User Datagram Protocol,UDP)建立连接通信。
在步骤S120之后,执行步骤S130:电子设备使用程序代理对目标服务器上的程序虚拟机中的字节码进行调试,获得调试结果。
程序虚拟机,是指运行于目标服务器上的程序虚拟机,这里的程序虚拟机可以是JVM,即Java虚拟机,可以理解的是,这里的Java虚拟机运行于目标服务器上,当然,也可以是在集群网络中的所有服务器均运行有Java虚拟机,那么在对集群网络中的服务器上的程序虚拟机中的字节码进行调试时,就可以将集群网络中的任一服务器作为目标服务器。
程序代理,是一种可以与程序虚拟机进行通信的组件库,具体例如:这里的程序代理可以是Java Agent,可以通过Java Agent与Java虚拟机进行通信,并使用Java Agent协助完成对Java虚拟机中的字节码的调试过程;这里的Java Agent也可以写作JavaAgent,这里的JavaAgent是在Java虚拟机启动之时加载的,这里的JavaAgent是在虚拟机初始化的早期时候加载的,即可以理解为在Java虚拟机启动的时候加载的。
使用上述的程序代理Java Agent的方式对目标设备上的程序虚拟机中的字节码进行调试,这种调试方式是一种非侵入式调试方式,可以将这种调试方式理解为,在对目标设备上的程序虚拟机中的字节码进行调试的过程中,不需要暂停目标程序的线程,且无需直接控制目标程序的调试过程,仅通过将需要调试的字节码附加至程序虚拟机中的程序字节码,或者替换程序虚拟机中的程序字节码或者部分程序字节码即可完成调试过程,从而简化了调试操作,并提高了调试操作的效率。
调试结果,是指目标服务器上的程序虚拟机中的字节码进行调试获得的结果,这里的调试结果可以包括但不限于:调试日志记录、替换前的代码、替换后的代码、替换前的字节码或者替换后的字节码等。
在具体的实践过程中,终端设备还可以查看到目标服务器的JVM所有加载的Java类信息,这里的Java类信息以类所在Java包的形式进行可视化展示,终端设备还可以通过Java类名称、Java包名称进行模糊搜索或者精确搜索;终端设备还可以获取目标服务器上的类目录和类信息,获取目标服务器上的类目录和类信息的过程例如:执行JPS命令获取到JVM中的Java进程号,再使用dump有关命令获取目标服务器上的类目录和类信息。上述步骤S130中的使用程序代理对目标服务器上的程序虚拟机中的字节码进行调试的实施方式可以包括如下步骤:
步骤S131:电子设备通过程序代理获取目标服务器的程序虚拟机中的第一字节码。
第一字节码,是指在对目标服务器上的程序虚拟机中的程序字节码进行调试过程中,使用自定义代码或者默认代码对应的增强字节码替换之前或者添加之前的字节码,即第一字节码表征被调试的目标字节码。
上述步骤S131的实施方式例如:通过电子设备上运行的JavaAgent与目标服务器上运行于程序虚拟机中的JavaAgent进行通信,以使JavaAgent获取并返回目标服务器的程序虚拟机中的第一字节码,使用程序代理接收目标服务器上运行于程序虚拟机中的JavaAgent发送的第一字节码。
步骤S132:电子设备通过程序字节码操控框架运行第一字节码,并对第一字节码进行增强处理,获得第二字节码。
第二字节码,是指在对目标服务器的程序虚拟机中的程序字节码进行调试过程中,使用自定义代码或者默认代码对应的增强字节码替换之后或者添加之后的字节码。
程序字节码操控框架,是指使用程序对字节码进行操纵的框架,例如:ASM是一种对Java字节码进行操作的操控框架,ASM提供一些常见的字节码转换和分析算法,从中可以构建定制的复杂转换和代码分析工具。
上述步骤S132中的通过程序字节码操控框架运行第一字节码的实施方式例如:通过ASM字节码操控框架运行从目标服务器的Java虚拟机中获取的第一字节码;这里的ASM可以被用来动态地生成类(class)或者增强既有类(class)的功能。ASM可以直接产生二进制类(class)文件,也可以在类(class)被加载入Java虚拟机之前动态改变类(class)的行为。在上述的实现过程中,通过使用程序字节码操控框架将用户自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码;从而使用字节码操作框架对字节码进行增强代替了手动使用工具对字节码进行自定义字节码编译、增强和添加的过程,极大地节约了调试过程中的人力成本,有效地增加了使用自定义代码对字节码进行增强的便捷性。
在具体的实践过程中,还可以使用电子设备对上述的增强字节码、第一字节码和第二字节码进行反编译,获得增强代码、第一代码和第二代码;也可以将上述的增强字节码、第一字节码和第二字节码存储至数据库中,也可以将获得的增强代码、第一代码和第二代码存储至数据库中,以便于终端设备请求查询或者搜索电子设备中的数据库中的字节码或者代码。
上述步骤S132中的对第一字节码进行增强处理的实施方式可以包括:使用ASM字节码操控框架判断代码调试请求中是否包括自定义代码;这里的自定义代码可以是指在对目标服务器上的程序虚拟机中的字节码进行调试的过程中,用户自定义的对类(class)的功能进行增强的代码。若代码调试请求中包括自定义代码,则使用ASM字节码操控框架将自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码。若代码调试请求中不包括自定义代码,则使用程序字节码操控框架将默认预存的增强字节码添加至第一字节码中的指定位置,获得第二字节码。
在具体的实践过程中,上述的增强字节码、第一字节码和第二字节码也可以使用JavaAssist或者面向切面编程(Aspect-Oriented Programming,AOP)来分析、编辑和创建Java字节码,这里的JavaAssist是一个开源的分析、编辑和创建Java字节码的类库。
步骤S133:电子设备通过程序代理向目标服务器发送第二字节码,以使目标服务器运行第二字节码并对程序虚拟机中的字节码进行调试和返回调试结果。
上述步骤S133的实施方式例如:电子设备通过JavaAgent向目标服务器发送第二字节码,以使目标服务器运行第二字节码并对程序虚拟机中的字节码进行调试和返回调试结果,这里的调试结果可以包括但不限于:调试日志记录、替换前的代码、替换后的代码、替换前的字节码或者替换后的字节码等。在具体的实践过程中,可以将调试结果存储数据库(DataBase,DB),这里的数据库这里的包括:内存数据库、关系型数据库或非关系型数据库等。
步骤S134:电子设备通过程序代理接收目标服务器发送的调试结果。
上述步骤S134的实施方式例如:电子设备通过JavaAgent接收目标服务器发送的调试日志记录、替换前的代码、替换后的代码、替换前的字节码或者替换后的字节码等。在具体的实践过程中,还可以周期性进行代码调试,即开启定时调试任务,将调试过程中的调试记录或者调试后的调试结果存储至数据库中,具体例如:设置周期性任务的终止条件,连续监视10小时后恢复增强类信息;电子设备在接收到终端设备提交的周期性调试任务之后,还可以定期地触发该周期性调试任务执行,获得该周期性调试任务对应的调试结果,并将周期性调试任务对应的调试结果存储至数据库中,然后定期地将调试结果主动通过邮件、短信等方式发送给终端设备,使得终端设备获得周期性调试任务的调试结果。
可选地,在本申请实施例中,在步骤S131中的获得第一字节码和步骤S132中的获得第二字节码之后,还可以包括:
步骤S135:电子设备接收终端设备发送的字节码请求。
上述步骤S135的实施方式例如:电子设备通过HTTP协议和超文本传输安全协议(Hyper Text Transfer Protocol Secure,HTTPS)接收终端设备发送的字节码请求。
步骤S136:电子设备向终端设备发送字节码请求对应的第一字节码和第二字节码。
上述步骤S136的实施方式例如:电子设备通过超文本传输协议和超文本传输安全协议向终端设备发送字节码请求对应的第一字节码和第二字节码;其中,第一字节码是使用自定义代码或者默认代码对应的增强字节码替换之前或者添加之前的字节码,第二字节码是使用自定义代码或者默认代码对应的增强字节码替换之后或者添加之后的字节码。在上述的实现过程中,通过接收终端设备发送的字节码请求;向终端设备发送字节码请求对应的第一字节码和第二字节码;从而使得终端设备无需获知字节码在增强前和增强后的细节,只需要在发送字节码请求后,即可获得与字节码请求对应的增强前的第一字节码和增强后的第二字节码,通过上述方式有效地提高了终端设备获得第一字节码和第二字节码的便捷性。
可选的,在具体的实践过程中,上述的电子设备支持后台周期性调试和在线直接调试两种方式:
第一种后台周期性调试的方式,在极少数情况下会出现一些偶发性问题或者周期性问题需要调试,此种问题通常需要观察较长时间后方能复现,那么用户只需通过终端设备向电子设备提交周期性调试任务即可,电子设备可以定期触发调试任务并将调试结果保存记录,用户可以通过另一个终端设备查看调试结果,当然,用户在一段时间后,也可以通过同一个终端设备查询调试结果,用户也可以通过不同于上述终端设备的设备查询调试结果;也可以由电子设备主动在获得调试结果之后,或者主动定期地将调试结果通过邮件、短信等方式发送给用户的终端设备。
第二种在线直接调试的方式,在线直接调试适用于绝大数情况,即在实时调试的情况下,需要在终端设备上立即看到调试结果,也可以直接向发送代码调试请求的终端设备返回调试结果,具体例如:开发者想查看线上某个方法的调用时长、查看某个线程的调用栈等,那么在步骤S130之后,即在获得调试结果之后,可以执行如下步骤:
步骤S140:电子设备向终端设备发送调试结果。
在一些实施方式中,电子设备在获得调试结果后,可以主动向终端设备发送调试结果。
在另一些实施例中,电子设备根据终端设备的请求向其发送调试结果。例如,电子设备接收终端设备发送的日志查询请求,该日志查询请求包括日志级别。电子设备从调试日志记录中获取与日志级别对应的日志记录,向终端设备发送日志级别对应的日志记录。
在上述的实现过程中,通过接收终端设备发送的日志查询请求,日志查询请求包括:日志级别;从调试日志记录中获取与日志级别对应的日志记录;向终端设备发送日志级别对应的日志记录;从而使得终端设备无需获知如何获得日志级别对应的日志记录的过程,只需要在发送日志查询请求后,即可获得与日志查询请求对应的日志记录,通过上述方式有效地提高了终端设备获得日志记录的便捷性。
上述的电子设备可以采用统一的接口或者JavaWeb代码调试系统的web前端代码(front-end code)页面,与终端设备进行交互通信,并使用无侵入式调试的方式对集群网络中的目标服务器的Java虚拟机中的字节码进行调试,从而有效地简化了终端设备对集群网络中的目标服务器的Java虚拟机中的字节码进行调试的过程,使得用户可以通过web页面与电子设备交互的方式完成对集群网络中的目标服务器的Java虚拟机中的字节码进行调试的过程,这里的无侵入式调试是指调试代码不需要附加到目标程序,无需暂停目标程序的所有线程,也无需访问目标程序的内存、注册表和其他信息的调试方式;这里的前端代码是指运行于服务器向终端设备发送的且运行于终端设备上的代码,这里的前端代码通常被终端设备的浏览器所执行,这里的前端代码例如:超文本标记语言(HyperText MarkupLanguage,HTML)代码、JavaScript脚本语言和层叠样式表(Cascading Style Sheets,CSS)代码等等。
在上述的实现过程中,根据终端设备发送的目标服务器的唯一标识确定目标服务器,并使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,向终端设备发送获得的调试结果;使得终端设备无需知道从集群网络中选择目标服务器的过程,以及通过程序代理对目标服务器上的程序虚拟机中的字节码进行调试的详细过程,换句话说,终端设备无需知道调试的细节,只需要发送代码调试请求和接收调试结果,从而极大地简化了对目标服务器上的程序虚拟机中的字节码进行调试的操作,且提高了对目标服务器上的程序虚拟机中的字节码进行调试的效率。
请参见图3示出的本申请实施例提供的代码调试装置的结构示意图;本申请实施例提供了一种代码调试装置200,包括:
调试请求接收模块210,用于接收终端设备发送的代码调试请求,代码调试请求包括目标服务器的唯一标识。
目标设备确定模块220,用于根据唯一标识从集群网络中的多个服务器中确定目标服务器。
调试结果获得模块230,用于使用程序代理对目标服务器的程序虚拟机中的字节码进行调试,获得调试结果。
可选地,在本申请实施例中,调试结果获得模块,包括:
第一字节码获取模块,通过程序代理获取目标服务器的程序虚拟机中被调试的第一字节码。
第二字节码获得模块,通过程序字节码操控框架运行第一字节码,并对第一字节码进行增强处理,获得第二字节码。
第二字节码发送模块,通过程序代理向目标服务器发送第二字节码,其中,第二字节码被目标服务器执行时,对程序虚拟机中的字节码进行调试并向程序代理返回调试结果。
调试结果接收模块,用于通过程序代理接收目标服务器发送的调试结果。
可选地,在本申请实施例中,第二字节码获得模块,包括:
调试请求判断模块,用于判断代码调试请求中是否包括自定义代码,自定义代码表征对目标服务器上的程序虚拟机中的字节码进行调试的代码。
自定义码增强模块,用于若代码调试请求中包括自定义代码,则使用程序字节码操控框架将自定义代码编译为增强字节码,并将增强字节码添加至第一字节码中的指定位置,获得第二字节码。
可选地,在本申请实施例中,第二字节码获得模块,还包括:
默认代码增强模块,用于若代码调试请求中不包括自定义代码,则使用程序字节码操控框架将默认预存的增强字节码添加至第一字节码中的指定位置,获得第二字节码。
可选地,在本申请实施例中,调试结果获得模块,还包括:
字节码请求接收模块,用于接收终端设备发送的字节码请求。
字节码发送模块,用于向终端设备发送字节码请求对应的第一字节码和第二字节码。
可选地,在本申请实施例中,调试结果包括:调试日志记录;代码调试装置,还可以包括:
查询请求接收模块,用于接收终端设备发送的日志查询请求,日志查询请求包括:日志级别。
日志记录获取模块,用于从调试日志记录中获取与日志级别对应的日志记录。
日志记录发送模块,用于向终端设备发送日志级别对应的日志记录。
应理解的是,该装置与上述的代码调试方法实施例对应,能够执行上述方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。该装置包括至少一个能以软件或固件(firmware)的形式存储于存储器中或固化在装置的操作系统(operating system,OS)中的软件功能模块。
请参见图4示出的本申请实施例提供的电子设备的结构示意图。本申请实施例提供的一种电子设备400,包括:处理器410和存储器420,存储器420存储有处理器410可执行的机器可读指令,机器可读指令被处理器410执行时执行如上的方法。
本申请实施例还提供了一种存储介质430,该存储介质430上存储有计算机程序,该计算机程序被处理器410运行时执行如上的方法。
其中,存储介质430可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(Static Random Access Memory,简称SRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,简称EEPROM),可擦除可编程只读存储器(Erasable Programmable Read Only Memory,简称EPROM),可编程只读存储器(Programmable Red-Only Memory,简称PROM),只读存储器(Read-Only Memory,简称ROM),磁存储器,快闪存储器,磁盘或光盘。
本申请实施例提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其他的方式实现。以上所描述的装置实施例仅是示意性的,例如,附图中的流程图和框图显示了根据本申请实施例的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以和附图中所标注的发生顺序不同。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这主要根据所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以使用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请实施例中的各个实施例的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
以上的描述,仅为本申请实施例的可选实施方式,但本申请实施例的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请实施例揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请实施例的保护范围之内。