多线程调试方法和装置的制作方法

文档序号:6466862阅读:174来源:国知局
专利名称:多线程调试方法和装置的制作方法
技术领域
本发明涉及通信领域,并且特别地,涉及一种多线程调试方法 和装置。
背景技术
随着信息技术的不断发展、软件规模的不断扩大以及复杂度的 不断提高, 一个功能往往需要由多个线程协同完成。在实际应用当 中,如何能够有效地帮助软件开发人员快速定位并消除代码中的故 障,成为调试器的重要问题。
目前,调试器提供了断点功能、程序运行流程控制功能、数据 查看功能、以及堆栈分析功能等等,通过这些功能可以有效地帮助 软件开发人员快速定位并消除代码中的故障,这些功能的操作对象 基本都是单个被调试线程或整个进程。
其中,断点功能是开发人员调试的基本手段,按照实现方式可
分为软件断点和硬件断点。其中,软件断点是指通过在程序的代 码中插入断点指令实现,当被调试程序执行到此断点指令后即停止, 用户可以通过调试器查看当前的变量、寄存器、调用堆栈等等;硬 件断点是指通过设置硬件调试寄存器,实现监控被调试程序读, 写或执行操作。其中,当被调试程序读,写或执行了被观测地址后 #皮调试程序立即停止,此时也可以查看被调试程序的详细信息。通过断点功能可以非常灵活有效地设置调试触发点,停止并观 察触发此调试事件的任务。目前,大多^t的调试器还可以在断点上
i殳置一些属性,例如,i更置局部断点、全局断点、临时断点、条4牛 断点、忽略次数断点等。具体而言,局部断点是指当前断点只对某 个特定的线程有效;全局断点则对当前调试的所有线程有效;临时 断点则是遇到一次后就自动删除的断点;条件断点是遇到此断点且 满足预设的条件才能停止的断点;忽略次数断点是遇到此断点超过 预i殳的忽略次lt后才能4亭止的断点,并且,用户可以通过调试器组 合上面一个或多个断点属性进行调试。
在复杂的大型软件中,各种功能大多是由多个线程协同完成的, 一些线程可以协同完成某一功能,而另一些线程协同完成另一些功 能,这些功能之间也存在某种因果关系或依赖关系。在调试其中一 个功能时需要保证此功能所依赖的其他功能保持正常运行状态,否 则就会影响当前功能的调试。
对于这种复杂功能软件,如果仍采用普通的断点及断点属性组 合的方式调试,则很难满足调试要求。因为普通的调试器所针对的 被调试对象是单个线程或者整个进程,在遇到调试事件时都是当前 线程或者整个进程停止。如果整个进程都被停止的情况下,被调试 功能所依赖的运行环境(由当前进程中其他线程组提供)就被破坏 了,导致当前调试组的功能逻辑可能就受影响;另一方面,如果只 有当前线程被停止的情况下,调试器只能获取到这个停止的线程信 息,而无法获取实现当前调试功能的所有线程的完整信息,因此不 能正确分析当前功能,并且只停止此功能关联的 一个线程也可能破 坏了整个功能逻辑。
综上所述,目前调试器的调试对象都是单个线程或者整个进程, 但是调试需求却是某一个功能,而且此功能由多个线程协同完成,这样就会因为在调试过程中某个线程或整个进程的停止而导致调试 结果不准确的问题。

