《进程调试方法及装置.pdf》由会员分享,可在线阅读,更多相关《进程调试方法及装置.pdf(14页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN102004692A43申请公布日20110406CN102004692ACN102004692A21申请号201010559840322申请日20101125G06F11/3620060171申请人中兴通讯股份有限公司地址518057广东省深圳市广东省深圳市南山区科技南路55号72发明人王才才74专利代理机构北京康信知识产权代理有限责任公司11240代理人余刚吴孟秋54发明名称进程调试方法及装置57摘要本发明公开了一种进程调试方法及装置,该方法包括代理线程接收到来自用户的调试命令,其中调试命令用于调试待调试的用户进程,代理线程预先设置在待调试的用户进程中;代理线程根据调试命。
2、令,调试待调试的用户进程。本发明可以实现故障的快速、准确定位。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书2页说明书6页附图5页CN102004705A1/2页21一种进程调试方法,其特征在于,包括代理线程接收到来自用户的调试命令,其中所述调试命令用于调试待调试的用户进程,所述代理线程预先设置在所述待调试的用户进程中;所述代理线程根据所述调试命令,调试所述待调试的用户进程。2根据权利要求1所述的方法,其特征在于,所述代理线程接收到来自所述用户的所述调试命令包括与所述代理线程对应的代理工具接收到来自所述用户的所述调试命令,其中所述代理工具与所述用户进程分离;所述代理工。
3、具将所述调试命令转发给所述代理线程。3根据权利要求2所述的方法,其特征在于,所述代理工具使用队列方式或者管道方式将所述调试命令转发给所述代理线程。4根据权利要求1所述的方法,其特征在于,在所述代理线程接收到来自所述用户的所述调试命令之前,所述方法还包括所述代理线程创建所述用户进程的符号表;所述代理线程在所述代理线程的私有变量中存储所述符号表。5根据权利要求4所述的方法,其特征在于,所述代理线程根据所述调试命令,调试所述待调试的用户进程包括所述代理线程分离所述调试命令,得到调试函数名和参数;所述代理线程在所述符号表中查找与所述调试函数名对应的执行函数;所述代理线程执行所述执行函数。6根据权利要求。
4、4所述的方法,其特征在于,所述代理线程根据所述调试命令,调试所述待调试的用户进程包括所述代理线程获取所述用户进程的状态信息;所述代理线程向代理工具发送所述用户进程的状态信息,其中所述代理工具与所述用户进程分离。7根据权利要求4所述的方法,其特征在于,所述代理线程根据所述调试命令,调试所述待调试的用户进程包括以下至少之一所述调试命令为PRINTFIFO,所述代理线程判断所述代理线程的输出是否已经重定向到管道,如果判断结果为否,则将所述代理线程的输出重定向到管道,否则忽略所述调试命令;所述调试命令为DEBUG,所述代理线程判断是否处于调试状态,如果判断结果为否,则所述代理线程进入调试状态,否则忽略。
5、所述调试命令;所述调试命令为QUIT,所述代理线程判断所述代理线程的输出是否已经重定向,如果判断结果为是,则恢复所述代理线程的输出的重定向,否则忽略所述调试命令。8一种进程调试装置,其特征在于,包括接收模块,用于接收来自用户的调试命令,其中所述调试命令用于调试待调试的用户进程,所述接收模块所属的代理线程预先设置在所述待调试的用户进程中;调试模块,用于根据所述调试命令,调试所述待调试的用户进程。9根据权利要求8所述的装置,其特征在于,还包括权利要求书CN102004692ACN102004705A2/2页3创建模块,用于创建所述用户进程的符号表;存储模块,用于在所述代理线程的私有变量中存储所述符。
6、号表。10根据权利要求9所述的装置,其特征在于,所述调试模块包括分离子模块,用于分离所述调试命令,得到调试函数名和参数;查找子模块,用于在所述符号表中查找与所述调试函数名对应的执行函数;执行子模块,用于执行所述执行函数。权利要求书CN102004692ACN102004705A1/6页4进程调试方法及装置技术领域0001本发明涉及通信领域,具体而言,涉及一种进程调试方法及装置。背景技术0002由于类UNIX系统用户态进程地址空间具有相互独立性,SHELL程序的空间和用户进程的空间是相对隔离的,所以在一个进程运行过程中,我们无法通过SHELL获取用户进程空间的信息,也难以实现对运行进程的访问和控。
7、制,即对进程进行在线调试。0003传统的类UNIX系统软件开发,在开发初期会使用一些调试工具,对程序设置断点或是让程序单步执行,来跟踪调试程序。待软件开发完成后,一般都会进行优化编译。以RELEASE版本发布,在这种情况下,调试工具是没法对软件进行精确调试跟踪的。如果开发者需要抓取系统运行过程中的一些信息,一般只能查看软件在运行过程中的一些状态输出,或者由串口打印,或者由别的信号来表达。而当软件流程出现异常导致系统无法正常工作的时候,故障现场的数据只能靠程序预定的流程来收集。事后,开发者再根据这些数据来定位故障产生的原因。0004这种软件架构存在着一些缺陷,首先,系统运行过程中的状态信息由程序。
8、主动输出,这个操作会在系统正常工作流程中,若系统比较复杂,信息量大,这部分流程会消耗很多CPU,严重影响系统性能。其次,在发生软件异常时,异常记录信息由软件设计人员预先设定,故障发生后,开发者只能利用仅有的这些数据进行故障分析,如果某些重要信息没有记录下来,那就只能重新制作临时软件版本去收集信息,再复现这个故障。而很多故障往往是不能或者很难复现的,所以这类故障定位的效率会很低或者根本无法定位。发明内容0005针对相关技术中进程调试过程会消耗很多CPU并难以定位故障的问题而提出本发明,为此,本发明的主要目的在于提供一种进程调试方法及装置,以解决上述问题。0006为了实现上述目的,根据本发明的一个。
9、方面,提供了一种进程调试方法。0007根据本发明的进程调试方法包括代理线程接收到来自用户的调试命令,其中调试命令用于调试待调试的用户进程,代理线程预先设置在待调试的用户进程中;代理线程根据调试命令,调试待调试的用户进程。0008进一步地,代理线程接收到来自用户的调试命令包括与代理线程对应的代理工具接收到来自用户的调试命令,其中代理工具与用户进程分离;代理工具将调试命令转发给代理线程。0009进一步地,代理工具使用队列方式或者管道方式将调试命令转发给代理线程。0010进一步地,在代理线程接收到来自用户的调试命令之前,上述方法还包括代理线程创建用户进程的符号表;代理线程在代理线程的私有变量中存储符。
10、号表。0011进一步地,代理线程根据调试命令,调试待调试的用户进程包括代理线程分离调试命令,得到调试函数名和参数;代理线程在符号表中查找与调试函数名对应的执行函数;说明书CN102004692ACN102004705A2/6页5代理线程执行该执行函数。0012进一步地,代理线程根据调试命令,调试待调试的用户进程包括代理线程获取用户进程的状态信息;代理线程向代理工具发送用户进程的状态信息,其中代理工具与用户进程分离。0013进一步地,代理线程根据调试命令,调试待调试的用户进程包括以下至少之一调试命令为PRINTFIFO,代理线程判断代理线程的输出是否已经重定向到管道,如果判断结果为否,则将代理线。
11、程的输出重定向到管道,否则忽略调试命令;调试命令为DEBUG,代理线程判断是否处于调试状态,如果判断结果为否,则代理线程进入调试状态,否则忽略调试命令;调试命令为QUIT,代理线程判断代理线程的输出是否已经重定向,如果判断结果为是,则恢复代理线程的输出的重定向,否则忽略调试命令。0014为了实现上述目的,根据本发明的另一个方面,提供了一种进程调试装置。0015根据本发明的进程调试装置包括接收模块,用于接收来自用户的调试命令,其中调试命令用于调试待调试的用户进程,接收模块所属的代理线程预先设置在待调试的用户进程中;调试模块,用于根据调试命令,调试待调试的用户进程。0016进一步地,进程调试装置还。
12、包括创建模块,用于创建用户进程的符号表;存储模块,用于在代理线程的私有变量中存储符号表。0017进一步地,调试模块包括分离子模块,用于分离调试命令,得到调试函数名和参数;查找子模块,用于在符号表中查找与调试函数名对应的执行函数;执行子模块,用于执行该执行函数。0018通过本发明,在用户进程中添加了代理线程,它可以根据用户的调试命令调试用户进程,解决了相关技术中进程调试过程会消耗很多CPU并难以定位故障的问题,从而实现故障的快速、准确地定位,并且,如果没有需要,代理线程是保持阻塞的,所以仅仅会增加代码体积,而不会消耗CPU影响系统性能。附图说明0019此处所说明的附图用来提供对本发明的进一步理解。
13、,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中0020图1是根据本发明实施例的进程调试方法的流程图;0021图2是根据本发明实施例的DSHELL模块在类UNIX系统中的应用场景的示意图;0022图3是根据本发明实施例的DSHELL模块中DSHELL线程的流程图;0023图4是根据本发明实施例的DSHELL模块中DSHELL工具的流程图;0024图5是根据本发明实施例的进程调试装置的结构框图;0025图6是根据本发明优选实施例一的进程调试装置的结构框图;0026图7是根据本发明优选实施例二的进程调试装置的结构框图。具体实施方式0027需要说。
14、明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。0028本发明实施例提供了一种进程调试方法。图1是根据本发明实施例的进程调试方说明书CN102004692ACN102004705A3/6页6法的流程图,包括如下的步骤S102至步骤S104。0029步骤S102,代理线程接收到来自用户的调试命令,其中调试命令用于调试待调试的用户进程,代理线程预先设置在待调试的用户进程中。0030步骤S104,代理线程根据调试命令,调试待调试的用户进程。0031相关技术中,进程调试过程会消耗很多CPU并难以定位故障。本发明实施例在用户进程中添加了。
15、代理线程,它可以根据用户的调试命令调试用户进程,从而实现故障的快速、准确地定位,并且,如果没有需要,代理线程是保持阻塞的,所以仅仅会增加代码体积,而不会消耗CPU影响系统性能。0032需要说明的是,本发明的进程调试方法可以适用于类UNIX系统,尤其适用于LINUX系统或嵌入式LINUX系统。0033优选地,代理线程接收到来自用户的调试命令包括与代理线程对应的代理工具接收到来自用户的调试命令,其中代理工具与用户进程分离;代理工具将调试命令转发给代理线程。0034本优选实施例,在软件运行的过程中,通过代理工具直接跟运行中的软件交互。这样,用户只需要通过TELNET到待调试的系统,运行代理工具,并执。
16、行一些命令,即可将代理工具和代理线程连接,然后,可以在代理工具中输入调试命令调试用户进程,或者查看用户进程的全局变量值。0035优选地,代理工具使用队列方式或者管道方式将调试命令转发给代理线程。0036需要说明的是,DSHELL代理线程和DSHELL工具需要同步,否则会出现异常。比如,DSHELL工具退出的时候,DSHELL代理线程必须恢复输出重定向,否则DSHELL代理线程将输出往管道里面写,却没有进程读管道,管道必定溢出。0037优选地,在代理线程接收到来自用户的调试命令之前,上述方法还包括代理线程创建用户进程的符号表;代理线程在代理线程的私有变量中存储符号表。0038优选地,代理线程根据。
17、调试命令,调试待调试的用户进程包括代理线程分离调试命令,得到调试函数名和参数;代理线程在符号表中查找与调试函数名对应的执行函数;代理线程执行该执行函数。0039优选地,代理线程根据调试命令,调试待调试的用户进程包括代理线程获取用户进程的状态信息;代理线程向代理工具发送用户进程的状态信息,其中代理工具与用户进程分离。0040优选地,代理线程根据调试命令,调试待调试的用户进程包括以下至少之一调试命令为PRINTFIFO,代理线程判断代理线程的输出是否已经重定向到管道,如果判断结果为否,则将代理线程的输出重定向到管道,否则忽略调试命令;调试命令为DEBUG,代理线程判断是否处于调试状态,如果判断结果。
18、为否,则代理线程进入调试状态,否则忽略调试命令;调试命令为QUIT,代理线程判断代理线程的输出是否已经重定向,如果判断结果为是,则恢复代理线程的输出的重定向,否则忽略调试命令。0041下面将结合实例对本发明实施例的实现过程进行详细描述。0042图2是根据本发明实施例的DSHELL模块在类UNIX系统中的应用场景的示意图,如图2所示,图中有三个进程,其中用户进程1和用户进程2是软件的主体。DSHELL工具即上述代理工具和驻留在用户进程中的DSHELL代理线程即上述代理线程共同完说明书CN102004692ACN102004705A4/6页7成DSHELL对用户进程的在线调试功能。DSHELL代理。
19、线程和DSHELL工具使用管道和消息队列来进行交互。0043基于图2的DSHELL模块,首先需要进行下述准备工作。00441、将用户进程ELF格式执行文件名加入到DSHELL配置文件中,DSHELL代理线程和DSHELL工具都需要使用到这个配置文件。00452、在应用程序中选择一个合适的地方进行DSHELL代理线程初始化,DSHELL代理线程与应用程序编译在一起。00463、DSHELL工具需要单独编译。00474、将DSHELL工具和应用程序放置在同一个目录下面,先执行应用程序,再执行DSHELL工具,这样就可以使用DSHELL工具进行在线调试了。0048然后,在用户进程启动过程中,它需要调。
20、用DSHELL初始化函数,创建DSHELL代理线程,DSHELL代理线程会创建队列和管道,等用户进程正常启动之后,我们就可以开动DSHELL工具对用户进程进行调试了。DSHELL工具将用户命令经过本地解析后,通过消息队列发送给DSHELL代理线程。DSHELL代理线程收到用户命令后,会在用户进程的空间执行相应的操作,或者获取一些有用的信息,然后通过管道传送给DSHELL工具。DSHELL模块就这样实现了用户态进程进行在线调试的功能。0049图3是根据本发明实施例的DSHELL模块中DSHELL线程的流程图,如图3所示,包括如下的步骤S302至步骤S320。0050步骤S302,DSHELL初始。
21、化。0051步骤S304,启动DSHELL代理线程。0052具体地,在用户进程初始化时,调用DSHELL_INIT函数,启动代理线程。并且优选地,DSHELL初始化函数启动代理线程后就回到用户进程,继续执行用户进程的流程。0053步骤S306,创建符号表。0054具体地,用户进程会根据配置文件读取进程的ELF执行文件,根据ELF文件来创建本进程的符号表。0055步骤S308,创建用来输出重定向的管道。0056步骤S310,创建用来接收DSHELL传来的命令的队列。0057步骤S312,代理线程进入死循环,阻塞读消息队列。0058步骤S314,在非调试模式运行调试函数状态下,判断是否为PRINT。
22、FFIFO、QUIT、DEBUG字符串,如果是则在步骤S318至步骤S322中选择相应的执行,如果不是以上字符串,则进行步骤S316。0059步骤S316,判断是否是调试状态,如果是则分离调试函数并执行调试函数,如果不是则忽略,并返回步骤S312。0060具体地,分离调试函数并执行调试函数包括如下的步骤00611、先将字符串分离成函数名和参数的形式。00622、查符号表找到函数或变量。00633、执行函数,或显示变量值。0064步骤S318,判断是否输出未重定向,如果是则将输出重定向到PIPE,如果已重定向,则忽略,并返回步骤S312。说明书CN102004692ACN102004705A5/。
23、6页80065步骤S320,判断是否是调试状态,如果不是则进入调试状态,如果是则忽略,并返回步骤S312。0066步骤S322,判断是否是输出未重定向,如果是则忽略,如果不是即已重定向,则恢复输出至标准设备,并返回步骤S312。0067图4是根据本发明实施例的DSHELL模块中DSHELL工具的流程图,如图4所示,包括如下的步骤S402至S420。0068这个模块需要独立编译,在用户进程上电完成后使用,它的作用是利用进程间通信原理将用户的命令传给用户进程空间。0069步骤S402,DSHELL工具启动,并执行步骤S404和步骤S412。0070步骤S404,开启DSHELL管道守护线程,阻塞读。
24、管道。0071步骤S406,管道守护线程会根据读到配置文件中的进程信息,打开每个进程的管道。0072步骤S408,调用SELECT阻塞读上述每个进程的管道。0073步骤S410,根据SELECT返回值选择读取管道并打印,然后返回进行步骤S408。0074步骤S412,DSHELL工具主线程继续打开消息队列,消息队列也是由用户进程创建。0075步骤S414,DSHELL使用格式输入的系统调用或READLINE库的调用,读取用户从键盘输入的命令。这里也会阻塞,直到用户敲入命令并以回车结束,DSHELL工具会进入用户命令分析流程。0076步骤S416,判断是否为调试状态,如果是则进行步骤S418,否。
25、则进行步骤S420。0077步骤S418,若用户进程为调试状态,键盘获取输入为Q,就进入非调试状态,并向对应消息队列发送“QUIT”,如果是别的字符串,DSHELL会认为它是调试函数,DSHELL工具会将字符串直接发送到消息队列。0078步骤S420,如果用户进程不是调试状态,DSHELL会对输入的字符串进行比对。对不同的命令会执行相应的操作,使DSHELL代理线程进入不同的状态,或者输出重定向,或者进入调试状态。即向对应进程的消息队列发送“PRINTFIFO”或者“DEBUG”。0079优选地,对于调试状态下的调试函数,DSHELL工具会调用READLINE库函数来对近10次执行的调试函数进。
26、行历史保留操作,使用上下方向键即可调用之前使用过的调试函数。0080需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。0081本发明实施例提供了一种进程调试装置,该进程调试装置可以用于实现上述进程调试方法。图5是根据本发明实施例的进程调试装置的结构框图,如图5所示,包括接收模块52和调试模块54。下面对其进行详细描述。0082接收模块52,用于接收来自用户的调试命令,其中调试命令用于调试待调试的用户进程,接收模块所属的代理线程预先设置在待调试的用户进程中;调。
27、试模块54,连接至接收模块52,用于根据接收模块52接收的调试命令,调试待调试的用户进程。0083图6是根据本发明优选实施例一的进程调试装置的结构框图。说明书CN102004692ACN102004705A6/6页90084优选地,上述进程调试装置还包括创建模块56和存储模块58,下面对其进行详细描述。0085创建模块56,用于创建用户进程的符号表;存储模块58,连接至创建模块56,用于在代理线程的私有变量中存储创建模块56创建的符号表。0086图7是根据本发明优选实施例二的进程调试装置的结构框图。0087优选地,调试模块54包括分离子模块542,查找子模块544和执行子模块546,下面对其结。
28、构进行详细描述。0088分离子模块542,连接至接收模块52,用于分离接收模块52接收的调试命令,得到调试函数名和参数;查找子模块544,连接至分离子模块542,用于在符号表中查找与分离子模块542分离得到的调试函数名对应的执行函数;执行子模块546,连接至查找子模块544,用于执行查找子模块544查找的执行函数。0089需要说明的是,装置实施例中描述的进程调试装置对应于上述的方法实施例,其具体的实现过程在方法实施例中已经进行过详细说明,在此不再赘述。0090综上所述,根据本发明的上述实施例,提供了一种进程调试方法及装置。通过在用户进程中添加了代理线程,它可以根据用户的调试命令调试用户进程,解。
29、决了相关技术中进程调试过程会消耗很多CPU并难以定位故障的问题,从而实现故障的快速、准确地定位,并且,如果没有需要,代理线程是保持阻塞的,所以仅仅会增加代码体积,而不会消耗CPU影响系统性能。0091显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。。
30、0092以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。说明书CN102004692ACN102004705A1/5页10图1图2说明书附图CN102004692ACN102004705A2/5页11图3说明书附图CN102004692ACN102004705A3/5页12图4说明书附图CN102004692ACN102004705A4/5页13图5图6说明书附图CN102004692ACN102004705A5/5页14图7说明书附图CN102004692A。