发明内容
本公开实施例至少提供一种代码调试方法、装置、计算机设备和存储介质。
第一方面,本公开实施例提供了一种代码调试方法,包括:
响应于客户端的目标应用运行请求,加载所述目标应用的应用代码,在所述应用代码运行失败的情况下,初始化目标运行实例并利用所述目标运行实例启动目标容器;
响应于客户端发起的针对所述目标运行实例的代码加载请求,获取所述应用代码并在所述应用代码的预设位置添加调试断点,将得到的待调整的应用代码加载至所述目标容器;
响应于客户端的代码调试操作,在所述目标容器中对所述待调整的应用代码进行调试。
在一种可能的实施方式中,所述利用所述目标运行实例启动目标容器,包括:
利用所述目标运行实例启动所述目标容器,并在确定所述目标容器启动完成的情况下,开启所述目标运行实例的调试功能。
在一种可能的实施方式中,所述获取所述应用代码并在所述应用代码的预设位置添加调试断点,包括:
对所述应用代码对应的代码读取方式进行修改,得到修改后的代码读取方式;
利用所述修改后的代码读取方式,读取所述应用代码,并在读取所述应用代码的过程中,在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,在获取所述应用代码之前,还包括建立所述目标运行实例和所述应用代码之间的触发依赖关系的步骤:
确定所述应用代码的存储路径信息,并基于所述存储路径信息建立目标运行实例和所述应用代码之间的触发依赖关系;
所述获取所述应用代码并在所述应用代码的预设位置添加调试断点,包括:
基于所述触发依赖关系对应的存储路径信息,获取所述应用代码,并在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,所述响应于客户端发起的针对所述目标运行实例的代码加载请求,包括:
响应于所述客户端发起的容器连接请求,建立所述目标容器和所述客户端之间的目标连接;
利用所述目标连接,获取并响应于所述客户端发起的针对所述目标运行实例的代码加载请求。
在一种可能的实施方式中,所述响应于客户端的代码调试操作,在所述目标容器中对所述待调整的应用代码进行调试,包括:
响应于客户端的代码调试操作,在所述代码调试操作指示的调试位置,添加所述调试断点,并启动对所述调试位置对应的应用代码段的调试。
在一种可能的实施方式中,在对所述应用代码段进行调试之后,还包括:
在调试结果指示所述应用代码段存在错误的情况下,基于所述代码调试操作对应的代码修改信息,对所述应用代码段进行修改,并重新对修改后的应用代码段进行调试。
在一种可能的实施方式中,所述方法还包括:
在对所述待调整的应用代码中至少部分应用代码段调试完毕之后,得到调整好的目标应用的应用代码。
第二方面,本公开实施例还提供一种代码调试装置,包括:
启动模块,用于响应于客户端的目标应用运行请求,加载所述目标应用的应用代码,在所述应用代码运行失败的情况下,初始化目标运行实例并利用所述目标运行实例启动目标容器;
获取模块,用于响应于客户端发起的针对所述目标运行实例的代码加载请求,获取所述应用代码并在所述应用代码的预设位置添加调试断点,将得到的待调整的应用代码加载至所述目标容器;
调整模块,用于响应于客户端的代码调试操作,在所述目标容器中对所述待调整的应用代码进行调试。
在一种可能的实施方式中,所述启动模块,用于利用所述目标运行实例启动所述目标容器,并在确定所述目标容器启动完成的情况下,开启所述目标运行实例的调试功能。
在一种可能的实施方式中,所述获取模块,用于对所述应用代码对应的代码读取方式进行修改,得到修改后的代码读取方式;
利用所述修改后的代码读取方式,读取所述应用代码,并在读取所述应用代码的过程中,在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,所述装置还包括依赖建立模块;
所述依赖建立模块,用于在获取所述应用代码之前,按照以下步骤建立所述目标运行实例和所述应用代码之间的触发依赖关系:
确定所述应用代码的存储路径信息,并基于所述存储路径信息建立目标运行实例和所述应用代码之间的触发依赖关系;
所述获取模块,用于基于所述触发依赖关系对应的存储路径信息,获取所述应用代码,并在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,所述获取模块,用于响应于所述客户端发起的容器连接请求,建立所述目标容器和所述客户端之间的目标连接;
利用所述目标连接,获取并响应于所述客户端发起的针对所述目标运行实例的代码加载请求。
在一种可能的实施方式中,所述调整模块,用于响应于客户端的代码调试操作,在所述代码调试操作指示的调试位置,添加所述调试断点,并启动对所述调试位置对应的应用代码段的调试。
在一种可能的实施方式中,所述调整模块,还用于在对所述应用代码段进行调试之后,在调试结果指示所述应用代码段存在错误的情况下,基于所述代码调试操作对应的代码修改信息,对所述应用代码段进行修改,并重新对修改后的应用代码段进行调试。
在一种可能的实施方式中,所述调整模块,还用于在对所述待调整的应用代码中至少部分应用代码段调试完毕之后,得到调整好的目标应用的应用代码。
第三方面,本公开可选实现方式还提供一种计算机设备,处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开可选实现方式还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
关于上述代码调试装置、计算机设备、及计算机可读存储介质的效果描述参见上述代码调试方法的说明,这里不再赘述。
本公开实施例提供的代码调试方法、装置、计算机设备和存储介质,通过在应用代码运行失败的情况下,基于初始化的目标运行实例启动目标容器,可以有效防止现有技术中在应用代码运行失败时会直接摧毁容器,导致无容器支撑对应用代码进行调试的问题。利用目标运行实例启动的目标容器作为支撑对应用代码进行调试的容器,保证可以及时对运行失败的应用代码进行调试,提高了代码调试的及时性和灵活性。通过在获取的应用代码的预设位置添加调试断点并加载至目标容器中的方式,可以保证后续在目标容器中进行代码调试时,能够利用调试断点对代码进行分段调试,增加了代码调试的灵活性和便利性。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
另外,本公开实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
在本文中提及的“多个或者若干个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
经研究发现,当用户存在使用目标应用的需要时,需要在客户端向服务端发起目标应用运行请求,服务端基于目标应用运行请求为目标应用分配容器并在容器中运行目标应用的应用代码以完成应用的启动。
但在目标应用的应用代码在容器中运行失败的情况下,服务端会直接将分配的容器销毁,应用将无法启动。这样,由于容器的摧毁,无法及时地对应用代码进行调整,导致用户无法及时在客户端使用目标应用。
基于上述研究,本公开提供了一种代码调试方法、装置、计算机设备和存储介质,通过在应用代码运行失败的情况下,基于初始化的目标运行实例启动目标容器,可以有效防止现有技术中在应用代码运行失败时会直接摧毁容器,导致无容器支撑对应用代码进行调试的问题。利用目标运行实例启动的目标容器作为支撑对应用代码进行调试的容器,保证可以及时对运行失败的应用代码进行调试,提高了代码调试的及时性和灵活性。通过在获取的应用代码的预设位置添加调试断点并加载至目标容器中的方式,可以保证后续在目标容器中进行代码调试时,能够利用调试断点对代码进行分段调试,增加了代码调试的灵活性和便利性。
针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
需要说明的是,本公开实施例中所提到的特定名词包括:
Docker容器:是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上,也可以实现虚拟化;
WebSocket:是一种基于TCP的应用层协议,实现了客户端和服务器的全双工通信,使得客户端和服务器都能主动向对方发送数据。一旦WebSocket连接建立,后续数据都以帧序列的形式在同一持久连接上传输,节省了网络带宽。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种代码调试方法进行详细介绍,本公开实施例所提供的代码调试方法的执行主体一般为具有一定计算能力的计算机设备,在一些可能的实现方式中,该代码调试方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
下面以执行主体为服务端为例对本公开实施例提供的代码调试方法加以说明。
如图1所示,为本公开实施例提供的一种代码调试方法的流程图,可以包括以下步骤:
S101:响应于客户端的目标应用运行请求,加载目标应用的应用代码,在应用代码运行失败的情况下,初始化目标运行实例并利用目标运行实例启动目标容器。
这里,目标应用运行请求可以为用户在客户端发起的运行目标应用的请求,目标应用可以为一种Node.js应用,客户端即为用户端,目标应用在开发完成之后,可以被用户下载在客户端中,并在下载完成后,当用户存在使用目标应用的需求时,可以在客户端向目标应用对应的服务端发起针对目标应用的目标应用运行请求,以在服务端完成响应之后,使用目标应用。
目标应用的应用代码为代码开发人员预先开发的,存储在服务端的预设位置处,例如,存储在代码数据库中。不同的目标应用对应的应用代码,应用代码在正常运行的情况下,可以得到目标应用;但应用代码在运行时,还可能会产生程序错误(即bug),继而,目标应用也将无法运行。
目标运行实例为一种能够在服务端启动容器的实例,具体的,目标运行实例可以为一个可供调试的Node.js实例,其作用在于在服务端启动目标容器。
针对目标应用而言,其启动需要服务端为其分配容器,并在分配的容器中启动。容器具体而言,是一种运行环境,其可以支持不同的预设应用的应用代码的运行以完成应用的启动、以及可以应用代码的调试,包括预设应用启动成功之后,应用的运行及使用均需要在对应分配的容器中。
具体实施时,当用户存在使用目标应用的需求时,可以在客户端向目标应用对应的服务端发起针对目标应用的目标应用运行请求。进而,服务端可以响应于接收到的目标应用运行请求,为目标应用运行请求对应的目标应用分配容器,从预设位置处获取目标应用对应的应用代码并加载到分配的容器中(即require应用代码)。之后,可以在该容器中运行该应用代码,在确定应用代码运行失败的情况下,服务端将摧毁该容器。之后,服务端可以主动初始化一个目标运行实例,也即,主动初始化一个空的、可调试的实例,并利用该目标运行实例启动一个新的目标容器,此时,该目标容器中存在一个空的、可调试的实例,空的运行实例可以保证目标运行实例在目标容器中可以一直处于运行成功的状态,有效防止服务端摧毁目标容器。
或者,在确定服务端摧毁了容器之后,用户可以在客户端主动初始化一个目标运行实例,并利用目标运行实例向服务端发起实例运行请求,之后,服务端可以响应于该实例运行请求,为该实例运行请求对应的目标运行实例分配目标容器。
其中,实例运行请求之中可以包括目标运行实例的代码,服务端在响应实例运行请求的过程中,可以从中获取到目标运行实例的代码并加载到分配的目标容器中。
S102:响应于客户端发起的针对目标运行实例的代码加载请求,获取应用代码并在应用代码的预设位置添加调试断点,将得到的待调整的应用代码加载至目标容器。
这里,代码加载请求为针对目标运行实例的、在目标容器中加载运行失败的目标应用的应用代码的请求,为在确定目标容器启动成功之后,客户端发起的请求。
调试断点用于在执行应用代码的过程中进行中断,以实现对代码的分段调试,具体的,调试断点可以为运行时断点debugger。其中,运行时断点debugger是一种用于中断代码执行,获取已执行的代码对应的执行变量的断点。并在设置debugger时,一个debugger占单独的一个代码行。
预设位置具体可以包括但不限于应用代码的头部位置,并且,可以在多个预设位置处添加多个debugger断点,每个debugger断点占单独的一个代码行。待调整的应用代码为在预设位置处添加了调试断点的应用代码。
具体实施时,当用户存在对运行失败的应用代码进行调试的需求时,可以在客户端根据运行失败的应用代码的代码存储位置,发起针对目标运行实例的代码加载请求。进而,服务端可以响应于代码加载请求,利用require方式,在代码存储位置处获取应用代码,并在获取应用代码的过程中,在应用代码的预设位置出添加调试断点(debugger断点),进而,在应用代码获取完毕之后,可以得到添加了调试断点的待调整的应用代码。
然后,可以将待调整的应用代码加载至目标运行实例对应的目标容器中,以便于后续在目标容器中对待调整的应用代码进行调整。
S103:响应于客户端的代码调试操作,在目标容器中对待调整的应用代码进行调试。
这里,代码调试操作为用户在客户端发起的对待调整的应用代码进行调试的操作,例如,代码调试操作可以包括代码增加操作、代码删除操作、代码修改操作等等。
具体实施时,可以响应于客户端的代码调试操作,利用添加在预设位置的debugger断点,例如,将添加在预设位置的debugger断点移动至新的位置;或者,获取用户客户端在新的位置主动添加的新的debugger断点,对待调整的应用代码进行分段修改;并在目标启动中对修改后的分段代码进行运行,以确定每一段的待调整的应用代码是否能够成功运行,进而完成对待调整的应用代码的整体调试。
其中,对待调整的应用代码进行分段修改,即为对debugger断点对应的位置以前的各个代码的修改。例如,debugger断点位于第四行,则可以对第一行至第三行的代码进行分段,并其该段代码进行修改、调试等等。
这样,通过在应用代码运行失败的情况下,基于初始化的目标运行实例启动目标容器,可以有效防止现有技术中在应用代码运行失败时会直接摧毁容器,导致无容器支撑对应用代码进行调试的问题。利用目标运行实例启动的目标容器作为支撑对应用代码进行调试的容器,保证可以及时对运行失败的应用代码进行调试,提高了代码调试的及时性和灵活性。通过在获取的应用代码的预设位置添加调试断点并加载至目标容器中的方式,可以保证后续在目标容器中进行代码调试时,能够利用调试断点对代码进行分段调试,增加了代码调试的灵活性和便利性。
在一种实施例中,针对S101中利用目标运行实例启动目标容器的步骤,在确定目标容器启动完成的情况下,可以开启目标运行实例的调试功能。
这里,目标运行实例的调试功能为用于对运行在目标容器中的目标运行实例进行调试的功能。由于目标运行实例可以为Node.js实例,所以在具体实施时,可以利用Node.jsinspector模块开启目标运行实例的调试功能。其中,Node.js inspector是Node.js提供的一种检查工具,可以用于调试Node.js代码,实时收集Node.js进程的堆内存快照HeapSnapshot。
在开启目标运行实例的调试功能之后,方便后续对加载至目标运行实例对应的目标容器中的应用代码进行调试。
在一种实施例中,针对S102中的获取应用代码并在应用代码的预设位置添加调试断点的步骤,可以按照以下步骤实施:
步骤一、对应用代码对应的代码读取方式进行修改,得到修改后的代码读取方式。
这里,对应用代码进行读取的代码读取方式可以为require方式,在利用require方式进行应用代码读取过程中,依赖于require方式中的目标函数,基于目标函数可以实现对应用代码读取的准确读取。具体的,目标函数可以为fs.readFileSync函数,fs.readFileSync是Node.js中的一种同步读取代码的方式。
具体实施时,可以通过改写fs.readFileSync函数的方式,使在基于改写后的fs.readFileSync函数进行应用代码的读取时,能够主动在读取的应用代码的预设位置处添加调试断点。
由于fs.readFileSync函数为require方式中的函数,所以修改fs.readFileSync函数,即为修改require方式,在fs.readFileSync函数被修改了之后,也即得到了修改后的代码读取方式。
步骤二、利用修改后的代码读取方式,读取应用代码,并在读取应用代码的过程中,在应用代码的预设位置添加调试断点,得到待调整的应用代码。
具体实施时,可以响应于客户端发起的针对目标运行实例的代码加载请求,利用修改后的代码读取方式(修改了fs.readFileSync函数的require方式)读取存储的应用代码,并在应用代码的预设位置处添加调试断点debugger,从而,得到待调整的应用代码。
在一种实施例中,在获取应用代码之前,还包括建立目标运行实例和应用代码之间的触发依赖关系的步骤,具体实施时,可以先确定目标应用的应用代码在服务端对应的代码存储位置,基于代码存储位置确定代码存储路径信息。这里,存储路径信息用于表征获取应用代码的路径,在一种实施方式中,存储路径信息可以为代码存储位置;或者,存储路径信息可以包括指向代码存储位置的多个路径位置。
之后,可以基于存储路径信息建立目标运行实例和应用代码之间的触发依赖关系。
这里,触发依赖关系用于表征应用代码对应的存储路径信息和目标运行实例之间的映射关系,用于加载应用代码。
具体实施时,可以直接建立存储路径信息和目标运行实例之间的映射关系,将该映射关系作为目标运行实例和应用代码之间的触发依赖关系。
进一步的,针对获取应用代码并在应用代码的预设位置添加调试断点的步骤,可以在确定需要获取应用代码的情况下,基于触发依赖关系对应的存储路径信息,利用修改后的代码读取方式,到代码存储位置处获取应用代码,并利用修改后的代码读取方式,在应用代码的预设位置添加debugger断点,从而得到待调整的应用代码。
在一种实施例中,针对S102中的响应于客户端发起的针对目标运行实例的代码加载请求的步骤,可以按照以下步骤实施:
①:响应于客户端发起的容器连接请求,建立目标容器和客户端之间的目标连接。
这里,容器连接请求为用于和服务端中的容器建立连接的请求,为用户在客户端发起的,目的在于对容器中的应用代码进行调试。具体的,容器连接请求可以为通过Node.js Inspector WebSocket发起的、与容器建立连接的请求。
具体实施时,在目标运行实例的调试功能被开启之后,用户可以在客户端通过Node.js Inspector WebSocket,发起建立和服务端中目标运行实例对应的目标容器的容器连接请求,进而,服务端可以响应于接收到的容器连接请求,建立目标容器和发起请求的客户端之间的目标连接。
②:利用目标连接,获取并响应于客户端发起的针对目标运行实例的代码加载请求。
这里,目标连接用于客户端和服务端之间的双向通信。
具体实施时,服务端可以利用目标连接,获取用户在客户端发起的针对目标运行实例的代码加载请求,并在获取到代码加载请求之后,对其进行响应,将应用代码加载在目标容器中。
在一种实施例中,代码调试操作中可以包括指示的调试位置,调试位置可以为需要添加debugger断点的位置。
针对响应于客户端的代码调试操作,在目标容器中对待调整的应用代码进行调试的步骤,这里。由于在待调整的应用代码的预设位置,具体的为头部位置处,存在debugger断点,所以该debugger断点会在运行待调整的应用代码之前就触发,从而中断运行。进而,用户可以基于该中断对在客户端发起代码调试操作。之后,客户端可以响应于客户端的代码调试操作,确定代码调试操作对应的调试位置。在代码调试操作指示的调试位置处添加调试断点,其中,添加的调试断点占单独一个代码行。
进一步的,可以基于添加的调试断点,启动对调试位置对应的应用代码段的调试。
这里,调试位置对应的应用代码段的代码可以为从应用代码对应的起始行起到调试位置对应的代码行止的代码。
具体的,可以在添加调试断点之后,启动对调试位置对应的应用代码段的编译、运行等操作,继而,可以确定调试位置对应的应用代码段的调试结果。其中,调试结果可以包括调试成功,也即,调试位置对应的应用代码段的代码运行成功;调试结果还可以包括调试失败,也即,调试位置对应的应用代码段的代码运行失败。
在调试结果指示调试成功的情况下,可以确定调试位置对应的应用代码段不存在异常,然后可以继续对其他位置的应用代码进行调试,例如,添加新的断点,对代码进行编辑,如修改,删除、增加等,直至确定整段的应用代码均不存在异常时,得到调试好的应用代码。
在一种实施例中,在调试结果指示应用代码段存在错误的情况下,也即在调试结果指示调试失败的情况下,服务端可以基于用户在客户端的代码调试操作,确定代码修改信息。其中,代码修改信息可以包括增加的代码信息、删除的代码信息、修改的代码信息等等。
进一步的,服务端可以基于代码修改信息,对目标容器中的应用代码段进行修改,再对修改后的应用代码段进行重新运行、编译等,最终完成对应用代码段的重新调试,得到调试好的应用代码段。
这里,需要说明的是,在对目标容器中的应用代码(或应用代码段)进行调试的过程中,添加调试断点、对应用代码进行修改、增加、删除、编译、运行等操作可以包括执行多次,此处不进行限定,直至得到调试好的应用代码为止。
在一种实施例中,在利用上述方法,在目标容器中对运行失败的应用代码中的至少部分应用代码段调试完毕之后,可以将在各个应用代码段中添加的调试断点删除,从而,得到调整好的目标应用的应用代码,也即,得到调整好的目标应用。
如图2所示,为本公开实施例所提供的一种代码调试方法的完整实施流程图,可以包括以下步骤:
S201:响应于客户端的目标应用运行请求,加载目标应用的应用代码,在应用代码运行失败的情况下,初始化目标运行实例并利用目标运行实例启动目标容器。
S202:在确定目标容器启动完成的情况下,开启目标运行实例的调试功能。
S203:对应用代码对应的代码读取方式进行修改,得到修改后的代码读取方式。
S204:确定应用代码的存储路径信息,并基于存储路径信息建立目标运行实例和应用代码之间的触发依赖关系。
S205:响应于客户端发起的容器连接请求,建立目标容器和客户端之间的目标连接。
S206:利用目标连接,获取客户端发起的针对目标运行实例的代码加载请求。
S207:响应于客户端发起的针对所述目标运行实例的代码加载请求,利用修改后的代码读取方式,基于触发依赖关系对应的存储路径信息,获取应用代码,并在获取应用代码的过程中,在应用代码的预设位置添加调试断点,得到待调整的应用代码。
S208:将得到的待调整的应用代码加载至目标容器。
S209:响应于客户端的代码调试操作,在目标容器中对待调整的应用代码进行调试。
关于S201~S209的具体实施步骤,可以参照上述各实施例,此处不再赘述。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与代码调试方法对应的代码调试装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述代码调试方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
如图3所示,为本公开实施例提供的一种代码调试装置的示意图,包括:
启动模块301,用于响应于客户端的目标应用运行请求,加载所述目标应用的应用代码,在所述应用代码运行失败的情况下,初始化目标运行实例并利用所述目标运行实例启动目标容器;
获取模块302,用于响应于客户端发起的针对所述目标运行实例的代码加载请求,获取所述应用代码并在所述应用代码的预设位置添加调试断点,将得到的待调整的应用代码加载至所述目标容器;
调整模块303,用于响应于客户端的代码调试操作,在所述目标容器中对所述待调整的应用代码进行调试。
在一种可能的实施方式中,所述启动模块301,用于利用所述目标运行实例启动所述目标容器,并在确定所述目标容器启动完成的情况下,开启所述目标运行实例的调试功能。
在一种可能的实施方式中,所述获取模块302,用于对所述应用代码对应的代码读取方式进行修改,得到修改后的代码读取方式;
利用所述修改后的代码读取方式,读取所述应用代码,并在读取所述应用代码的过程中,在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,所述装置还包括依赖建立模块304;
所述依赖建立模块304,用于在获取所述应用代码之前,按照以下步骤建立所述目标运行实例和所述应用代码之间的触发依赖关系:
确定所述应用代码的存储路径信息,并基于所述存储路径信息建立目标运行实例和所述应用代码之间的触发依赖关系;
所述获取模块302,用于基于所述触发依赖关系对应的存储路径信息,获取所述应用代码,并在所述应用代码的预设位置添加所述调试断点,得到所述待调整的应用代码。
在一种可能的实施方式中,所述获取模块302,用于响应于所述客户端发起的容器连接请求,建立所述目标容器和所述客户端之间的目标连接;
利用所述目标连接,获取并响应于所述客户端发起的针对所述目标运行实例的代码加载请求。
在一种可能的实施方式中,所述调整模块303,用于响应于客户端的代码调试操作,在所述代码调试操作指示的调试位置,添加所述调试断点,并启动对所述调试位置对应的应用代码段的调试。
在一种可能的实施方式中,所述调整模块303,还用于在对所述应用代码段进行调试之后,在调试结果指示所述应用代码段存在错误的情况下,基于所述代码调试操作对应的代码修改信息,对所述应用代码段进行修改,并重新对修改后的应用代码段进行调试。
在一种可能的实施方式中,所述调整模块303,还用于在对所述待调整的应用代码中至少部分应用代码段调试完毕之后,得到调整好的目标应用的应用代码。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
本公开实施例还提供了一种计算机设备,如图4所示,为本公开实施例提供的一种计算机设备结构示意图,包括:
处理器41和存储器42;所述存储器42存储有处理器41可执行的机器可读指令,处理器41用于执行存储器42中存储的机器可读指令,所述机器可读指令被处理器41执行时,处理器41执行下述步骤:S101:响应于客户端的目标应用运行请求,加载目标应用的应用代码,在应用代码运行失败的情况下,初始化目标运行实例并利用目标运行实例启动目标容器;S102:响应于客户端发起的针对目标运行实例的代码加载请求,获取应用代码并在应用代码的预设位置添加调试断点,将得到的待调整的应用代码加载至目标容器以及S103:响应于客户端的代码调试操作,在目标容器中对待调整的应用代码进行调试。
上述存储器42包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换。
上述指令的具体执行过程可以参考本公开实施例中所述的代码调试方法的步骤,此处不再赘述。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的代码调试方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例所提供的代码调试方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的代码调试方法的步骤,具体可参见上述方法实施例,在此不再赘述。
该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。