发明内容
考虑到相关技术中由于调试过程中某个线程或整个进程的停止 而导致调试结果不准确的问题而做出本发明,为此,本发明的主要 目的在于提供一种多线程调试机制,以解决上述问题。
根据本发明的一个方面,提供了一种多线程调试方法。
才艮据本发明的多线考呈调试方法包4舌在预确定的调试功能点包 含多个线禾呈的情况下,将多个线考呈组成调试4壬务组,并确定调试触 发事件;在调试触发事件发生的情况下,停止调试任务组中的多个 线程并在调试功能点进行调试。
其中,将多个线程组成调试任务组的处理可以进一步包括记 录调试任务组的4壬务组号、和/或i己录调试4壬务组中每个线程的标 识。
此外,将多个线程组成调试任务组的处理进一步包括根据调 试功能点的结构确定调试功能点的断点。
此时,止调"^/f壬务组中的多个线禾呈的处理具体为以下之一
在断点为任务组类型的断点的情况下,根据断点的属性以及调 试任务组中每个线程的标识与当前运4亍的线程的标识确定是否需要 停止调试任务组的多个线程;
在断点为非4壬务组类型的断点的情况下,4艮据断点的属性确定 是否需要停止调试任务组的多个线程。
6此外,在调试功能点进^f于调试的处理具体为获取调试功能点中全部任务的信息,并根据信息对调试功能点的运行状态进行分析。
并且,在获取了信息之后,该方法可进一步包括在需要继续观察调试功能点的情况下,继续运行调试功能点所包含的多个线程。
优选地,上述信息包括以下至少之一线程的变量、线程的调用堆栈、线程的寄存器信息。
并且,上述调试触发事件包括需要调试的代码或指定内存变量的读写操作。
根据本发明的另一方面,提供了一种多线程调试装置。
根据本发明的多线程调试装置包括组合才莫块,用于在预确定的调试功能点包含多个线程的情况下,将多个线程组成调试任务组,并确定调试触发事件;调试模块,用于在调试触发事件发生的情况下,停止调试任务组中的多个线程并在调试功能点进行调试。
通过本发明的上述技术方案,通过将多个存在逻辑关系的线程组织为一个任务组进行调试,能为用户提供更多的调试信息,解决相关技术中由于单个线程或整个进程的停止而影响调试结果的问题,进而提高程序调试的工作效率。
附图i兌明
此处所说明的附图用来^是供对本发明的进一步理解,构成本申
请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中


