CN109344065B - 远程调试方法、调试服务器及目标机 - Google Patents

远程调试方法、调试服务器及目标机 Download PDF

Info

Publication number
CN109344065B
CN109344065B CN201811132355.0A CN201811132355A CN109344065B CN 109344065 B CN109344065 B CN 109344065B CN 201811132355 A CN201811132355 A CN 201811132355A CN 109344065 B CN109344065 B CN 109344065B
Authority
CN
China
Prior art keywords
debugging
target program
target
program
source code
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.)
Active
Application number
CN201811132355.0A
Other languages
English (en)
Other versions
CN109344065A (zh
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.)
Maipu Communication Technology Co Ltd
Original Assignee
Maipu Communication Technology 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 Maipu Communication Technology Co Ltd filed Critical Maipu Communication Technology Co Ltd
Priority to CN201811132355.0A priority Critical patent/CN109344065B/zh
Publication of CN109344065A publication Critical patent/CN109344065A/zh
Application granted granted Critical
Publication of CN109344065B publication Critical patent/CN109344065B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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

Abstract

本发明涉及远程调试技术领域,提供一种远程调试方法、调试服务器及目标机。该方法包括:获取目标程序的注册信息;在接收到针对目标程序的调试请求指令后,根据注册信息中的源码路径清单从源码服务器上下载目标程序的源代码;以注册信息中的目标机地址以及调试服务端口为参数调用调试器,在调试器与目标程序之间建立用于在调试过程中传输数据的调试通道;在接收到针对目标程序的调试指令后,将调试指令发送至调试器执行调试,通过调试器获得调试结果。在该方法中,调试开始前的配置工作由调试服务器自动完成,显著提高了调试效率,避免了人为因素导致的错误,实现了对不同的目标程序共享调试资源。

Description

