Processing

Please wait...

Settings

Settings

Goto Application

1. WO2020114217 - PROCESS DEBUGGING METHOD AND APPARATUS, AND STORAGE MEDIUM

Document

说明书

发明名称 0001   0002   0003   0004   0005   0006   0007   0008   0009   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   0020   0021   0022   0023   0024   0025   0026   0027   0028   0029   0030   0031   0032   0033   0034   0035   0036   0037   0038   0039   0040   0041   0042   0043   0044   0045   0046   0047   0048   0049   0050   0051   0052   0053   0054   0055   0056   0057   0058   0059   0060   0061  

权利要求书

1   2   3   4   5   6   7   8   9   10  

附图

1   2   3   4   5   6   7   8   9   10  

说明书

发明名称 : 对进程进行调试的方法、装置及存储介质

[0001]
交叉引用
[0002]
本发明要求在2018年12月05日提交至中国专利局、申请号为201811484873.9、发明名称为“对进程进行调试的方法、装置及存储介质”的中国专利申请的优先权,该申请的全部内容通过引用结合在本发明中。

技术领域

[0003]
本发明涉及操作系统技术领域,特别是涉及一种对进程进行调试的方法、装置及存储介质。

背景技术

[0004]
现代主流的操作系统,例如Linux和Windows均采用内核态与用户态分离,支持多进程且进程空间各自独立。在此基础上开发的应用软件,一旦执行后就运行在自身的进程空间。程序开发者要想对应用程序进行调试,必须使用专门的调试器,比如gdb,attach到待调试线程上,才能获取到该进程空间内当前的变量取值以及堆栈调用关系等信息。由于gdb需要打断程序运行,且本身有内存占用等开销,对于现网商用环境下的简单调试与维护不适合使用这种方式。有鉴于此,需要考虑在不影响程序正常运行的前提下,实现一种轻便快捷的方式,获取进程对应的运行状态和相关现场信息。
[0005]
发明内容
[0006]
本发明提供一种对进程进行调试的方法、装置及存储介质。
[0007]
根据本发明的第一个方面,提供了一种对进程进行调试的方法,包括:将接收到的针对目标进程的命令写入预先创建的套接字端口;通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令;通过输出处理任务从所述伪终端读取所述命令的运行结果。
[0008]
根据本发明的第二个方面,一种对进程进行调试的装置,包括:第一写入模块,用于将接收到的针对目标进程的命令写入预先创建的套接字端口;第一读取模块,用于通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令;第二读 取模块,用于通过输出处理任务从所述伪终端读取所述命令的运行结果。
[0009]
根据本公开的第三个方面,提供了一种对进程进行调试的装置,包括:处理器;用于存储处理器可执行指令的存储器;当所述指令被处理器执行时,执行如下操作:将接收到的针对目标进程的命令写入预先创建的套接字端口;通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令;通过输出处理任务从所述伪终端读取所述命令的运行结果。
[0010]
根据本公开的第四个方面,提供了一种非临时性计算机可读存储介质,当所述存储介质中的指令由处理器执行时,使得处理器能够执行根据本公开第一个方面所述的对进程进行调试的方法。
[0011]
根据本公开的第五个方面,提供了一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行以上各个方面所述的方法。

附图说明

[0012]
图1是根据一示例性实施例示出的一种对进程进行调试的方法的流程图;
[0013]
图2是根据一示例性实施例示出的一种对进程进行调试的方法的流程图;
[0014]
图3是根据一示例性实施例示出的一种对进程进行调试的方法的流程图;
[0015]
图4是根据一示例性实施例示出的Ushell的整体架构示意图;
[0016]
图5是根据一示例性实施例示出的Ushell代理模块中用户输入命令的示意图;
[0017]
图6是根据一示例性实施例示出的Ushell代理模块中业务进程输出的示意图;
[0018]
图7是根据一示例性实施例示出的重定向模块的示意图;
[0019]
图8是根据一示例性实施例示出的命令解析模块的示意图;
[0020]
图9是根据一示例性实施例示出的一种对进程进行调试的装置的框图;
[0021]
图10是根据一示例性实施例示出的一种对进程进行调试的装置的框图。

具体实施方式