图1是才艮据本发明方法实施例的多线禾呈调试方法的流程图;图2是根据本发明方法实施例的方法中任务组数据结构与任务组相关的断点数据结构的示意图3是根据本发明方法实施例的方法中任务组线程遇到断点时的处理流;艮图4是根据本发明方法实施例的方法中任务组停止后收到运行控制命令时的处理流程图5是才艮据本发明方法实施例的方法中任务组断点的教:据结构内容以及和线程调试控制结构之间的关系示意图6是才艮据本发明装置实施例的多线程调试装置的框图。
具体实施例方式
功能相无述
考虑到相关技术中由于调试过程中某个线程或整个进程的停止而导致调试结果不准确的问题而做出本发明。本发明能够根据调试需求确定调试功能点,如果此功能点包含多个线程就将它们组成一个调试任务组;然后再^^艮据功能点的内部逻辑确定调试触发事件,这个触发事件可以是需要调试的代码或某个内存变量的读写操作;最后执行整个被调试程序。当触发事件发生时,调试器就能够及时停止此任务组中所有线程,并且获取这个功能点相关所有任务的详细情况。下面将结合附图详细描述本发明。
方法实施例
在本实施例中,^是供了一种多线程调试方法。
如图l所示,才艮据本发明方法实施例的多线禾呈调试方法包括步骤S102,在预确定的调试功能点包含多个线程的情况下,将多个线程组成调试任务组,并确定调试触发事件(可以是需要调试的代
码、和/或指定内存变量的读写才喿作等);
步骤S104,在调试触发事件发生的情况下,停止调试任务组中的多个线程并在调试功能点进行调试。
通过上述处理,由于整个调试当中调试功能点相关的线程都保持一致的状态,这样就确保了调试过程中当前功能点的逻辑内部不被破坏;另外,调试过程中功能点之外的其他线程仍然保持运行状态,这样就保证了当前调试功能点的外部环境也没有被破坏,从而有效^f呆i正了调试的准确性。
具体地,在将多个线程组成调试任务组时,可以记录调试任务组的任务组号、以及记录调试任务组中每个线程的标识等信息。
并且,将多个线程组成调试任务组时,可以才艮据调试功能点的结构确定调试功能点的断点。
在调试功能点进4于调试时,具体的处理可以为获取调试功能点中全部任务的信息,并根据该信息对调试功能点的运行状态进行分析。
其中,全部任务的信息可以包括以下至少之一线程的变量、线程的调用堆栈、线程的寄存器信息。参考这些信息就能够进行分析得出当前功能点的运行状态;此时如果需要继续观察此功能点,可以通过调试器继续运^H壬务组,这时组内各个线程都净皮运4亍起来。
在实际应用中,由于大型复杂软件中各个功能之间存在依赖或因果关系,为了保证本发明的准确实现,需要确保以下几点
9(1 )当前调试功能关联的任务组中的线程在遇到用户事先定义
的任务组事件时需要停止任务组所有线程;
(2)在任务组中所有线程状态需要保持一致,即,如果有一个 组内线程停止则整个任务组中所有线程都停止,如果需要继续运行 一个组内线程则整个组内线程都需要运4亍;
(3 )非任务组内的线程在发生组内调试事件时仍然保持继续运 行的状态;
(4 )对于当前进禾呈中所有线程(包4舌调试组内线禾呈和非组内线 程)都支持原有的调试功能。
为了满足以上实际调试过程的要求,需要在调试过程中将^皮调 试进程中若干个线程作为一个调试对象(即,上述的调试任务组), 也就是将用户某个逻辑功能点所涉及的各个线程作为一个调试对象 进行调试。
在确定调试/f壬务症且时,可以在用户确定调,汰某个功能后,通过 调试器界面将此功能涉及到的若干个线程组成一个调试任务组。这 样调试器就记录用户i殳置的调试组信息,此凄t据结构定义包括任务 组内每个线程的ID、和/或任务组号,具体的记录格式可以参见图2 所示的格式,如图2所示,任务组号一项中包含pidl、 pid2、、 pidn 等多个任务组号。
此后,可以4丸行任务组调试点的i殳置才艮据^皮调试功能逻辑通 过调试界面i殳置调试点(即,断点)。此调试点的类型既可以是软件 断点也可以是硬件断点,并且还可以是各种条件组合的断点。在调 试器内部记录了此断点的相关信息以及当前任务组信息,存储的数 据结构同样可以参照图2,如图2所示,记录了断点地址、断点类 型、断点属性等信息。接下来,可以调试任务组线程通过调试器监控正在运^f亍的4皮 调试程序,若当前线程为任务组线程在运行状态下遇到断点,则可 以按照图3所示的处理流程进行以下处理
(31)和(32)收到断点事件后,确定是否是任务组断点,如 果当前断点是任务组类型的断点,则执4亍步骤(33);否则扭J亍步骤 (34 );
(33 )匹配当前线程ID与断点关联的任务组中每个线程的ID, 判断当前任务是否为断点关联的组内任务,如果判断为是(能够匹 配),则执行步骤(35),否则执行(34);
(34) 判断当前任务是否应该停止,如果判断为是,则执行步 骤(40),否则执行步骤(38);
(35) 进一步分析断点的其他属性规则,如果需要停止,则执 行步骤(36),否则执行步骤(38);
(36 )调试器通过信号或其它操作系统提供的接口将同组内其 它线程停止,并执行(37);
(37 )任务组内所有线程都停止后则将组内的所有线程情况显 示在调试界面上,处理结束;
(38) 5夸过断点,;波调试/f壬务继续运4亍,并执4亍(39);
(39) 按照原有断点处理MJI'J处理,结束处理;
(40) 修改属性并关联任务组,之后执行(36)。此外,若当前线程为任务组线程且处于4f止状态下,在用户通 过调试器控制4吏其运行起来其处理流程可参照图4,如图4所示, 具体包括以下处理过程
(41 )接收到运行控制命令;
(42)判断是否为连续运行(continue)命令,如果是,则执行 (43),否则执4亍(44);
(43 )将同组内所有线程执行运行命令,任务组内所有线程状 态保持一致,继续观测任务组内各个线程的运行情况,并执行(45 );
(44)对于next、 step、 finish等命令,对当前调试的线程执行 next、 step、 finish命令,纟且内其4也线禾呈执4亍运4亍命令,并执4亍(45 );
(45 )如果当前调试线程执4亍结束停止,则将其他同组线程也 停止,从而就保证同组线程的状态一致,并执行(46);
(46)在调试器上显示调试组信息,供用户分4斤和4吏用。
此外,在调试非任务组线程时,调试器可在监控任务组线程同 时也监控非任务组线程,对非任务组线程在遇到任务组断点后跨过 此断点继续运行,并且非任务组线程遇到其他断点情况下仍然保持 原有的处理流程。
可以看出,本发明能够将某一功能涉及到的若干个多线程作为 一个抽象的调试对象,为用户提供这个功能关联的所有线程的详细 信息。在采用此方法调试当前任务组时其它非组内的线程则不受任 4可影响仍然4呆持正常调试运行状态;而且在调试当前4壬务组时都不 丟失原有的调试功能,这样保证调试手段更为灵活和方便。下面将以某个具体的嵌入式设备软件为例,对本发明的调试过 程进^于描述。
假设该设备软件存在线程A,该线程A负责对接收到的报文进 行协议分解并交给上层线程B、 C、 D;其中,上层线考呈B与线程E、 线程F协同完成某业务处理功能。
目前,需要对此业务功能(线程B、 E、 F组合)进行调试分析, 但此功能与线程A存在因果关系;同时这个功能还依赖其它功能(由 线程C、 D协同完成)。因此在调试这个功能时不能改变其他关联线 程(如本例中A、 C、 D线程)的状态。下面将详细描述对该设备 软件的调试操作过程。
1 )任务组调试设置
首先,确定将线程B、 E、 F组织为一个4壬务组,々13殳此4壬务组 的组号为1;根据实现逻辑在此功能的代码处(0x08045800)插入 一个断点,设置断点类型为任务组断点类型并且关联1号任务组。 其中,Y壬务组断点的彩:据结构内容以及和线程调试控制结构之间的 关系可以参照图5,如图5所示,1号任务组中的线程B、 E、 F、 以及任务组之外的线程A、 C、 D分别对应于一个线程调试模块。
2)调试任务组线程
如果任务组内的线程B执行到代码段地址0x08045800时,CPU 石更件产生一个断点异常通过揭:作系统通知到调试器当前遇到断点的 地址以及遇到断点的线程;调试器首先根据断点地址在图5中的断 点链表中搜索地址匹配的断点节点,找到这个断点节点后根据断点 属性判断是否对遇到断点的线程B生效;由于断点为4壬务组断点并 且B线程为这个断点关联所的任务组,因此断点生效;然后再分析 断点其他属性(图5中的条件一)是否成立,如果条件一成立则当前任务组都需要停止否则线程B跨过断点继续运行。如果需要停止 任务组则调试器通过断点关联的组属性查找到相关组内其他线程E 和F,然后调用才喿作系统接口使这个线程停止,最后综合断点停止 的线程B的信息以及线程E和线程F的当前停止的信息反馈给用 户。
如果任务组内的线程B执行到代码革史地址0x08040000时,调 试器获取到当前断点地址以及相关线程后,通过断点链表查着到地 址匹配的断点节点。这个断点节点为一个局部断点节点^Ut线禾呈B 生效并且没有条件设置,因此线程B需要停止。通过任务组链表头 遍历当前所有的任务组链表在1号任务组中匹配到当前线程B,调 试器将当前断点类型修改为任务组类型并关联1号任务组,之后再 将同组内的线程E、 F停止,并将这个信息组织反々贵给用户。
通过上面这个过禾呈用户就可以通过i殳置组断点来分析;帔调试功 能,同时对于任务组内的线程仍然可以4吏用已有的其他断点功能。 由于在上面的过程中进程中的其他线程A、 C、 D没有被中断,所 以当面被调试的功能逻辑所依赖的环境没有被破坏。在这种情况下, 如果用户需要继续调试当前任务组,可以通过调试界面才喿作。
如果用户执行conintue命令,则调试器通过线程B调试控制块 可以得出当前调试线程B是停止在一个任务组断点处,并且当前任 务组中的其他任务也已经停止了 。此时调试控制线程B使其执行跨 断点动作,然后将当前任务组中的线程B、 E、 F都运行起来。这样 当前任务组中所有线程又全部都运4亍起来,所调试的功能点也处于 正常工作状态。
如果用户执行step、 next等等命令,则调试器控制B线程执行 跨断点动作,E和F线程执行继续运行动作。当线程B再次停止后 又;)夸线禾呈E和线禾呈F 4f止。2)调试非任务组线程
如果非任务组内的线程A执行到代码段地址0x08045800时, 调试也可以获取到当前遇到断点的线程A和当前停止的地址。通过 遍历断点链表匹配断点地址,查找到这个4壬务组类型的断点节点。 调试分析断点节点为4壬务组类型断点,然后匹配当前4亭止的线禾呈A 和这个断点关联的任务组1中所有线程。在匹配失败后确认当前断 点对线程A无效。因此调试器控制线程A 3争过此断点后继续运4亍。
对于非任务组线程遇到其他类型断点时采用原有的判断逻辑进 行控制,故已有的断点功能都仍然有效。
通过以上实例可以看出,任务组调试方式在调试过程中的调试 对象为某一个功能的抽象对象(在本例中为线程B、 E、 F)。当任 务组关联的事件发生时能够提供此功能关联的线程B、 E、 F的完整 信息,并且此功能所依赖的其他环境不受任何影响。
这种基于任务组的方法继承了原有的调试断点以及断点属性等 方法;同时又打石皮过去调试对象过于死才反的状态,爿夸用户最为关心 的功能逻辑作为调试对象,并且可以满足目前复杂功能逻辑的调试 需求,能够有效提高调试的效率。
装置实施例
在本实施例中,才是供了一种多线程调试装置。
如图6所示,才艮据本实施例的多线程调试装置包括
组合模块10,用于在预确定的调试功能点包含多个线程的情况 下,将多个线程组成调试4壬务组,并确定调试触发事件;调试模块20,用于在调试触发事件发生的情况下,停止调试任 务组中的多个线禾呈并在调试功能点进行调试。
在实际扭J亍调试时,该装置同才羊可以完成图1、图3、图4中所 示的处理,从而解决相关技术中由于单个线程或整个进程的停止而 影响调试结果的问题,具体处理过考呈这里不再重复。
综上所述,借助于本发明的技术方案,通过将多个存在逻辑关 系的线程组织为 一个任务组进行调试,能为用户提供更多的调试信 息,解决相关技术中由于单个线程或整个进程的停止而影响调试结 果的问题,并且本发明适用于复杂的大型專欠件,可以4艮方《更地分析 大型复杂软件程序,尤其是存在多线程交互的处理逻辑,进而提高 程序调试的工作效率,适用于各种才喿作系统平台之上的本地调试器 或交叉调试器;此外,在本发明的实现过程中,对其它非4壬务组中 的线程没有任何影响,并且对于任务组内的线程仍然兼容原有的调 试手段。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明, 对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在 本发明的精神和原则之内,所作的任何修改、等同替换、改进等, 均应包含在本发明的保护范围之内。
权利要求
1.一种多线程调试方法,其特征在于,包括在预确定的调试功能点包含多个线程的情况下,将所述多个线程组成调试任务组,并确定调试触发事件;在所述调试触发事件发生的情况下,停止所述调试任务组中的所述多个线程并在所述调试功能点进行调试。
2. 根据权利要求1所述的方法,其特征在于,将所述多个线程组 成所述调试4壬务组的处理进一步包4舌i己录所述调试^f壬务组的 任务组号、和/或记录所述调试任务组中每个线程的标识。
3. 根据权利要求1所述的方法,其特征在于,将所述多个线程组 成调试4壬务组的处理进一步包4舌才艮据所述调试功能点的结构确定所述调试功能点的断点。
4. 根据权利要求3所述的方法,其特征在于,停止所述调试任务 组中的所述多个线程的处理具体为以下之一在所述断点为4壬务组类型的断点的情况下,才艮据所述断点 的属性以及所述调试任务组中每个线程的标识与当前运行的 线程的标识确定是否需要停止所述调试任务组的所述多个线 程;在所述断点为非任务组类型的断点的情况下,4艮据所述断 点的属性确定是否需要停止所述调试任务组的所述多个线程。
5. 根据权利要求1所述的方法,其特征在于,在所述调试功能点 进行调试的处理具体为获取所述调试功能点中全部任务的信息,并才艮据所述信息 对所述调试功能点的运行状态进行分析。
6. 根据权利要求5所述的方法,其特征在于,在获取了所述信息 之后,进一步包括在需要继续观察所述调试功能点的情况下,继续运行所述 调试功能点所包含的多个线程。
7. 根据权利要求5所述的方法,其特征在于,所述信息包括以下 至少之一线程的变量、线程的调用堆栈、线程的寄存器信息。
8. 根据权利要求1至7中任一项所述的方法,其特征在于,所述 调试触发事件包括需要调试的代码或指定内存变量的读写操 作。
9. 一种多线程调试装置,其特征在于,包括组合模块,用于在预确定的调试功能点包含多个线程的情 况下,将所述多个线程组成调试任务组,并确定调试触发事件;调试模块,用于在所述调试触发事件发生的情况下,停止 所述调试任务组中的所述多个线程并在所述调试功能点进行 调试。
全文摘要
本发明公开了一种多线程调试方法和装置,其中,该方法包括在预确定的调试功能点包含多个线程的情况下,将多个线程组成调试任务组,并确定调试触发事件;在调试触发事件发生的情况下,停止调试任务组中的多个线程并在调试功能点进行调试。借助于本发明,通过将多个存在逻辑关系的线程组织为一个任务组进行调试,能为用户提供更多的调试信息,解决相关技术中由于单个线程或整个进程的停止而影响调试结果的问题,进而提高程序调试的工作效率。
文档编号G06F11/36GK101685420SQ20081016128
公开日2010年3月31日 申请日期2008年9月24日 优先权日2008年9月24日
发明者崔云峰, 翌 李, 程圣宇 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1