一种跨进程调试方法和装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种跨进程调试方法和装置。
背景技术
在软件开发过程中,为了保证软件后期运行的可靠性,在开发初期通常会使用一些调试工具,通过调试命令对软件程序(以下简称程序)设置断点或是让程序单步执行,以此来跟踪调试程序进而及时排查程序错误。
程序运行时,基础服务框架通常会通过多进程方案来运行程序,多进程方案能够同时运行多个进程,如图1所示,不仅运行子进程A,同时运行子进程B,这样如果某一进程出现问题可以对该进程单独进行处理,不会影响其他进程的正常运行,这样不仅提升程序的稳定性,同时提高了系统资源的利用率。多进程运行时,通常由一个主进程创建多个子进程,实现多个子进程并行运行。
在对多进程进行调试时,调试工具如果对主进程进行调试,将无法调试该主进程创建的子进程所运行的程序,具体如图2的示例所示。如果对子进程进行调试,即直接调试子进程的运行应用程序,则无法启动主进程所创建辅助子进程,导致程序启动不完整,从而无法完整有效的调试程序,例如单独调试一个子进程运行的应用程序时,具体如图3所示,无法启动上述子进程所必须依赖的辅助子进程,这种启动和应用程序真实的生成环境启动方式不一致,不能保证调试的程序和最终生成环境运行的完全一致。因此,目前的解决方案对跨进程的程序进行调试时,其调试的准确性较低。
发明内容
为解决上述技术问题,本申请实施例提供一种跨进程调试方法和装置,用于提高跨进程调试的准确性。
本申请实施例采用下述技术方案:
一种跨进程调试方法,包括:主进程接收调试命令,所述调试命令用于调试待调试的应用程序,所述待调试的应用程序包括所述主进程创建的子进程所运行的应用程序,所述调试命令中包含调试工具;所述主进程创建调试子进程,所述调试子进程中包含所述调试工具和使用所述调试工具调试的由所述主进程创建的子进程所运行的应用程序;所述主进程运行所述调试命令,并启动所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
优选地,所述主进程创建调试子进程具体包括:所述主进程通过调用fork函数创建调试子进程。
优选地,所述主进程创建的每一个子进程分别对应一个所述调试子进程。
优选地,启动所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试,包括:若所述主进程创建的调试子进程的个数大于1时,并行启动不同的所述调试子进程,以使得各个所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
优选地,所述主进程运行所述调试命令之前,所述方法还包括:所述主进程创建辅助子进程。
一种跨进程调试装置,包括:调试命令接收模块,子进程创建模块和应用程序调试模块,其中:所述调试命令接收模块,用于接收调试命令,所述调试命令用于调试待调试的应用程序,所述待调试的应用程序包括所述主进程创建的子进程所运行的应用程序,所述调试命令中包含调试工具;所述子进程创建模块,用于创建调试子进程,所述调试子进程中包含所述调试工具和使用所述调试工具调试的由所述主进程创建的子进程所运行的应用程序;所述应用程序调试模块,用于运行所述调试命令,并启动所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
优选地,所述子进程创建模块,具体用于调用fork函数创建调试子进程。
优选地,所述子进程创建模块创建的每一个子进程分别对应一个所述调试子进程。
优选地,若所述主进程创建的调试子进程的个数大于1时,所述应用程序调试模块,并行启动不同的所述调试子进程,以使得各个所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
优选地,所述装置还包括辅助子进程创建模块,其中:所述辅助子进程创建模块,用于创建辅助子进程。
本申请实施例采用的上述至少一个技术方案能够达到以下有益效果:主进程接收调试命令之后创建调试子进程,调试子进程中包含调试工具和使用调试工具调试的由主进程创建的子进程所运行的应用程序,通过主进程运行所述调试命令并启动调试子进程中包含的调试工具对子进程所运行的应用程序进行调试,这种调试环境和待调试的应用程序真实的运行环境保持一致,相对于现有技术中仅仅通过启动子进程进而对子进程进行调试的方法,提高了跨进程调试的准确性。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为现有技术中多进程运行示例图;
图2为现有技术中一种调试方法示意图;
图3为现有技术中另一种调试方法示意图;
图4为本申请实施例1提供的一种跨进程调试方法的实现流程示意图;
图5为本申请实施例1提供的跨进程调试方法的运行示例图;
图6为本申请实施例2提供的一种跨进程调试装置结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
首先对名词进行说明:
进程:进程通常为可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配和调度的独立单位,一个进程,包括代码、数据和分配给进程的资源。它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。
应用程序:简称程序,程序只通常为一组命令的有序集合。
调试:将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。
实施例1
为解决上述技术问题,本申请实施例1提供了一种跨进程调试方法,用于提高跨进程调试的准确性,所述跨进程调试,可以理解为对主进程进行操作进而能够调试主进程创建的子进程所运行的应用程序。该方法的具体流程示意图如图4所示,包括下述步骤:
步骤11:主进程接收调试命令;
为了提升业务应用水平的稳定性,在基础服务框架的场景下,通常是由主进程来创建多个子进程,每个子进程分别运行与其对应的应用程序,进而达到多进程运行的目的,这里提到的主进程是相对于其创建的多个子进程而言,相对于子进程,其还可以称为父进程。在此步骤中,主进程首先接收调试命令,调试命令用于调试待调试的应用程序,待调试的应用程序可以包括主进程创建的子进程所运行的应用程序。其中,每个子进程均能够运行与其对应的应用程序,每个子进程之间相互不干扰。另外调试命令中包含调试工具,通过运行调试工具进而能够提供给待调试的应用程序所需的调试环境。
步骤12:所述主进程创建调试子进程;
在正常运行条件下,主程序能够创建多个子进程,在此调试状态下,主进程在接收到调试命令后,可以根据待调试的应用程序,进而创建与运行该待调试的应用程序的子进程所对应的调试子进程。创建调试子进程时,可以为主进程运行上述调试命令,进而根据调试工具在调试状态下创建与主进程的数据段、代码段和堆栈段相同或者是相关的调试子进程。主进程在具体创建调试子进程时,还可以在调试状态下调用fork函数创建调试子进程,当然还可以为其它的创建方式。另外,主进程创建的调试子进程的数量可以为一个,即每次单独对一个调试子进程对应的应用程序进行单独调试,当然还可以一次创建多个调试子进程。
上述创建的调试子进程中包含调试工具,同时包含使用所述调试工具调试的由所述主进程创建的子进程所运行的应用程序,这里的调试工具可以为主进程接收到的调试命令中包含的调试工具。
步骤13:所述主进程运行所述调试命令,并启动所述调试子进程中包含的所述调试工具。
主进程在创建调试子进程时,可以将上述调试命令添加到创建的调试子进程中,其中调试命令中包括有调试工具。这样,主进程运行所述调试命令,并启动所述调试子进程中包含的调试工具,并根据调试命令对由所述主进程创建的子进程所运行的应用程序进行调试。
需要说明的是,在实施例1的执行过程中,辅助子进程也在运行,该实施例的应用场景可以如图5所示,这里的辅助子进程为运行应用程序的子进程所依赖的进程,例如辅助子进程提供不同子进程之间进行通信的接口,进而能够使不同的子进程之间通过上述接口进而实现通信。另外,图5所示的主进程运行的程序和辅助子进程运行的程序通常不需要调试。
采用实施例1提供的该方法,主进程接收调试命令之后创建调试子进程,调试子进程中包含调试工具和使用调试工具调试的由主进程创建的子进程所运行的应用程序,通过主进程运行所述调试命令并启动调试子进程中包含的调试工具对子进程所运行的应用程序进行调试,这种调试环境和待调试的应用程序真实的运行环境保持一致,相对于现有技术中仅仅通过启动子进程进而对子进程进行调试的方法,提高了跨进程调试的准确性。。
需要说明的是,实施例1所提供方法的各步骤的执行主体均可以是同一模块,如主程序模块,其能够对跨进程的应用程序进行调试;或者,该方法的各步骤也可以由不同的模块作为执行主体。比如,步骤11和步骤12的执行主体可以为主进程模块,步骤13的执行主体可以为调试子进程模块等。
在实施例1的步骤12中主进程创建调试子进程,具体可以按如下步骤:所述主进程通过调用fork函数创建调试子进程。主进程通过调用fork函数创建调试子进程时,还可以将调试主进程的调试工具同样fork到调试子进程中,这样同时存在主进程、调试子进程和辅助子进程,进而使调试环境和待调试的应用程序真实的运行环境保持一致。
fork函数通常广泛应用于基础服务框架扩展的场景中,如在实施例1的应用场景中,通常主进程通常只负责通过fork函数生成子进程,派出子进程去执行框架下的子任务,这些任务可能多变、可能更新频繁,但通过使用fork函数,还可以使用exec函数,进而使创建的调试子进程能够对主进程创建的子进程所运行的应用程序进行调试,即保证了主进程的稳定,避免频繁更新程序。具体而言,fork函数创建的子进程几乎是父进程的副本,如果让子进程去执行除主进程对应的程序之外的应用程序,exec函数族可以根据指定的文件名或目录名找到可执行文件,并用它来取代原创建的子进程中的数据段、代码段和堆栈段,在执行完之后,创建的子进程除了进程号外,其他全部被新应用程序的内容替换。
在实施例1的步骤12中,主进程创建调试子进程时,其中所述主进程创建的每一个子进程分别对应一个所述调试子进程。
对于主进程创建的每一个子进程,此处的子进程是相对于正常工作条件即非调试状态下而言的,在正常工作时,主程序能够创建多个子进程进而实现多进程运行,对于每个子进程而言,均有唯一与其对应的能够运行的应用程序。在具体调试时,相对于每一个子进程,也即每一个待调试的应用程序,主进程均可以创建一个唯一的与其对应的调试子进程。
在实施例1的步骤13中,启动所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试,在具体实施时还存在以下两种情况:
若主进程创建的除辅助子进程之外只有一个调试子进程,那么调试子进程即可单独运行对与其对应的应用程序进行调试。
若所述主进程创建的调试子进程的个数大于1时,并行启动不同的所述调试子进程,以使得各个所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。即每个调试子进程对与其一一对应的应用程序进行调试,各个调试子进程之间的调试过程互相不受干扰。
在实施例1的步骤13之前,所述方法还可以包括以下步骤:所述主进程创建辅助子进程。如前所述,在实施例1的各个步骤执行之前,辅助子进程可能已经在运行,此时按照实施例1的步骤执行,则可以保证所调试的应用程序的生成环境和正常工作时的运行环境一致。
如果在实施例1的各个步骤执行之前,辅助子进程没有运行,则在实施例1的步骤11之后步骤13之前执行以下步骤:主进程创建辅助子进程。这样既可使如图5所示的整个系统启动完整,能够使调试子进程的启动和真实的生成环境中子进程的启动方式一致,最终保证调试的应用程序和最终生成环境运行的一致。
实施例2
基于相同的发明构思,实施例2提供了一种跨进程调试装置,用于提高跨进程调试的准确性。如图6所示,该装置包括:调试命令接收模块21,子进程创建模块22和应用程序调试模块23,其中:
所述调试命令接收模块21,可以用于接收调试命令,所述调试命令用于调试待调试的应用程序,所述待调试的应用程序包括所述主进程创建的子进程所运行的应用程序,所述调试命令中包含调试工具;
所述子进程创建模块22,可以用于创建调试子进程,所述调试子进程中包含所述调试工具和使用所述调试工具调试的由所述主进程创建的子进程所运行的应用程序;
所述应用程序调试模块23,可以用于运行所述调试命令,并启动所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
采用实施例2提供的该装置,由于调试命令接收模块21接收调试命令之后,子进程创建模块22创建调试子进程,调试子进程中包含调试工具和使用调试工具调试的由主进程创建的子进程所运行的应用程序,应用程序调试模块23运行调试命令,并启动调试子进程中包含的调试工具对子进程所运行的应用程序进行调试,这种调试环境和待调试的应用程序真实的运行环境保持一致,相对于现有技术中仅仅通过启动子进程进而对子进程进行调试的方法,提高跨进程调试的准确性。
实施例2中的子进程创建模块22在创建调试子进程时,具体可以通过调用fork函数创建调试子进程。
另外,子进程创建模块22创建的每一个子进程可以分别对应一个所述调试子进程。
若所述主进程创建的调试子进程的个数大于1时,上述应用程序调试模块23,可以用于并行启动不同的所述调试子进程,以使得各个所述调试子进程中包含的所述调试工具对由所述主进程创建的子进程所运行的应用程序进行调试。
实施例2提供的装置还可以包括辅助子进程创建模块,其中:所述辅助子进程创建模块,用于创建辅助子进程。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序命令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序命令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的命令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序命令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的命令产生包括命令装置的制造品,该命令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序命令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的命令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读命令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。