[0022]
下面将结合本发明实施例中的附图,对本发明的实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0023]
在对本发明提供一种可方便地对各进程进行实时调试管理的工具,该工具称为统一Shell(以下简称Ushell),通过该工具可对各进程进行实时调试和管理。例如,用户可以借助Ushell客户端工具,或者直接通过telnet登陆到Ushell服务端的管理界面,查看当前正在运行的进程、各进程的状态,并进一步切换到任意一个进程的Shell下,执行指定的调试命令、查看该进程内部的执行状态和内存信息、启停或创建任意线程以及管理该用户进程。本发明提供的对进行进行调试的方法可由Ushell工具执行。
[0024]
图1是根据一示例性实施例示出的一种对进程进行调试的方法的流程图,如图1所示,该方法包括如下步骤:步骤101:将接收到的针对目标进程的命令写入预先创建的套接字端口;在进行初始化阶段,可创建一个套接字端口(Ushell socket),将其作为Ushell客户端的输出方向,同时,所有的外部输入的命令都可来自该套接字端口,可通过输入处理任务读取外部输入命令。
[0025]
其中,针对目标进程的命令可由用户基于Ushell客户端输入,该命令可以是字符串。
[0026]
步骤102:通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令;其中,伪终端可以是在进程初始化阶段创建的。
[0027]
在步骤102中,套接字端口可与管理进程的Ushell代理模块建立连接,从而可通过运行输入处理任务从套接字端口读取命令,从而命令解析器可在自身的伪终端的slave端(从端)获得该命令。其中,Ushell代理模块驻留在管理进程中,它在一个指定端口上,负责收集、发布和管理各个进程以及管理进程自身的Ushell伪终端信息。Ushell代理模块还可向用户发布可供连接的业务进程伪终端列表。例如,Ushell代理模块接收来自用户发起的连接请求,并对远程用户进行鉴权和认证,鉴权通过后生成一个会话,Ushell代理模块将远程输入转发给对应的应用进程,同时从应用进程读取输出,并写入 会话。
[0028]
步骤103:通过输出处理任务从所述伪终端读取所述命令的运行结果。
[0029]
在步骤103中,可通过运行输出处理任务从伪终端的master(主端)读取到命令的执行结果。
[0030]
本发明实施例的对进程进行调试的方法,通过预设的套接字端口与管理进程建立连接,通过输入处理任务接收用户输入的命令,将用户输入的命令写入套接字端口,以及从套接字端口中读取该命令的运行结果,可实现在进程内部执行调试命令,控制程序的走向,查看进程空间的内存信息,管理线程的启停以及查看线程的状态等操作,从而方便的实现了对进程的实时调试与管理。该工具能为应用软件的开发和维护提供极大便利。
[0031]
图2是根据一示例性实施例示出的一种对进程进行调试的方法的流程图,如图2所示,该方法在图1所示的基础上,还可包括:步骤201:接收伪终端列表查询命令;例如,用户可通过Ushell客户端输入伪终端列表查询命令。
[0032]
步骤202:根据所述查询命令输出所述伪终端列表,所述伪终端列表中包括可访问的业务进程的伪终端。
[0033]
其中,步骤201-步骤202可在步骤101-步骤103的任意步骤之前或之后执行,图2仅示出了步骤201以及步骤202在步骤101之前执行的一种情况。
[0034]
在向用户输入伪终端列表后,用户查看该列表,获知可供连接的业务进程,从而通过Ushell客户端输入命令,在接收到该命令后,可根据该命令从指定的伪终端上读取并输出与该命令对应的内容,在将该内容呈现给用户,例如,可在通过客户端显示给用户。
[0035]
图3是根据一示例性实施例示出的一种对进程进行调试的方法的流程图,如图3所示,所述方法在图1所示的基础上还可包括:步骤301:在通过输出处理任务从所述伪终端读取所述命令的运行结果之后,将所述运行结果写入所述套接字端口,或者,将所述运行结果打印到控制台。在将运行结果写入套接字端口时,可从套接字端口读取该运行结果,此外,还可该运行结果显示在屏幕上,供用户查看。
[0036]
在一种可实现方式中,本发明的提供的对进程进行调试的方法还可包括:
[0037]
将接收到的针对目标进程的命令写入预先创建的套接字端口之前,为所述目标进程创建所述伪终端;将所述目标进程的标准写/读I/O重定向到所述伪终端的从端。
[0038]
在一种可实现方式中,所述命令解析器解析所述命令可包括:通过预设调用接口访问所述目标进程的符号表;根据所述符号表将所述命令解析为表达式。
[0039]
为了便于对本发明实施例的对进程进行调试的方法的进行理解,以下结合图4基于Ushell的整体架构对该方法进行简要说明。
[0040]
用户借助Ushell客户端工具或直接使用终端通过Telnet访问Ushell代理模块,在对用户鉴权通过后,用户输入的命令被重定向到执行进程的shell,如图4中所示的应用进程A以及应用进程B,通过应用进程A或应用进程B中的解析器对该命令进行解析后完成该命令的执行,并将该命令的输出结果重定向到伪终端的slave端,在将该输出结果写入套接字端口,返回给用户。
[0041]
图5是根据一示例性实施例示出的Ushell代理模块中用户输入命令的示意图,其中,控制台用户即从串口登陆Ushell的用户,而Socket用户则包括通过Ushell客户端工具和telnet登陆的用户。所有用户都可在用户会话表中被统一管理,用户会话表可设置于用户会话管理模块中,远程用户输入的命令可通过会话表和Target表协作完成后将输入发送给指定的业务进程。图6是根据一示例性实施例示出的Ushell代理模块中业务进程输出的示意图,如图6所示,业务进程的输出由管理进程代理中ReadTargetTask任务来统一接收,并根据会话表中记录的信息,将输出发送给指定的用户。
[0042]
图7是根据一示例性实施例示出的重定向模块的示意图,重定向模块驻留在管理进程和各个业务进程上,可作为沟通命令解析器与Ushell代理的中介。在进程初始化阶段,负责保存和设置终端属性,可创建一个伪终端(命令解析器的伪终端),将该伪终端的slave端设置为当前的标准I/O;创建一个套接字(Ushell socke)端口,将其作为Ushell的输出方向;所有的输入都可通过输入处理任务从Ushell socket进行读取;默认输出方向可是Ushell socket,可由输出处理任务在伪终端和Ushellsocket之间进行中转。在Ushell稳态运行时,重定向模块可负责接收各个方向上的输入,包括串口控制台,Ushell UDP(User Datagram Protocol,用户数据报协议)方向以及Telnet方向,并将本进程的标准输出向控制台打印或向管理进程以Ushell报文的形式转发。
[0043]
在进程初始化完成后,稳态运行下,工作流程可包括:用户输入的命令字符串被Ushell代理模块转发,写到Ushell socket。
[0044]
输入处理任务在Ushell客户端读到该命令字符串。
[0045]
命令解析器在自身的伪终端slave端获得命令,解析并运行该命令。因为进程当前的标准I/O均为该伪终端的slave,因此命令执行的输出结果(也简称为命令执行结果)也被写到伪终端的slave端。
[0046]
输出处理任务在伪终端的master端读取到命令的输出结果,根据当前的输出方向,将命令的输出结果写到Ushell socket。
[0047]
Ushell代理模块从该业务进程的Ushell socket读取到命令的输出结果,通过写socket将其返回给用户或者直接打印到控制台。
[0048]
图8是根据一示例性实施例示出的命令解析模块的示意图,如图8所示,命令解析模块可包含一个内部shell任务和一个C语言表达式解析引擎(为解析器的一个示例)。其中,内部shell任务驻留在管理进程和各个应用进程上,负责从伪终端的slave端不断读取输入的调试命令,并将调试命令交给解析器模块来解析执行。解析器驻留在管理进程和各个应用进程上,它负责解析调试命令字符串,利用符号表对输入的调试命令行进行C语言表达式解析。C语言引擎可利用Lex和Yacc对表达式分别作词法分析和语法分析,该命令解析模块工作时需要访问进程的符号表,因此要为它提供符号表的调用接口。内部shell任务的主要可用于从标准输入读入一个表达式字符串(例如,可以为用户输入的命令)进行语言解析,符号表用于查找相关符号在内存中的地址。表达式执行的结果可直接向标准输出进行打印。解析器提供解析调试命令表达式功能,它能可用于检查用户输入的命令是否符合语法规范,以及确定一个调试命令是调试函数还是变量。但实际执行这个函数或变量时,需依赖于符号表,符号表记录了符号的真实地址所在。进程的符号表可在进程初始化时通过读取进程自身可执行ELF(Executable and Linkable Format,可执行与可链接格式)文件来提取的。而动态库的符号表则可以通过读取/proc/PID(Process Identification,进程标识)/maps文件的方法来获取进程所引用的动态库名及加载的基地址,结合从库文件获取到的符号偏移,最终计算得出符号的真实地址。进程的符号表是以全局表的形式存放,动态库的符号表是以共享内存的形式存放,供各个进程间共享,符号表是用户调试命令表达式解析的依据。
[0049]
其中,上述管理进程、应用进程是逻辑上的概念,是一种支持多进程架构的设计。管理进程可以是业务进程的总入口,负责启动和管理各应用的进程。在物理上,管理进程与应用进程可分可合。
[0050]
图9是根据一示例性实施例示出的一种对进程进行调试的装置的框图, 如图9所示,该装置90包括:第一写入模块91,用于将接收到的针对目标进程的命令写入预先创建的套接字端口;第一读取模块92,用于通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令;第二读取模块93,用于通过输出处理任务从所述伪终端读取所述命令的运行结果。
[0051]
上述装置90在图9所示结构的基础上,还可包括上文所述的Ushell代理模块、命令解析模块以及重定向模块的任意一个或多个模块,或还可包括用于实现这些模块所实现功能的任意一个或多个子模块。
[0052]
在一种可实现方式中,所述对进程进行调试的装置还可包括:接收模块,用于接收伪终端列表查询命令;输出模块,用于根据所述查询命令输出所述伪终端列表,所述伪终端列表中包括可访问的业务进程的伪终端。
[0053]
在一种可实现方式中,所述对进程进行调试的装置还可包括:第二写入模块,用于在通过输出处理任务从所述伪终端读取所述命令的运行结果之后,将所述运行结果写入所述套接字端口,或者,将所述运行结果打印到控制台。
[0054]
在一种可实现方式中,所述对进程进行调试的装置还可包括:创建模块,用于将接收到的针对目标进程的命令写入预先创建的套接字端口之前,为所述目标进程创建所述伪终端;重定向模块,用于将所述目标进程的标准写/读I/O重定向到所述伪终端的从端。
[0055]
在一种可实现方式中,所述命令解析器可包括:访问模块,用于通过预设调用接口访问所述目标进程的符号表;解析模块,用于根据所述符号表将所述命令解析为表达式。
[0056]
图10是根据一示例性实施例示出的一种对进程进行调试的装置的框图。如图10所示,该装置900可以包括:处理器901,存储器902,多媒体组件903,输入/输出(I/O)接口904,以及通信组件905。
[0057]
其中,处理器901用于控制该装置900的整体操作,以完成上述的对进程进行调试的方法中的全部或部分步骤。存储器902用于存储各种类型的数据以支持在该装置900的操作,这些数据例如可以包括用于在该装置900上操作的任何应用程序或方法的指令,以及应用程序相关的数据,例如联系人数据、收发的消息、图片、音频、视频等等。该存储器902可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,例如静态随机存取存储器(Static Random Access Memory,简称SRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,简称EEPROM), 可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,简称EPROM),可编程只读存储器(Programmable Read-Only Memory,简称PROM),只读存储器(Read-Only Memory,简称ROM),磁存储器,快闪存储器,磁盘或光盘。多媒体组件903可以包括屏幕和音频组件。其中屏幕例如可以是触摸屏,音频组件用于输出和/或输入音频信号。例如,音频组件可以包括一个麦克风,麦克风用于接收外部音频信号。所接收的音频信号可以被进一步存储在存储器902或通过通信组件905发送。音频组件还包括至少一个扬声器,用于输出音频信号。I/O接口904为处理器901和其他接口模块之间提供接口,上述其他接口模块可以是键盘,鼠标,按钮等。这些按钮可以是虚拟按钮或者实体按钮。通信组件905用于该装置900与其他设备之间进行有线或无线通信。无线通信,例如Wi-Fi,蓝牙,近场通信(Near Field Communication,简称NFC),2G、3G或4G,或它们中的一种或几种的组合,因此相应的该通信组件905可以包括:Wi-Fi模块,蓝牙模块,NFC模块。
[0058]
在一示例性实施例中,装置900可以被一个或多个应用专用集成电路(Application Specific Integrated Circuit,简称ASIC)、数字信号处理器(Digital Signal Processor,简称DSP)、数字信号处理设备(Digital Signal Processing Device,简称DSPD)、可编程逻辑器件(Programmable Logic Device,简称PLD)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述的对进程进行调试的方法。
[0059]
在另一示例性实施例中,还提供了一种包括程序指令的非临时性计算机可读存储介质,例如包括程序指令的存储器902,上述程序指令可由装置900的处理器901执行以完成上述的对进程进行调试的方法。
[0060]
在另一示例性实施例中,还提供了一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行上述任意方法实施例中的方法。
[0061]
尽管为示例目的,已经公开了本发明的优选实施例,本领域的技术人员将意识到各种改进、增加和取代也是可能的,因此,本发明的范围应当不限于上述实施例。