远程调试方法、调试服务器及目标机
技术领域
本发明涉及远程调试技术领域,具体而言,涉及一种远程调试方法、调试服务器及目标机。
背景技术
在软件测试过程中,会产生各种各样的错误或异常,对于一些简单的问题,通常可以通过标准输出,日志等信息进行分析和定位问题。然而遇到一些复杂问题时,可能需要知道某个对象的数据,线程的执行情况等,这时就需要用到远程调试技术,进行在线实时调试。
然而,在现有技术中,每次调试前都需要人工搭建调试环境、下载源代码并配置调试参数,其过程十分繁琐,导致调试效率低下并且易发生人为错误。
发明内容
有鉴于此,本发明实施例提供一种远程调试方法、调试服务器及目标机,以改善调试过程中的问题。
为实现上述目的,本发明提供如下技术方案:
第一方面,本发明实施例提供一种远程调试方法,应用于调试服务器,包括:
获取目标程序的注册信息,注册信息包括目标程序所在的目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
在接收到针对目标程序的调试请求指令后,根据源码路径清单从源码服务器上下载目标程序的源代码;
以目标机地址以及调试服务端口为参数调用调试器,在调试器与目标程序之间建立用于在调试过程中传输数据的调试通道;
在接收到针对目标程序的调试指令后,将调试指令发送至调试器执行调试,通过调试器获得调试结果。
在采用上述方法进行远程调试时,调试服务器会首先获取目标程序的注册信息,然后自动根据注册信息下载相应的源代码以及建立调试器与目标程序之间的调试通道,并在接收到相应的指令后,将调试指令发送给调试器进行交互式调试,在调试过程中,上述调试通道起到数据传输的作用。
上面的调试过程对用户来说非常简单,特别是在调试之前无需再去自行搭建调试环境、下载源代码以及配置调试参数,这些工作全都可以交给调试服务器自动完成,从而显著提高了调试效率,避免了配置过程中人为因素导致的错误,降低了对调试人员技术水平的要求。
此外,上述方法是一种集中式调试服务,即对所有的目标程序的调试都是通过调试服务器进行调试的,用户只需要访问调试服务器即可使用该服务,不同的调试人员无需部署不同的调试系统,从而有效共享了调试资源,提高了资源的利用率。
在一个可能的设计中,获取目标程序的注册信息,包括:
接收目标机上的注册程序在目标程序启动时发送的注册请求,并将注册请求中包含的目标机地址、调试服务端口以及源码路径清单作为注册信息保存。
调试服务器上保存的目标程序的注册信息可以由目标机上的注册程序在目标程序启动时主动提交至调试服务器进行注册,从而调试服务器可以获知哪些目标程序已经启动并处于可以调试的状态。
在一个可能的设计中,方法还包括:
接收目标机上的保活程序在目标程序的运行过程中定期发送的表示目标程序仍在运行的保活报文,并在注册信息中保存保活报文的接收时间;
定期扫描注册信息,并在判断接收时间距离当前时间超过预设时长时,删除注册信息。
一旦目标程序因某些原因异常离线,上述保活机制可以确保调试服务器及时清理掉相应的注册信息,使得注册信息与实际可调试的目标程序一致。
在一个可能的设计中,调试指令包括设置断点、单步调试、观察执行结果以及继续执行的中的至少一种指令。
上述为目前常见的一些调试指令,这些调试指令在本发明实施例提供的调试方法中全部得到支持。
第二方面,本发明实施例提供一种远程调试方法,应用于目标机,包括:
在目标程序启动时,执行注册程序,获得目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
以目标机地址、调试服务端口以及源码路径清单为参数调用调试服务器的接口,在调试服务器上注册目标程序。
在一个可能的设计中,在以目标机地址、调试服务端口以及源码路径清单为参数调用调试服务器的接口之后,方法还包括:
在目标程序运行过程中,执行保活程序,定期向调试服务器发送表示目标程序仍在运行的保活报文。
在一个可能的设计中,调试服务端口以及源码路径清单在构建目标程序时被配置好并随目标程序发布至目标机,注册程序以及保活程序在构建目标程序时被构建好并随目标程序发布至目标机。
上述配置参数在目标程序的构建阶段就由开发人员配置好,在后续过程中,用户无需配置这些参数,对用户的技术门槛要求较低。同时,注册程序以及保活程序也由开发人员在目标程序的构建阶段就构建好并随目标程序发布,完成注册及保活只需调度其执行即可。
第三方面,本发明实施例提供一种调试服务器,包括:
注册接口模块,用于获取目标程序的信息注册,注册信息包括目标程序所在的目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
指令接收模块,用于接收到针对目标程序的调试请求指令以及调试指令;
源码下载模块,用于在指令接收模块接收到调试请求指令后,根据源码路径清单从源码服务器上下载目标程序的源代码;
通道建立模块,用于以目标机地址以及调试服务端口为参数调用调试器,在调试器与目标程序之间建立用于在调试过程中传输数据的调试通道;
调试模块,用于在指令接收模块接收到调试指令后,将调试指令发送至调试器执行调试,通过调试器获得调试结果。
在一个可能的设计中,调试服务器还包括:注册接口模块具体用于,接收目标机上的注册程序在目标程序启动时发送的注册请求,并将注册请求中包含的目标机地址、调试服务端口以及源码路径清单作为注册信息保存。
在一个可能的设计中,调试服务器还包括:保活管理模块,保活管理模块用于接收目标机上的保活程序在目标程序的运行过程中定期发送的表示目标程序仍在运行的保活报文,并在注册信息中保存保活报文的接收时间,以及定期扫描注册信息,并在判断接收时间距离当前时间超过预设时长时,删除注册信息。
第四方面,本发明实施例提供一种目标机,包括:
信息获取模块,用于在目标程序启动时,执行注册程序,获得目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
注册模块,用于以目标机地址、调试服务端口以及源码路径清单为参数调用调试服务器的接口,在调试服务器上注册目标程序。
在一个可能的设计中,目标机还包括:保活模块,保活模块用于在目标程序运行过程中,执行保活程序,定期向调试服务器发送表示目标程序仍在运行的保活报文。
第五方面,本发明实施例提供一种计算机存储介质,计算机存储介质中存储有计算机程序指令,计算机程序指令被计算机的处理器读取并运行时,执行本发明实施例提供的方法的步骤。
第六方面,本发明实施例提供一种电子设备,包括处理器以及计算机存储介质,计算机存储介质中存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行本发明实施例提供的方法的步骤。
为使本发明的上述目的、技术方案和有益效果能更明显易懂,下文特举实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出采用eclipse进行远程调试的流程图;
图2示出了本发明实施例提供的远程调试方法的系统架构图;
图3示出了本发明实施例提供的远程调试方法的流程图;
图4示出了调试通道建立过程的时序图;
图5示出了用户界面、jdb以及调试代理的关系图;
图6示出了交互式调试的时序图;
图7示出了注册保活的时序图。
具体实施方式
目前,对于采用不同的计算机程序语言编写的目标程序,其远程调试的方式是类似的。以Java语言为例,Java提供了Java平台调试体系结构(Java Platform DebuggerArchitecture,简称JPDA)用于对Java程序的调试提供技术上的支持。为了使用JPDA提供的远程调试,通常的做法是,利用eclipse等开发调试工具进行远程调试,这类工具是基于JPDA实现的。
图1示出采用eclipse进行远程调试的流程图。参照图1,目前的远程调试流程主要包括以下步骤:
1.配置Java程序(目标程序)的启动参数,增加调试参数配置,比如调试服务端口、传输协议等,启动Java程序。
2.安装eclipse开发环境。
3.下载Java程序对应的源代码。
4.配置eclipse调试参数,采用socket attach方式,指定Java程序所在的目标机的地址和使用的调试服务端口,建立调试通道。
5.开始调试。
发明人在长期研究实践中发现,上述流程至少存在如下问题:
第一,需要搭建eclipse开发环境,如果是在软件开发过程中,一般eclipse已经安装,问题不大,但在现场排查问题时,现场往往没有安装eclipse,必须临时安装,费时费力。
第二,需要下载Java程序对应的源代码,这个源代码要求Java编译时的源代码完全一致,否则调试会不准确。而源代码通常是不断迭代更新的,还可能有若干分支,这就要求必须事先维护一个Java程序版本与源代码的对应关系表,根据该关系表来查找对应的源码路径,这个过程都需要人为的完成,容易出现错误,而且给调试带来不便。并且找到源代码后,可能还需要运行专用的版本管理工具(如svn)将源代码下载到本地,增加调试前的准备工作。
第三,需要配置Java的启动参数和调试参数,这些参数通常并不太容易记住,这就需要调试人员对参数的配置以及eclipse调试功能的使用比较熟悉,提高了调试人员的技术门槛。并且,即使是专业的开发人员,在配置上述参数时,也有可能因人为因素导致参数配置错误,影响调试进度。
第四,不同的调试人员在进行调试时,可能会搭建供自己使用的调试环境,尽管这些调试环境的作用都是相同的。这无疑是对调试资源的重大浪费。
现有技术中存在的上述缺陷,是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本发明实施例针对上述问题所提出的解决方案,都应该是发明人在本发明过程中对本发明做出的贡献。
下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
同时,在本发明的描述中,术语“第一”、“第二”等仅用于将一个实体或者操作与另一个实体或操作区分开来,而不能理解为指示或暗示相对重要性,也不能理解为要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
为便于阐述,后文中的例子都是基于Java语言的,但显然的,本发明实施例提供的远程调试方法并不限于调试Java程序,对其他计算机程序语言编写的程序,例如C/C++程序,同样可以适用,因此后文中的例子不应当理解为对本发明保护范围的限制。
图2示出了本发明实施例提供的远程调试方法的系统架构图。参照图2,具体阐述如下:
构建服务器:用于构建目标程序,并将目标程序的调试版本发布至目标机。
目标程序:被调试的Java程序,在JPDA中也被称为被调试者(debuggee),在JPDA中,被调试者运行在目标机的Java虚拟机上,可以通过Java虚拟机工具接口(Java VirtualMachine Tool Interface,简称JVMTI)监控当前虚拟机的信息。
目标机:用于运行目标程序,可以是实体机器,也可以是虚拟机。
注册保活代理:可以实现为目标程序内的一个线程,用于完成目标程序到调试服务器的注册和保活。
调试服务器:用于向用户提供在线调试服务,并远程调试目标程序。调试服务器可以包括调试器、注册管理、本地缓存、调试代理以及用户界面等功能组件。可以理解的,这些功能组件只是为了便于阐述调试服务器的功能人为划分的,在其他一些实施方式中,这些功能组件也可以采用其他的名称、或者进行不同方式的划分,但就其整体上的功能而言,应当与图2中示出的这些功能组件一致。
调试器:在JPDA体系中也被称为调试者(debugger),在JPDA中,调试者定义了用户可使用的调试接口,通过这些接口,用户可以对被调试者发送调试命令,同时调试者接收被调试者返回的调试结果。在调试者和被调试者之间,调试命令和调试结果,都是通过Java调试线协议(Java Debug Wire Protocol,简称JDWP)的通讯协议传输的。所有的命令被封装成JDWP命令包,通过传输层发送给被调试者,被调试者接收到JDWP命令包后,解析这个命令并转化为JVMTI的调用并执行。类似的,JVMTI的运行结果,被格式化成JDWP数据包,发送给调试者,由调试者返回给用户。
调试器可以采用现有的Java调试工具,例如jdb,也可以利用JDWP、Java调试接口(Java Debug Interface,简称JDI)等自行编写,使其符合JDPA的规范。为便于阐述,后文中的调试器以jdb为例。
注册管理:用于向注册保活代理提供注册和保活服务。
本地缓存:用于存储目标程序的注册信息。
用户界面:在线调试服务器的前端,这里的用户界面通常是指图形化的界面,调试服务器可以通过用户界面向用户显示可供调试的程序,用户也可以通过用户界面执行调试操作,下达相应的调试指令,用户界面可以是web页面。采用web页面的方式无需安装专门的调试工具或开发环境,便于快速实施调试。可以理解的,在某些实现方式中,也可以没有用户界面,例如用户也可以通过命令行等方式进行操作,在后文中为方便阐述,仅以设置了用户界面的实现方式为例。
调试代理:主要用于充当调试器和用户界面的中介,将用户界面的调试指令转换成调试器能够识别的形式,同时将调试器返回的调试结果解析后反馈至用户界面。调试代理的其他一些用途将在后文具体阐述。
浏览器:位于用户的机器上,用户人员通过浏览器访问调试服务器的web页面,完成调试。当然在某些实施方式中,浏览器也可以实现为一个客户端,此时用户界面是指客户端的界面。
源码服务器:用于存储并管理Java项目源代码,例如,可以是一个svn服务器。
可以理解的,图2示出的系统架构仅为可用于实现本发明实施例提供的远程调试方法的一种系统架构,但并不是唯一的系统架构。图2中出现的设备、组件、连接关系并不一定会包含在本发明的每个实施例中。因此图2并不应当视为对本发明保护范围的限制。
图3示出了本发明实施例提供的远程调试方法的流程图。参照图3,该方法包括:
步骤S10:调试服务器获取目标程序的注册信息。
每个希望被调试的目标程序都应当在调试服务器上进行注册,从而调试服务器可以获取到目标程序的注册信息并保存。目标程序的注册信息包括,但不限于目标程序所在的目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单,例如还可以包括目标程序的描述等信息。
其中,目标机地址一般为IP地址,调试服务端口与目标程序一般是一一对应的,可以避免冲突,而源码路径清单是指构成目标程序的源代码文件在源码服务器上的保存路径的集合。
进行过信息注册的程序均可以进行调试,在用户界面上可以以列表等方式展现可供调试的目标程序,使用户能够直观地了解。
步骤S11:在接收到针对目标程序的调试请求指令后,根据源码路径清单从源码服务器上下载目标程序的源代码。
调试请求指令可以由用户通过用户界面下达,例如,用户点击目标程序列表中的某一项时,生成该目标程序对应的调试请求指令。
在一种实施方式中,目标机地址、调试服务端口以及源码路径清单包含在调试请求指令中,用户界面将这些信息作为参数传递给调试代理。在另一种实施方式中,调试请求指令中仅包含目标程序的唯一标识,由用户界面或调试代理从数据库中查询到与该标识对应的目标机地址、调试服务端口以及源码路径清单,如果由用户界面进行查询,用户界面应当将这些信息作为参数传递给调试代理。在步骤S11中,虽然仅需要使用源码路径清单,但目标机地址、调试服务器亦可以同时获取,这两项信息在步骤S12中会被使用。
调试代理在获得源码路径清单后,可以利用源码管理工具(例如svn,cvs,git等)从源码服务器下载该清单其对应的源代码到调试服务器的本地文件系统。
步骤S12:调试服务器以目标机地址以及调试服务端口为参数调用调试器,在调试器与目标程序之间建立用于在调试过程中传输数据的调试通道。
这里所称建立调试通道即建立JDWP连接,以便将调试器与目标程序绑定在一起。以jdb为例,调试代理将目标机地址以及调试服务端口作为命令行参数调用jdb,即可实现调试通道的建立:jdb-attach<目标机地址>:<调试服务端口>-sourcepath"/local/srcA:/local/srcB"
其中,命令行选项attach指定目标机地址以及调试服务端口,同时还可以使用sourcepath选项指定源代码的查找路径(调试服务器本地路径),如果不指定源代码路径,采用默认的路径。
调试代理完成上述调用后,等待jdb返回结果,当正常建立JDWP连接后,jdb进入命令交互模式。jdb命令交互模式是以“>”符号结尾,如下所示:
#jdb-attach127.0.0.1:8888
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb...
调试代理通过检测返回数据流中是否有“>”符号即可判断jdb是否进入命令交互模式。若jdb已经进入命令交互模式,可以向用户界面返回相应的结果,并执行后续步骤。图4示出了调试通道建立过程的时序图,其具体内容在上面已经阐述。
步骤S13:在接收到针对目标程序的调试指令后,将调试指令发送至调试器执行调试,通过调试器获得调试结果后。
调试通道建立成功后,进入交互式调试模式,即执行步骤S13。调试代理作为一个代理程序,同时与jdb和用户界面保持连接,起到二者之间信息传递中介的作用。图5示出了用户界面、jdb以及调试代理的关系图。
参照图5,调试代理对用户界面提供DebugInterface接口,该接口是对jdb命令接口的封装。同时,调试代理收到jdb通知消息(调试结果)后,封装成DebugNotify通知到用户界面。
图6示出了交互式调试的时序图。结合参照图5以及图6,一方面,调试代理将用户界面传来的调试指令转换成jdb命令接口,发往jdb。另外一方面,调试代理解析jdb返回的调试结果,并进行再封装返回给用户界面模块:
jdb中的常用命令包括:设置断点(stop at)、单步调试(step/next),观察执行结果(watch)、继续执行(cont)等,当然jdb还包括很多其他命令,这里不再逐一列举。在用户界面上可以提供与jdb命令对应的可视化操作方式,用户作出相应的操作时,即生成与这些jdb命令对应的调试指令。可以理解的,用户的某些调试指令并不涉及交互式调试,这些指令可以由用户界面和/或调试代理自行处理,例如,对于源码浏览指令,可以直接由用户界面生成包含源代码的窗口展示给用户。
下面以调试中最常见的设置断点指令为例,详细阐述一次交互调试的过程。用户在窗口中浏览源码时,可以将某一行标记为断点。用户界面收到断点标记请求后,解析出该源码对应的Java类名和行号,然后调用调试代理的DebugInterface接口设置断点,调试代理再调用jdb进行断点设置。断点设置成功后,当目标程序运行到断点处会自动挂起,进入等待调试状态,并自动通过JDWP协议通知jdb,jdb会将断点信息以消息的方式返回给调试代理,调试代理再进一步发送DebugNotify到用户界面。用户界面收到断点信息后,自动将源码窗口切换到断点处,并进行行高亮显示,表示目标程序运行到断点处,此时用户可以在用户界面上下达其他调试指令。其他调试指令的执行方式和断点设置指令类似,不再重复阐述。
综上所述,在采用上述方法进行远程调试时,用户只需在用户界面上选择要调试的目标程序即可,调试服务器会自动根据用户选择的目标程序下载相应的源代码以及建立调试器与目标程序之间的调试通道,然后用户可以使用用户界面上的调试功能,下达相应的调试指令给调试器,进行交互式调试。
上面的调试过程对用户来说非常简单,特别是在调试之前无需再去自行搭建调试环境、下载源代码以及配置调试参数,这些工作全都可以交给调试服务器自动完成,从而显著提高了调试效率,避免了配置过程中人为因素导致的错误,降低了对调试人员技术水平的要求。
此外,上述方法是一种集中式调试服务,即对所有的目标程序的调试都是通过调试服务器进行调试的,用户只需要访问调试服务器提供的用户界面即可使用该服务,不同的调试人员无需部署不同的调试系统,从而有效共享了调试资源,提高了资源的利用率。
可以理解的,在调试服务器未提供用户界面(如通过命令行)的实现方式中,上述有益效果仍然是存在的。
在本发明实施例的一种实施方式中,每个目标程序在启动时,注册程序向调试服务器注册该目标程序的信息,在图2中,注册程序由注册保活代理实现,注册保活代理可以实现为一个jar包,在构建服务器上,注册保活代理和目标程序可以同时构建,并随目标程序一起发布到目标机上,在目标程序启动时,注册保活代理被调度执行。调度执行注册保活代理的,可以是目标程序的主程序,也可以是外部的程序框架,例如spring boot。
具体而言,在目标程序启动时,注册保活代理首先获得目标机地址、调试服务端口以及源码路径清单。其中,目标机地址可以实时获取,调试服务端口以及源码路径清单可以在目标程序构建时就配置好并随目标程序一起发布,这样调试人员不必再进行这些参数的配置,不仅简化了调试流程,也降低了对调试人员的技术水平的要求,而由开发人员在程序开发阶段进行参数配置,出错的可能性是比较小的。下面是源码路径清单的一个具体例子:
http://svn.compony.com/repos/software/project_1/module_1/src/
http://svn.compony.com/repos/software/project_1/module_2/src/
http://svn.compony.com/repos/software/project_1/module_3/src/
...
需要指出,源码路径清单在实际中通常不需要人工配置,可以通过编写编译脚本,该脚本在编译时被执行,自动生成源码清单。
注册保活代理在获得目标机地址、调试服务端口以及源码路径清单后,将其作为调用参数,通过远程过程调用(Remote Procedure Call,简称RPC)等方式,调用调试服务器上的注册管理提供的接口,在调试服务器上注册目标程序。
注册管理在接收到注册请求后,将注册请求中包含的目标机地址、调试服务端口以及源码路径清单作为注册信息保存至本地缓存,然后可以执行步骤S10,在用户界面上显示进行过注册的目标程序,以便用户进行选择。
当然,上面描述的是注册成功的情况,如果调试服务器网络不可达,或者调试服务器未启动等原因,可能导致注册失败。此时注册保活代理可以周期性的注册尝试,直到注册成功。
在本发明实施例的一种实施方式中,若目标程序注册成功,还可以执行目标程序的保活,其具体做法是:
在目标程序运行过程中,执行保活程序,定期向调试服务器上的注册管理发送保活报文。在图2中,保活程序由注册保活代理实现,保活报文的内容不作限定,其目的只是通过调试服务器目标程序仍在运行中,即存活。
注册管理在接收到保活报文后,将保活报文的接收时间也保存到该目标程序的注册信息中,如果注册信息中已经有之前保存的接收时间,则将其覆盖掉。一个目标程序的注册信息可以如下所示:
成员名 类型 描述
Id int 唯一标示
address String 目标机地址
Port int 调试服务端口
srcList List<String> 源码路径清单
lastKeepaliveTime int 接收时间
其中,第一项Id为目标程序的唯一标识,用于区分不同的目标程序。
注册管理会定期扫描注册信息,从注册信息中读取接收时间,并判断接收时间距离当前时间是否已经超过预设时长,若未超过预设时长,则表明目标程序仍在运行,无需进行任何处理。若超过预设时长,则表明目标程序已经因某些原因异常离线,例如,程序异常终止,或者用户自行结束了程序等等,此时该目标程序在本地缓存中保存的注册信息将被删除,同时用户界面上也应当相应地刷新,以确保显示的可调试的目标程序与实际可调试的目标程序一致。图7示出了注册保活的时序图,其具体内容在上面已经阐述。
进一步的,在构建目标程序时还可以配置目标程序的编译脚本以及运行脚本。具体如下:
为了使目标程序的版本可以调试,需要在编译时指定调试模式。不同类型的Java工程具体的设置不完全相同,以ant构建的Java工程为例,需要在ant编译脚本的javac标签增加属性:
<javac debug=”on”>
...
</javac>
为了使Java程序能够接收远程调试,需要修改Java程序的运行参数,启动调试服务端口。具体以apache-tomcat容器应用为例,在启动前设置好环境变量JAVA_OPTS。例如:
Export JAVA_OPTS=”-Xdebug-Xnoagent-Djava.compiler=NONE-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n”
其中8888为Java程序的调试服务端口,该环境变量会被tomcat读取并使用。运行脚本也可以在构建时配置好,并随目标程序一起发布,这样无需用户再进行运行脚本的配置,进一步调试流程。
本发明实施例还提供一种调试服务器,包括:
注册接口模块,用于获取目标程序的注册信息,注册信息包括目标程序所在的目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
指令接收模块,用于接收到针对目标程序的调试请求指令以及调试指令;
源码下载模块,用于在指令接收模块接收到调试请求指令后,根据源码路径清单从源码服务器上下载目标程序的源代码;
通道建立模块,用于以目标机地址以及调试服务端口为参数调用调试器,在调试器与目标程序之间建立用于在调试过程中传输数据的调试通道;
调试模块,用于在指令接收模块接收到调试指令后,将调试指令发送至调试器执行调试,通过调试器获得调试结果。
在一种可能的实现方式中,注册接口模块具体用于,接收目标机上的注册程序在目标程序启动时发送的注册请求,并将注册请求中包含的目标机地址、调试服务端口以及源码路径清单作为注册信息保存。
在一种可能的实现方式中,调试服务器还包括:保活管理模块,保活管理模块用于接收目标机上的保活程序在目标程序的运行过程中定期发送的表示目标程序仍在运行的保活报文,并在注册信息中保存保活报文的接收时间,以及定期扫描注册信息,并在判断接收时间距离当前时间超过预设时长时,删除注册信息。
本发明实施例提供的调试服务器,其实现原理及产生的技术效果在前述方法实施例中已经阐述,为简要描述,本施例部分未提及之处,可参考前述方法实施例中的相应内容。
本发明实施例还提供一种目标机,包括:
信息获取模块,用于在目标程序启动时,执行注册程序,获得目标机地址、目标程序使用的调试服务端口以及目标程序的源码路径清单;
注册模块,用于以目标机地址、调试服务端口以及源码路径清单为参数调用调试服务器的接口,在调试服务器上注册目标程序。
在一种可能的实现方式中,目标机还包括:保活模块,保活模块用于在目标程序运行过程中,执行保活程序,定期向调试服务器发送表示目标程序仍在运行的保活报文。
本发明实施例提供的目标机,其实现原理及产生的技术效果在前述方法实施例中已经阐述,为简要描述,本施例部分未提及之处,可参考前述方法实施例中的相应内容。
本发明实施例还提供一种计算机存储介质,计算机存储介质中存储有计算机程序指令,计算机程序指令被计算机的处理器读取并运行时,执行本发明实施例提供的方法的步骤。
本发明实施例还提供一种电子设备,包括处理器以及计算机存储介质,计算机存储介质中存储有计算机程序指令,计算机程序指令被处理器读取并运行时,执行本发明实施例提供的方法的步骤。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其他的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得计算机设备执行本发明各个实施例所述方法的全部或部分步骤。前述的计算机设备包括:个人计算机、服务器、移动设备、智能穿戴设备、网络设备、虚拟设备等各种具有执行程序代码能力的设备,前述的存储介质包括:U盘、移动硬盘、只读存储器、随机存取存储器、磁碟、磁带或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (12)

1.一种远程调试方法,其特征在于,应用于调试服务器,包括:
获取目标程序在所述调试服务器上进行注册的注册信息,所述注册信息包括所述目标程序所在的目标机地址、所述目标程序使用的调试服务端口以及所述目标程序的源码路径清单;其中,所述调试服务端口以及所述源码路径清单在构建所述目标程序时被配置好并随所述目标程序发布至所述目标机;
在接收到针对所述目标程序的调试请求指令后,根据所述源码路径清单从源码服务器上下载所述目标程序的源代码;
以所述目标机地址以及所述调试服务端口为参数调用调试器,在所述调试器与所述目标程序之间建立用于在调试过程中传输数据的调试通道;
在接收到针对所述目标程序的调试指令后,将所述调试指令发送至所述调试器执行调试,通过所述调试器获得调试结果。
2.根据权利要求1所述的远程调试方法,其特征在于,所述获取目标程序的注册信息,包括:
接收所述目标机上的注册程序在所述目标程序启动时发送的注册请求,并将所述注册请求中包含的所述目标机地址、所述调试服务端口以及所述源码路径清单作为所述注册信息保存。
3.根据权利要求2所述的远程调试方法,其特征在于,所述方法还包括:
接收所述目标机上的保活程序在所述目标程序的运行过程中定期发送的表示所述目标程序仍在运行的保活报文,并在所述注册信息中保存所述保活报文的接收时间;
定期扫描所述注册信息,并在判断所述接收时间距离当前时间超过预设时长时,删除所述注册信息。
4.根据权利要求1-3中任一项所述的远程调试方法,其特征在于,所述调试指令包括设置断点、单步调试、观察执行结果以及继续执行的中的至少一种指令。
5.一种远程调试方法,其特征在于,应用于目标机,包括:
在目标程序启动时,执行注册程序,获得目标机地址、目标程序使用的调试服务端口以及所述目标程序的源码路径清单;其中,所述调试服务端口以及所述源码路径清单在构建所述目标程序时被配置好并随所述目标程序发布至所述目标机;
以所述目标机地址、所述调试服务端口以及所述源码路径清单为参数调用调试服务器的接口,在所述调试服务器上注册所述目标程序。
6.根据权利要求5所述的远程调试方法,其特征在于,在所述以所述目标机地址、所述调试服务端口以及所述源码路径清单为参数调用调试服务器的接口之后,所述方法还包括:
在所述目标程序运行过程中,执行保活程序,定期向所述调试服务器发送表示所述目标程序仍在运行的保活报文。
7.根据权利要求6所述的远程调试方法,其特征在于,所述注册程序以及所述保活程序在构建所述目标程序时被构建好并随所述目标程序发布至所述目标机。
8.一种调试服务器,其特征在于,包括:
注册接口模块,用于获取目标程序在所述调试服务器上进行注册的注册信息,所述注册信息包括所述目标程序所在的目标机地址、所述目标程序使用的调试服务端口以及所述目标程序的源码路径清单;其中,所述调试服务端口以及所述源码路径清单在构建所述目标程序时被配置好并随所述目标程序发布至所述目标机;
指令接收模块,用于接收到针对所述目标程序的调试请求指令以及调试指令;
源码下载模块,用于在所述指令接收模块接收到所述调试请求指令后,根据所述源码路径清单从源码服务器上下载所述目标程序的源代码;
通道建立模块,用于以所述目标机地址以及所述调试服务端口为参数调用调试器,在所述调试器与所述目标程序之间建立用于在调试过程中传输数据的调试通道;
调试模块,用于在所述指令接收模块接收到所述调试指令后,将所述调试指令发送至所述调试器执行调试,通过所述调试器获得调试结果。
9.根据权利要求8所述的调试服务器,其特征在于,所述注册接口模块具体用于,接收所述目标机上的注册程序在所述目标程序启动时发送的注册请求,并将所述注册请求中包含的所述目标机地址、所述调试服务端口以及所述源码路径清单作为所述注册信息保存。
10.根据权利要求9所述的调试服务器,其特征在于,所述调试服务器还包括:保活管理模块,所述保活管理模块用于接收所述目标机上的保活程序在所述目标程序的运行过程中定期发送的表示所述目标程序仍在运行的保活报文,并在所述注册信息中保存所述保活报文的接收时间,以及定期扫描所述注册信息,并在判断所述接收时间距离当前时间超过预设时长时,删除所述注册信息。
11.一种目标机,其特征在于,包括:
信息获取模块,用于在目标程序启动时,执行注册程序,获得目标机地址、目标程序使用的调试服务端口以及所述目标程序的源码路径清单;其中,所述调试服务端口以及所述源码路径清单在构建所述目标程序时被配置好并随所述目标程序发布至所述目标机;
注册模块,用于以所述目标机地址、所述调试服务端口以及所述源码路径清单为参数调用调试服务器的接口,在所述调试服务器上注册所述目标程序。
12.根据权利要求11所述的目标机,其特征在于,所述目标机还包括:保活模块,所述保活模块用于在所述目标程序运行过程中,执行保活程序,定期向所述调试服务器发送表示所述目标程序仍在运行的保活报文。
CN201811132355.0A 2018-09-27 2018-09-27 远程调试方法、调试服务器及目标机 Active CN109344065B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811132355.0A CN109344065B (zh) 2018-09-27 2018-09-27 远程调试方法、调试服务器及目标机

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811132355.0A CN109344065B (zh) 2018-09-27 2018-09-27 远程调试方法、调试服务器及目标机