权利要求书

[权利要求 1]
一种对进程进行调试的方法,其中,包括: 将接收到的针对目标进程的命令写入预先创建的套接字端口; 通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令; 通过输出处理任务从所述伪终端读取所述命令的运行结果。
[权利要求 2]
根据权利要求1所述的方法,其中,所述方法还包括: 接收伪终端列表查询命令; 根据所述查询命令输出所述伪终端列表,所述伪终端列表中包括可访问的业务进程的伪终端。
[权利要求 3]
根据权利要求1所述的方法,其中,所述方法还包括: 在通过输出处理任务从所述伪终端读取所述命令的运行结果之后,将所述运行结果写入所述套接字端口,或者,将所述运行结果打印到控制台。
[权利要求 4]
根据权利要求1所述的方法,其中,所述方法还包括: 将接收到的针对目标进程的命令写入预先创建的套接字端口之前,为所述目标进程创建所述伪终端; 将所述目标进程的标准写/读I/O重定向到所述伪终端的从端。
[权利要求 5]
根据权利要求1至4任一项所述的方法,其中,所述命令解析器解析所述命令,包括: 通过预设调用接口访问所述目标进程的符号表; 根据所述符号表将所述命令解析为表达式。
[权利要求 6]
一种对进程进行调试的装置,其中,包括: 第一写入模块,用于将接收到的针对目标进程的命令写入预先创建的套接字端口; 第一读取模块,用于通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令; 第二读取模块,用于通过输出处理任务从所述伪终端读取所述命令的运行结果。
[权利要求 7]
根据权利要求6所述的装置,其中,所述装置还包括: 接收模块,用于接收伪终端列表查询命令; 输出模块,用于根据所述查询命令输出所述伪终端列表,所述伪终端列表中包括可访问的业务进程的伪终端。
[权利要求 8]
根据权利要求6所述的装置,其中,所述装置还包括: 第二写入模块,用于在通过输出处理任务从所述伪终端读取所述命令的运行结果之后,将所述运行结果写入所述套接字端口,或者,将所述运行结果打印到控制台。
[权利要求 9]
一种对进程进行调试的装置,其中,包括: 处理器; 用于存储处理器可执行指令的存储器; 当所述指令被处理器执行时,执行如下操作: 将接收到的针对目标进程的命令写入预先创建的套接字端口; 通过输入处理任务从所述套接字端口读取所述命令,以使命令解析器从所述目标进程的伪终端获取、解析并运行所述命令; 通过输出处理任务从所述伪终端读取所述命令的运行结果。
[权利要求 10]
一种非临时性计算机可读存储介质,当所述存储介质中的指令由处理器执行时,使得处理器能够执行根据权利要求1至5任一项所述的方法。

附图

[ 图 1]  
[ 图 2]  
[ 图 3]  
[ 图 4]  
[ 图 5]  
[ 图 6]  
[ 图 7]  
[ 图 8]  
[ 图 9]  
[ 图 10]