Publications (2)

Publication Number Publication Date
CN109344065A CN109344065A (zh) 2019-02-15
CN109344065B true CN109344065B (zh) 2022-06-21

Family

ID=65307330

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811132355.0A Active CN109344065B (zh) 2018-09-27 2018-09-27 远程调试方法、调试服务器及目标机

Country Status (1)

Country Link
CN (1) CN109344065B (zh)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110032426A (zh) * 2019-04-10 2019-07-19 浙江讯盟科技有限公司 一种可在线实时调试的方法、系统及存储介质
US11847554B2 (en) 2019-04-18 2023-12-19 Cambricon Technologies Corporation Limited Data processing method and related products
CN111831543A (zh) * 2019-04-18 2020-10-27 中科寒武纪科技股份有限公司 一种数据处理方法及相关产品
CN111045919B (zh) * 2019-07-12 2023-08-22 华控清交信息科技(北京)有限公司 调试程序的方法、装置、后台服务器、存储介质及系统
CN111045918B (zh) * 2019-07-12 2023-09-22 华控清交信息科技(北京)有限公司 调试程序的方法、装置、客户端、存储介质及系统
CN110851297B (zh) * 2019-11-08 2023-08-22 深圳市易检车服科技有限公司 一种接口抖动状态的处理方法、装置、系统及介质
CN112925700A (zh) * 2019-12-06 2021-06-08 西安诺瓦星云科技股份有限公司 程序调试方法、装置及系统和嵌入式设备
CN111049912A (zh) * 2019-12-17 2020-04-21 用友网络科技股份有限公司 调试方法、测试开发设备以及计算机可读存储介质
CN111459840A (zh) * 2020-04-26 2020-07-28 恩亿科(北京)数据科技有限公司 一种进程的调试方法及装置
CN111782530B (zh) * 2020-06-30 2023-10-10 北京奇艺世纪科技有限公司 一种远程调试方法、装置、系统、电子设备及存储介质
CN111782525B (zh) * 2020-06-30 2023-08-22 中国工商银行股份有限公司 Java方法远程调试方法及装置
CN111970364A (zh) * 2020-08-17 2020-11-20 创新奇智(重庆)科技有限公司 硬件调试执行方法、装置、电子设备及存储介质
CN111930472B (zh) * 2020-08-19 2023-03-28 曙光信息产业(北京)有限公司 一种代码调试方法、装置、电子设备及存储介质
CN114398102B (zh) * 2022-01-18 2023-08-08 杭州米络星科技(集团)有限公司 一种应用程序包生成方法、装置、编译服务器及计算机可读存储介质
CN114297089B (zh) * 2022-03-02 2022-07-29 杭州海康威视数字技术股份有限公司 基于容器的Python远程动态调试方法及系统

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102609353A (zh) * 2012-01-17 2012-07-25 浪潮(北京)电子信息产业有限公司 对程序调试进行管理的方法、装置及系统
CN106201745A (zh) * 2016-07-08 2016-12-07 深圳中兴网信科技有限公司 应用程序的远程调试方法、远程调试系统和终端
CN107870855A (zh) * 2016-09-27 2018-04-03 北京计算机技术及应用研究所 基于天熠嵌入式操作系统的调试系统

Also Published As

Publication number Publication date
CN109344065A (zh) 2019-02-15

Similar Documents

Publication Publication Date Title
CN109344065B (zh) 远程调试方法、调试服务器及目标机
US10417065B2 (en) Method and system for automated agent injection in container environments
CN107704395B (zh) 一种基于Openstack下云平台自动化测试实施方法与系统
US9355017B2 (en) Automated error checking system for a software application and method therefor
US20070168994A1 (en) Debugging a computer program in a distributed debugger
US20120167052A1 (en) Method and system for providing a visual debugger for an interpreted statistical language
US8677321B2 (en) User-space probe based debugging
WO2017077404A1 (en) Deep linking to mobile application states through programmatic replay of user interface events
US20170206078A1 (en) Updating software components through online stores
US8806438B2 (en) Collaborative software debugging in a distributed system with variable-specific messages
CN114064152B (zh) 基于动态加载的嵌入式多核调试系统及其调试方法
CN111382048B (zh) 真机测试平台上移动设备的管理方法和装置
CN113626036A (zh) 一种基于Jenkins的代码集成管理方法和系统
CN113722204A (zh) 一种应用调试方法、系统、设备及介质
CN107918587B (zh) 一种应用程序的调试方法及系统
CN109408376B (zh) 一种配置数据的生成方法、装置、设备及存储介质
US10698666B2 (en) Automatically building software projects
CN110795139A (zh) 客户端批量打包方法、装置、计算机设备和存储介质
CN113127329B (zh) 脚本调试方法、装置及计算机存储介质
CN116627850A (zh) 函数调试方法、装置、存储介质以及电子设备
KR20130020135A (ko) 통합 개발 환경에서의 코드 동시 개발자 리스트 제공 시스템 및 방법
CN105550575A (zh) 一种未导出的函数地址和数据结构偏移的获取方法及装置
CN115658069A (zh) 一种发布平台的项目打包和在线编译方法
CN112579460B (zh) 一种基于多核嵌入式系统的多级调试方法
CN116244186A (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
GR01 Patent grant
GR01 Patent grant