一种嵌入式多核环境下应用程序的调试方法
【专利摘要】一种嵌入式多核环境下应用程序的调试方法,属于应用程序调试方法,解决现有调试方法存在的不能独立于操作系统、不适于两个以上核调试,且功能不够全面的问题。本发明包括建立远程连接步骤、发送调试命令步骤、分析调试命令步骤、线程核绑定步骤、插入断点步骤、查询断点步骤、删除断点步骤、单步执行步骤、持续执行步骤、执行至结束步骤、查看变量步骤、查看线程运行核步骤、获取核运行线程步骤和统计线程运行时间步骤。本发明能够独立于操作系统并独立于嵌入式开发工具对应用程序进行调试,调试功能较全面,宿主机端调试器可以了解应用程序运行的基本情况、对应用程序运行的各种异常更准确定位,提高了应用程序调试效率。
【专利说明】—种嵌入式多核环境下应用程序的调试方法
【技术领域】
[0001]本发明属于计算机的应用程序调试方法,具体涉及一种嵌入式多核环境下应用程序的调试方法。
【背景技术】
[0002]随着应用需求的扩大和技术的不断进步、单核处理器性能提升越来越困难,单核嵌入式架构已难以满足相应处理要求,多核技术是处理器发展的必然趋势,并广泛应用于汽车、通信、信息电器、医疗、军事等行业的智能化装备中。多核技术带来更高的处理器性能、更高的功率利用效率和针对嵌入式设备更小的物理内存体积,同时也显著增加了嵌入式系统复杂度。为充分发挥多核以及多处理解决方案的潜能,仅仅拥有上述优势还不够,还需要发展相应软件(软件的串并转换、高效率的并行算法等),改进目前的编译器技术,尤其需要采用新的调试方法和工具,以帮助软件和硬件开发人员在完整的嵌入式多核环境中高效地进行调试工作,进而对“编译-编辑-调试”的流程进行优化,使多核架构能得到成功普及。
[0003]现阶段,虽然多核架构芯片已成为高端嵌入式产品的首选,但国内外在嵌入式多核系统的调试技术方面所做的研究工作较少,作为单核架构下首选的项目调试器(GNUProject debugger,⑶B)只具有单核调试功能,虽然能在嵌入式Linux操作系统支持下调试多核架构下的程序,但原有单核调试功能远不能满足调试人员多核调试的需求。
[0004]此外,国内嵌入式领域的各种开发大多都只是集中在利用第三方或开源的工具进行各种应用开发的阶段。对于任务级调试工具而言,需要有相对成熟嵌入式操作系统的支持,很难开发出独立于操作系统的应用程序调试工具。目前,对于开发人员来说,只能够通过开发工具提供的调试方法,逐步地调试自己的程序。而在近年能对嵌入式多核系统独立进行软件调试的工具比较少,主要包括如下两种:
[0005](a)实视图调试器(RealView Debugger):开发人员可以同时对两个处理器进行调试,带有同步功能,可以使两个处理器内核同时启动或者停止。在多处理器上运行的代码可以使用单一调试核在同一会话期实现独立或同步的停止、开始和步进;该调试解决方案还支持某个内核上的断点或在更多其他内核上产生断点,调试人员可选择外部寄存器和存储器值。但是实视图调试器对超过两个核不具备调试能力,多核调试功能也不够全面。
[0006](b)全视图调试器(TotalView Debugger):是一个Linux操作系统并行环境下的纯软件调试工具,它的集成开发环境(Integrated Development Environment, IDE)、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的,它可以完成复杂的测试以及多个核和多个应用软件之间的同步。但全视图调试器与Linux操作系统联系紧密,多核调试功能也不够全面。
[0007]目前,基于多核的嵌入式操作系统一般都是多任务操作系统,如Linux等,而开发的各种应用程序实际上就是一个在操作系统支持下在各种嵌入式平台上运行的应用程序,多个任务在操作系统的支持下,协同完成各种设计功能。在这样一种嵌入式开发的环境下,能够尽可能少地影响其它任务运行的情况下进行应用程序调试显得越来越重要。因此,研究独立于操作系统、独立于嵌入式开发工具的多核环境下应用程序调试方法具有相当重要的现实意义。
[0008]为了更好地理解本发明,以下对本发明涉及的专业术语加以解释:
[0009](I)远程通信协议(Remote Serial Protocol, RSP):
[0010]远程通信协议(RSP)是一种通过串口、网口等至少支持半双工通信的媒介进行ASCII数据传输的协议,通过RSP进行数据传输时,将所传输的数据打成RSP数据包,RSP数据包以字符$作为开始,字符$之后为数据,数据由一个或多个ASCII字节组成,以字符#作为数据的结束,在字符#后,还有两个ASCII字节作为前述数据的校验和。
[0011](2)远程交叉调试:
[0012]在嵌入式软件开发过程中,交叉调试是通过宿主机端调试器能控制目标机上被调试程序的运行方式,并且通过宿主机端调试器能查看和修改目标机上的内存、寄存器以及被调试程序中的变量等功能的一种类型的调试。在远程交叉调试的过程中,在目标机和宿主机端分别加入某些功能模块,二者通过网口或串口遵循远程通信协议(RSP)互通信息来进行调试,目标机用于调试的功能模块称为目标机端调试代理,目标机端调试代理是一个接受参数的可执行文件,参数为被调试应用程序的文件名,运行方法是打开目标机命令窗口,快捷键是Ctrl+Alt+t,在目标机的命令窗口下输入目标机端调试代理的文件名与参数,宿主机端用于调试的功能模块称为宿主机端调试器,宿主机端调试器也是一个接受参数的可执行文件,参数为目标机的IP地址和被调试应用程序的程序名,运行方法是打开宿主机命令窗口,快捷键是Ctrl+Alt+t,在宿主机的命令窗口下输入宿主机端调试器的文件名与参数,在交叉调试中,宿主机端调试器和被调试应用程序放在宿主机端,目标机端调试代理放在目标机端,而应用程序的可执行文件既放在目标机端,也放在宿主机端,应用程序可执行文件具有调试信息。
[0013](3)线程跟踪系统调用函数(ptrace):
[0014]线程跟踪系统调用函数(ptrace)是各类操作系统均提供的一个用于线程跟踪的系统调用函数。跟踪线程可以通过ptrace读写被跟踪线程的指令空间、数据空间、堆栈以及该线程运行时所有寄存器的值。通过与信号机制相结合,可以实现让被跟踪线程在跟踪线程的控制下运行。目标机端调试代理正是使用了 Ptrace来完成对被调试应用程序调试工作。
[0015]线程跟踪系统调用函数(ptrace)有四个参数:功能参数(request)、线程号(Pid)、地址(addr)、数据(data)。
[0016]不同的功能参数决定了跟踪线程对被跟踪线程不同的控制操作,例如:
[0017]PTRACE_TRACEME:供被跟踪进程调用,等待被跟踪;相应的线程号(P i d)、地址(addr)、数据(data)均为 O。
[0018]PTRACE_ATTACH:跟踪线程指定被跟踪线程,被跟踪线程由线程号参数(pid)给出;地址(addr)与数据(data)均为O。
[0019](4)符号表:
[0020]要运行被调试程序,必须首先将被调试程序的源代码文件编译成目标文件,源代码文件存放着源代码,目标文件存放着源代码经过编译形成的机器指令。执行被调试应用程序实际上是逐条执行目标文件中的机器指令。经过编译之后,源代码文件中的一行源代码对应目标文件中的多行机器指令,换言之,单步执行一行源代码实际上要执行多行机器指令。如何确定每一行源代码对应多少条机器指令,这就需要获取源代码文件与目标文件之间的映射关系。符号表记录着被调试程序的源代码文件每行源代码与目标文件多行机器指令之间的映射关系。
[0021]编译器在将源代码文件编译成目标文件的过程中,会在目标文件中加入调试信息。调试信息提供了源代码文件与目标文件之间的映射关系,并以特定格式存放在目标文件中。通过查看被调试程序目标文件中的调试信息,即可建立该被调试程序的符号表。
[0022]此外,符号表还存放着应用程序中的变量及其值,在应用程序执行过程中任何新出现的变量,都会存入所述应用程序所对应的符号表中,并且,当应用程序中变量的值改变时,所对应的符号表中的变量值也会修改,保证应用程序中的变量值与对应符号表中的相应变量具有相同的值。
[0023](5) CPU 亲和性:
[0024]CPU亲和性就是进程/线程要在某个指定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。CPU亲和性包括软CPU亲和性和硬CPU亲和性。软CPU亲和性意味着进程/线程通常不会在处理器之间频繁迁移。进程迁移的频率小就意味着对CPU产生的负载小。硬CPU亲和性指应用程序可以显式地指定进程在哪个处理器上运行,硬CPU亲和性是核线程绑定实现的基 础。
[0025](6) CPU亲和度掩码:
[0026]在各类操作系统内核中,其中与亲和性相关度最高的是CPU亲和度掩码cpus_
allowed,这个掩码由η位组成,η位与系统中的η个逻辑处理器--对应,比如,具有4个
处理器的系统有4位。如果为给定的线程设置了给定的位,那么这个线程就可以在相关的CPU上运行。因此,如果一个线程可以在任何CPU上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是I。可以通过调用各类操作系统提供的系统调用sched_setaffinity函数来设置CPU亲和度掩码。
[0027](7)进程信息文件系统(proc):
[0028]进程信息文件系统(proc)是比ptrace更加高级的进程控制手段。在各类操作系统中,每一个运行的进程都有一个以进程号(Pid)命名的进程文件夹,它们存储在进程信息文件系统(proc)中,可以通过读取该进程文件夹中的信息文件来获取进程运行信息。
[0029]该进程文件夹目录下包括task文件夹,task文件夹中存放着以该进程所包含线程的线程号命名的线程子文件夹,各线程子文件夹下的stat文件分别存放着各个线程的信息,包括线程运行核、线程运行时间。
[0030](8)设置亲和度掩码函数(sched_setaffinity):
[0031]设置亲和度掩码函数是各类操作系统均提供的系统调用函数,用于设置线程的CPU亲和度掩码;设置亲和度掩码函数有线程号与CPU亲和度掩码两个参数,通过设置亲和度掩码函数可以将线程号所指代线程的CPU亲和度掩码设置为设置亲和度掩码函数中的CPU亲和度掩码。如果设置CPU亲和度掩码函数执行成功,设置亲和度掩码函数返回1,负责返回O ;
[0032](9)核:本发明中“核”为CPU的同义词,核号表示CPU的编号。[0033](10)系统调用函数:
[0034]操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,操作系统内核提供一系列具备特定功能的多内核函数,通过一组称为系统调用函数(system call)的接口形式呈现给用户。系统调用函数把应用程序的请求传给操作系统内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用函数和内核函数,用户将不能编写大型应用程序。
[0035](11)断点信息链表(breakpoint_list)
[0036]断点,可以让程序中断在需要的地方,从而方便调试分析;可以在一次被调试程序中设置断点,当被调试程序运行到断点位置,便中断下来,极大的方便了操作,同时节省了时间。
[0037]断点信息链表(breakpoint_list)由多个节点组成,每个节点包括数据位和地址位两部分,地址位指向下一个节点的地址,数据位存放着一个断点的以下断点信息:断点编号、断点所对应的核号、线程号、源代码文件名、源代码文件行号、断点地址以及断点指令;断点地址用于存放程序中断处目标文件机器指令的地址,断点指令为断点地址所对应的一条目标文件机器指令。可以在断点信息链表中完成添加、查询、删除节点,也可以修改每个节点中数据位存放的的断点信息。
【发明内容】
[0038]本发明提供一种嵌入式多核环境下应用程序的调试方法,解决现有对嵌入式多核系统的调试方法存在的不能独立于操作系统、不适于两个以上核调试,且功能不够全面的问题,以能够独立于操作系统并独立于嵌入式开发工具对应用程序进行调试。
[0039]本发明所提供的一种嵌入式多核环境下应用程序的调试方法,包括建立远程连接步骤、发送调试命令步骤、分析调试命令步骤、线程核绑定步骤、插入断点步骤、查询断点步骤、删除断点步骤、单步执行步骤、持续执行步骤、执行至结束步骤、查看变量步骤、查看线程运行核步骤、获取核运行线程步骤和统计线程运行时间步骤,其特征在于:
[0040](I)建立远程连接步骤,包括下述子步骤:
[0041](1.1)调试人员运行目标机端调试代理,参数为被调试应用程序的文件名;运行宿主机端调试器,参数为目标机的IP地址和被调试应用程序的文件名;
[0042](1.2)目标机端调试代理首先创建一个子线程,在子线程中调用ptrace函数,ptrace函数的功能参数为PTRACE_TRACEME、线程号、地址和数据均为0,此时所述子线程处于等待状态,等待目标机端调试代理的跟踪,进行子步骤(1.3);
[0043](1.3)目标机端调试代理对(1.2)所创建的子线程进行跟踪:调用ptrace函数,其功能参数为PTRACE_ATTACH、线程号为(1.2)所创建的子线程的线程号、地址参数和数据参数均为O ;
[0044]然后进行子步骤(1.4);
[0045](1.4)目标机端调试代理在所述子线程内部加载被调试应用程序,并另外为被调试应用程序建立符号表,加载被调试应用程序的子线程处于暂停状态,停在代码起始位置;进行子步骤(1.5);
[0046](1.5)宿主机端调试器向目标机端调试代理发起远程连接请求,经目标机端调试代理确认后,建立远程连接;在建立远程连接之后的整个调试过程中,目标机端调试代理一直处于监听状态,时刻准备接受宿主机端调试器发送的RSP数据包,进行步骤(2);
[0047](2)发送调试命令步骤,包括下述子步骤:
[0048](2.1)宿主机端调试器接收调试人员输入的调试命令,判断所述调试命令的命令类型是否为退出命令(quit),是则结束,否则进行子步骤(2.2);
[0049](2.2)遍历自身存储的调试命令集,查找所述调试命令的命令类型在调试命令集中是否存在,是则进行子步骤(2.3),否则输出提示信息,提示调试人员调试命令输入错误,转子步骤(2.1);所述调试命令集包括调试命令的下述命令类型:线程核绑定、插入断点、查询断点、单步执行、持续执行、执行至结束、删除断点、查看变量、查看线程运行核、获取核运行线程、统计线程运行时间;
[0050](2.3)将所述调试命令作为数据,封装成RSP数据包,发送给目标机端调试代理,转步骤⑶;
[0051](2.4)判断在T秒内是否收到目标机端调试代理的执行结果RSP数据包,是则进行子步骤(2.5),否则转子步骤(2.1),O < T≤1 ;
[0052](2.5)宿主机端调试器解析执行结果RSP数据包,将其中的数据反馈给调试人员,转子步骤(2.1);
[0053](3)分析调试命令步骤,包括下述子步骤:
[0054](3.1)目标机端调试代理接收宿主机端调试器发送的RSP数据包,提取其中的数据成为调试命令;
[0055](3.2)目标机端调试代理分析所述调试命令的命令类型:命令类型为线程核绑定时,相应的命令参数为待绑定的线程号与CPU亲和度掩码,进行步骤(4);命令类型为插入断点时,相应的命令参数为线程号、核号、源代码文件名、源代码文件行号,进行步骤(5);命令类型为查询断点时,相应的命令参数为空,进行步骤(6);命令类型为删除断点时,相应的命令参数为断点编号,进行步骤(7);命令类型为单步执行时,相应的命令参数为空,进行步骤(8);命令类型为持续执行时,相应的命令参数为空,进行步骤(9);命令类型为执行至结束时,相应的命令参数为空,进行步骤(10);命令类型为查看变量时,相应的命令参数为变量名,进行步骤(11);命令类型为查看线程运行核时,相应的命令参数为待查看的线程号,进行步骤(12);命令类型为获取核运行线程时,相应的命令参数为核号,进行步骤
(13);命令类型为统计线程运行时间,相应的命令参数为被统计线程的线程号,进行步骤
(14);
[0056](4)线程核绑定步骤,包括下述子步骤:
[0057](4.1)目标机端调试代理从操作系统调用设置亲和度掩码函数,从所述调试命令的命令参数中提取线程号与CPU亲和度掩码,作为所述设置亲和度掩码函数的两个参数,运行所述设置亲和度掩码函数,即能够将所述线程号指代的线程绑定到所述CPU亲和度掩码所确定的核上;所述线程号为子步骤(1.2)所创建的子线程的线程号;
[0058](4.2)判断所述设置亲和度掩码函数返回值是否为1,是则将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);否则将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);[0059](5)插入断点步骤,包括下述子步骤:
[0060](5.1)目标机端调试代理在自身存储的断点信息链表中添加一个节点,在该节点数据位加入一个新的断点编号,同时从所述调试命令的命令参数中提取相应的线程号、核号、源代码文件名、源代码文件行号,加入所述节点数据位中;所述线程号为子步骤(1.2)所创建的子线程的线程号;
[0061](5.2)目标机端调试代理利用被调试应用程序的符号表,根据(5.1)新添加节点数据位中的源代码文件名和源代码文件行号,确定在目标文件中与之对应的机器指令的地址,然后用一条中断指令替换该地址处的机器指令,将该地址处原有机器指令保存至(5.1)新添加节点数据位的断点指令中;所述中断指令用于暂停执行被调试应用程序,并发送信号通知目标极端调试代理;
[0062](5.3)目标机端调试代理将(5.1)新添加节点的数据位作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0063](6)查询断点步骤:
[0064]目标机端调试代理将断点信息链表中的所有节点的数据位作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0065](7)删除断点步骤,包括下述子步骤:
[0066](7.1)目标机端调试代理从所述调试命令的命令参数中提取相应的断点编号,在自身存储的断点信息链表中查找是否存在包含所述断点编号的节点,是则进行子步骤(7.2),否则进行子步骤(7.3);
[0067](7.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点编号的节点,将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0068](7.3)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0069](8)单步执行步骤,包括下述子步骤:
[0070](8.1)按照子步骤(5.1),目标机端调试代理在自身存储的断点信息链表中添加一个节点,所述节点数据位中,源文件名为当前执行的源文件名,源文件行号为当前执行源代码行的下一行的行号,核号为0,线程号为被调试应用程序所对应的线程号;在执行子步骤(5.2)后,进行子步骤(8.2);
[0071](8.2)根据被调试应用程序的当前暂停位置处的断点的断点编号,在自身存储的断点信息链表中查找是否存在包含所述断点编号的节点,是则进行子步骤(8.3),否则进行子步骤(8.5);
[0072](8.3)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点编号的节点,被调试应用程序恢复执行,然后判断被调试应用程序是否成功执行至(8.1)所设定的断点位置处,是则进行子步骤(8.4),否则进行子步骤(8.5);
[0073](8.4)将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0074](8.5)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0075](9)持续执行步骤,包括下述子步骤:
[0076](9.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(9.2),否则进行子步骤(9.5);
[0077](9.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(9.3),否则进行子步骤(9.4);
[0078](9.3)比较所述应用程序的运行核的核号与所遇到断点位置所对应的节点中数据位的核号是否相同,是则被调试应用程序暂停运行,进行子步骤(9.4),否则进行子步骤(9.1);
[0079](9.4)将暂停位置处的行号作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0080](9.5)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0081](10)执行至结束步骤,包括下述子步骤:
[0082](10.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(10.2),否则进行子步骤(10.4);
[0083](10.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(10.1),否则被调试应用程序执行至结束,进行子步骤(10.3);
[0084](10.3)将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0085](10.4)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0086](11)查看变量步骤,包括下述子步骤:
[0087](11.1)目标机端调试代理利用被调试应用程序的符号表,从所述调试命令的命令参数中提取相应的变量名称,查找符号表,判断在符号表中是否存在该变量;是则进行子步骤(11.2),否则进行子步骤(11.3);
[0088](11.2)将该变量的值作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0089](11.3)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0090](12)查看线程运行核步骤,包括下述子步骤:
[0091](12.1)目标机端调试代理从所述调试命令的命令参数中提取相应的线程号查看其指代的线程在操作系统的进程信息文件系统proc目录下的task文件夹下对应的线程子文件夹下的stat文件,读取该线程的运行核;
[0092](12.2)目标机端调试代理将所读取线程的运行核的核号作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0093](13)获取核运行线程步骤,包括下述子步骤:
[0094](13.1)目标机端调试代理从操作系统的进程信息文件系统proc目录下的task文件夹下各线程子文件夹下的stat文件,读取所有线程的运行核,然后统计各个核的核状态及各个核运行线程的状态;
[0095]核状态分为三种:运行状态、暂停状态、空闲状态;
[0096]核运行线程的状态分为四种:当前核没有线程运行、当前核只有单个线程运行、当前核有多个线程运行、当前核所有线程运行;
[0097](13.2)目标机端调试代理从所述调试命令的命令参数中提取核号,将该核号所指代的核的核状态以及在该核上的核运行线程的状态作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0098](14)统计线程运行时间步骤,包括下述子步骤:
[0099](14.1)目标机端调试代理从所述调试命令的命令参数中提取相应的线程号,查看其指代的线程在操作系统的进程信息文件系统proc目录下的task文件夹下对应的线程子文件夹下的stat文件,读取该线程在核上运行的系统时间与用户时间;
[0100](14.2)目标机端调试代理将所述系统时间与用户时间作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0101]本发明提供的调试方法包括线程核绑定步骤、插入断点步骤、查询断点步骤、删除断点步骤、单步执行步骤、持续执行步骤、执行至结束步骤、查看变量步骤、查看线程运行核步骤、获取核运行线程步骤和统计线程运行时间步骤,通过这些步骤,宿主机端调试器可以分别实现下述调试功能:
[0102](I)线程核绑定(设置CPU亲和度)
[0103]根据调试命令的线程号和CPU亲和度掩码将指定线程绑定到掩码相对应的CPU上运行;
[0104]核绑定可以解决两类问题:
[0105](a)在进行多核调试时,如果有多个线程都在等待一个正在被占有的核,而恰恰此时其它的某个核一直空闲,此时进行核绑定会大大提高调试的速度,使得调试更高效;
[0106](b)当多线程之间存在交互,如拥有共享变量时,当一个线程在A核上运行完毕,一些执行的信息会保留在A核的缓存中,此时将与该线程存在交互行为的一个或几个线程调度到A核执行,减少不确定性因素对被调试程序的影响,会避免诸如缓存未命中的情况,使得运行更加高效。
[0107](2)插入断点
[0108]根据调试命令的源代码文件名、源代码文件行号、线程号与核号,为线程号所指代的线程设定断点,断点位置由核号、源代码文件名、源代码文件行号共同确定;
[0109]插入断点的功能是调试应用程序的核心,在应用程序源代码文件的特定行插入断点是为了让应用程序执行至断点位置时暂停执行,以便调试人员分析被调试应用程序的执行状态,此外,在单步执行被调试应用程序的时候,目标机端调试代理需要不断的向被调试应用程序下一行源代码位置处插入断点,这都需要插入断点功能的支持。
[0110](3)查询断点
[0111]根据调试命令的线程号显示该线程的断点信息,断点信息包括断点编号以及该断点所在核号、源代码文件名、源代码文件行号;
[0112]查询断点的功能是为了让调试人员查看已设定断点的信息,在调试大型应用程序的时候,调试人员会设定很多的断点,对于这些断点信息,完全凭调试人员记忆是不科学也是不现实的,查询断点功能显示已设定断点的信息,包括断点的编号、位置等重要信息,已设定断点的位置是调试人员增加或者删除断点的依据,断点的唯一性的编号是删除断点时的参数。
[0113]⑷删除断点
[0114]根据调试命令的断点编号,删除断点编号所对应的断点;
[0115]调试人员在调试应用程序的过程中,有可能设定了多余的断点,或者断点位置设置不对,这都需要将某些断点删除,删除断点正是提供了这一功能,此外,在单步执行被调试应用程序的时候,需要不断的删除已插入的断点。
[0116](5)单步执行
[0117]被调试应用程序从暂停状态恢复执行完一行源代码,执行至下一行源代码的起始位置处再次暂停;
[0118]调试人员在调试应用程序的过程中,对于可能出现程序错误的源代码段,调试人员希望重点调试,了解所述代码段的详细执行过程,这就需要单步执行被调试应用程序。
[0119](6)持续执行
[0120]被调试应用程序暂停状态恢复执行,一直执行到断点位置再次暂停,若没有遇到断点,被跟踪线程执行至结束;
[0121]调试人员在调试应用程序的过程中,不希望单步执行非重点调试的代码段,可以利用持续执行功能一次执行多行源代码,直到遇到调试人员设置的断点,这提高了调试应用程序的效率,这使得调试人员专注于调试重点代码段,对于已经调试或者没有问题的代码段直接执行,需要指出的是,当被调试应用程序持续执行遇到断点的时候,并不代表本次持续执行命令执行完成,目标机端调试代理需要检查被调试应用程序所对应的核号是否与所遇到的断点的核号是否一致,如果不一致,则视为没有遇到断点,被调试应用程序恢复执行,换句话说,调试人员事先设定的断点时核特定断点,断点的位置与核号直接相关。
[0122](7)执行至结束
[0123]被调试应用程序从暂停状态恢复执行,忽略被调试应用程序的所有断点,执行至结束;
[0124]当调试人员完成了对应用程序一次调试过程,希望一条调试命令就能执行完还未执行的应用程序对应的源代码,执行至结束调试命令正是提供这一功能。
[0125](8)查看变量
[0126]根据调试命令的变量名,显示该变量的值;
[0127]调试应用程序实质是检测被调试应用程序的每一步是否执行正确,即变量的值在整个被调试应用程序执行的过程中是否是期望值,单步执行被调试应用程也是为查看变量服务的,查看变量的值是否是期望值,是检验程序是否正确执行的标准。[0128](9)查看线程运行核
[0129]根据调试命令的线程号,显示线程运行核信息,即线程被CPU调度运行的历史记录,以及是否曾经被绑定;
[0130]查看线程运行核,能够使调试人员掌握线程在哪个核上运行以及各个核的负载,为调试人员调度和设定断点提供参考。
[0131](10)获取核运行线程
[0132]根据调试命令给定核的编号,显示该核的核名称、核状态、核运行线程的状态、运行的线程等信息;
[0133]在调试过程中,当一个核发生故障时,其他核的情况状态将很难把握,问题发生的原因也很难确定,通过断点操作让被调试程序停在可能出现异常的位置,通过执行控制操作控制程序的运行,并获取指定核的信息,从而达到分析多核环境下应用程序交互状态的功能,也能掌握整个系统大致运行情况以及明确当前各活动线程运行状态,进而更能准确的定位程序问题位置,在一定程度上达到了同时调试多个内核的要求。
[0134](11)统计线程运行时间
[0135]根据调试命令的线程号统计并显示线程在各个核上运行的用户时间和系统时间;
[0136]查看线程运行时间,能够使调试人员掌握各个线程的运行时间以及各个核的负载,为调试人员调度提供参考;
[0137]通过上述调试功能,了解整个目标机端应用程序运行的基本情况、对应用程序运行的各种异常更准确定位。
[0138]本发明独立于操作系统,传统调试器只能在特定的操作系统上运行,如全视图调试器(TotalView Debugger)只能在Iinux操作系统下运行。尽管本发明也需要操作系统的支持,如线程跟踪系统调用函数,进程信息文件系统,但这些都是各主流操作系统均提供的系统支持。
[0139]本发明中的目标机端调试代理既可以可以运行在X86架构上,如芯片英特尔芯片架构,也可以运行在mips架构上,如国产龙芯体系结构。
[0140]本发明的调试功能较全面,可以实时地获取被调试应用程序的执行状态,包括各个核当前运行线程信息、被调试线程运行时间、查看被调试应用程序的变量、查看线程运行核等。与现有的多核调试工具相比,本发明是基于传统单线程调试和多线程调试进行多核应用程序调试功能的扩展,这样做的好处是:首先,在已有应用程序宿主机端调试器上进行扩展,开发周期短、开发难度小;其次,原先运行于单核处理器上的应用程序现在也可以在多核处理器上进行调试。扩展后的宿主机端调试器在一定程度上满足了调试人员对多核远程应用程序调试的需求。线程核绑定、为线程设定核特定断点、单步执行、持续执行、执行至结束等功能均考虑到了多核环境。调试人员可以控制被调试程序在哪个核上运行,使得被调试应用程序能够高效执行,提高调试效率。
【专利附图】
【附图说明】
[0141]图1为本发明的流程示意图;
[0142]图2为发送调试命令步骤流程示意图;[0143]图3为单步执行步骤流程示意图;
[0144]图4为持续执行步骤流程示意图;
[0145]图5为执行至结束步骤流程示意图。
【具体实施方式】
[0146]下面结合附图和实施例对本发明进一步说明。
[0147]如图1所示,本发明包括建立远程连接步骤、发送调试命令步骤、分析调试命令步骤、线程核绑定步骤、插入断点步骤、查询断点步骤、删除断点步骤、单步执行步骤、持续执行步骤、执行至结束步骤、查看变量步骤、查看线程运行核步骤、获取核运行线程步骤和统计线程运行时间步骤。
[0148]图2为发送调试命令步骤流程示意图;
[0149]图3为单步执行骤流程示意图;
[0150]图4为持续执行步骤流程示意图;
[0151]图5为执行至结束骤流程示意图。
[0152]本发明的实施例,测试环境如下:
[0153]宿主机:CPU为ARMll MPCore,内存:1G,操作系统为Ubuntul0.04操作系统;
[0154]目标机:CPU为龙芯3A,具有多核芯片,内存型号DDR2800Mhz (IG),操作系统为红旗Linux操作系统。
[0155]本实施例为被调试应用程序test, c的一次调试过程,包括下述步骤:
[0156](I)建立远程连接步骤,包括下述子步骤:
[0157](1.1)调试人员运行目标机端调试代理,参数为被调试应用程序的文件名test,c ;运行宿主机端调试器,参数为目标机的IP地址115.156.200.181和被调试应用程序的文件名 test, c ;
[0158](1.2)目标机端调试代理首先创建一个子线程,在子线程中调用ptrace函数,ptrace函数的功能参数为PTRACE_TRACEME、线程号、地址和数据均为0,此时所述子线程处于等待状态,等待目标机端调试代理的跟踪,进行子步骤(1.3);
[0159](1.3)目标机端调试代理对(1.2)所创建的子线程进行跟踪:调用ptrace函数,其功能参数为PTRACE_ATTACH、线程号为(1.2)所创建的子线程的线程号、地址参数和数据参数均为O ;然后进行子步骤(1.4);
[0160](1.4)目标机端调试代理在所述子线程内部加载被调试应用程序test, c,并另外为被调试应用程序建立符号表,加载被调试应用程序的子线程处于暂停状态,停在代码起始位置,进行子步骤(1.5);
[0161](1.5)宿主机端调试器向目标机端调试代理发起远程连接请求,经目标机端调试代理确认后,建立远程连接;在建立远程连接之后的整个调试过程中,目标机端调试代理一直处于监听状态,时刻准备接受宿主机端调试器发送的RSP数据包,进行步骤(2);
[0162](2)发送调试命令步骤,包括下述子步骤:
[0163](2.1)宿主机端调试器接收调试人员输入的调试命令,判断所述调试命令的命令类型是否为退出命令(quit),是则结束,否则进行子步骤(2.2);
[0164]本实施例包括五条调试命令,调试人员在输入一条调试命令后,等待该命令执行完成后,然后输入下一条调试命令,所述五条调试命令分别为:
[0165]第一条调试命令为插入断点调试命令:break test, c:1328840001,其中test, c,13表示源文件test, c中的第13行,2884是步骤(1)中调试代理为被调试应用程序test,c创建的子线程号,0001为CPU亲和度掩码,意味着将断点插入在编号为I的核上;
[0166]第二条调试命令为持续执行调试命令continue ;
[0167]第三条调试命令为查看变量调试命令:print sum,其中print为查看变量调试命令的命令类型,sum为被调试应用程序test, c中一个变量;
[0168]第四条调试命令为执行至结束调试命令:finish ;
[0169]第五条调试命令为退出命令:quit ;
[0170]接受调试命令后,首先判断是否为quit调试命令,本实施例中前4条均不是quit命令,执行子步骤(2.2),第五条为quit命令,意味着执行完所述4条调试命令后,结束整个调试过程;
[0171](2.2)对于前4条调试命令,宿主机端调试器遍历自身存储的调试命令集,查找每条调试命令的命令类型在调试命令集中是否存在,是则进行子步骤(2.3),否则输出提示信息,提示调试人员调试命令输入错误,转子步骤(2.1),上述4条调试命令均能在调试命令集中找到,于是进行子步骤(2.3)
[0172](2.3)将所述调试命令作为数据,封装成RSP数据包,发送给目标机端调试代理,转步骤⑶;
[0173](2.4)判断在I秒内是否收到目标机端调试代理的执行结果RSP数据包,是则进行子步骤(2.5),否则转子步骤(2.1),所述4条调试命令均在I秒内收到了目标机端调试代理的执行结果RSP数据包;
[0174](2.5)宿主机端调试器解析执行结果RSP数据包,将其中的数据反馈给调试人员,第一条插入断点调试命令的执行结果RSP数据包中的数据为“test, c:1328840001^,表示插入断点成功,反馈给调试人员的信息为:“breakpointlinserted successfully intest, c:13”;第二条持续执行调试命令的执行结果RSP数据包中的数据为“ 13”,表示被调试应用程序test, c执行至第13行时遇到断点暂停,于是反馈给调试人员的信息为test, c第13行的源代码:“int b = O” ;第三条查看变量调试命令的执行结果RSP数据包中的数据为“12”,表示变量sum的值为12,于是反馈给调试人员的信息为:“sum= 12”;第四条执行至结束调试命令的执行结果RSP数据包中的数据为表示成功地字符串“success”,于是反馈给调试人员的信息为:“success”,转子步骤(2.1);
[0175](3)分析调试命令步骤,包括下述子步骤:
[0176](3.1)目标机端调试代理接收宿主机端调试器发送的RSP数据包,提取其中的数据成为调试命令;
[0177](3.2)目标机端调试代理分析所述调试命令的命令类型:在本实施例中,目标机端调试代理依次接受到4条调试命令,第I条调试命令的命令类型为插入断点,进行步骤
(5),第2条调试命令的命令类型为持续执行,进行步骤(9),第3条调试命令的命令类型为查看变量,进行步骤(11),第4条调试命令的命令类型为执行至结束,进行步骤(10);
[0178](5)插入断点步骤,包括下述子步骤:
[0179](5.1)目标机端调试代理在自身存储的断点信息链表中添加一个节点,在该节点数据位加入一个新的断点编号,同时从所述调试命令的命令参数中提取相应的线程号2884、核号0001、源代码文件名test.C、源代码文件行号13,加入所述节点数据位中,所述线程号为子步骤(1.2)所创建的子线程的线程号;
[0180](5.2)目标机端调试代理利用被调试应用程序的符号表,根据(4.1)新添加节点数据位中的源代码文件名和源代码文件行号,确定在目标文件中与之对应的机器指令的地址,然后用一条终端指令替换该地址处的机器指令,将该地址处原有机器指令保存至(5.1)新添加节点数据位的断点指令中;所述中断指令用于暂停执行被调试应用程序,并发送信号通知目标极端调试代理;
[0181](5.3)目标机端调试代理将(5.1)新添加节点的数据位作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0182](9)持续执行步骤,包括下述子步骤:
[0183](9.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(9.2),否则进行子步骤(9.5),结果显示存在包含所述断点地址的断点,进行子步骤(9.2);
[0184](9.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(9.3),否则进行子步骤(9.4),结果显示被调试应用程序执行至第13行的时候遇到断点;
[0185](9.3)比较是否所述应用程序的运行核的核号与所遇到断点位置所对应的节点中数据位的核号相同,是则被调试应用程序暂停运行,进行子步骤(9.4),否则进行子步骤(9.1),结果显示核号均为0001,于是被调试应用程序test, c暂停运行;
[0186](9.4)将暂停位置处的行号“13”作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0187](9.5)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0188](10)执行至结束步骤,包括下述子步骤:
[0189](10.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(10.2),否则进行子步骤(10.4),查询结果显示该节点存在;
[0190](10.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(10.1),否则被调试应用程序执行至结束,进行子步骤(10.3),结果显示在执行过程中没有遇到断点;
[0191](10.3)将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0192](10.4)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);
[0193](11)查看变量步骤,包括下述子步骤:
[0194](11.1)目标机端调试代理利用被调试应用程序test, c的符号表,从所述调试命令的命令参数中提取相应的变量名称sum,查找符号表,判断在符号表中是否存在该变量;是则进行子步骤(11.2),否则进行子步骤(11.3);结果显示被调试应用程序中存在变量sum ;
[0195](11.2)将该变量的值“12”作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,结束;
[0196](11.3)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4)。
【权利要求】
1.一种嵌入式多核环境下应用程序的调试方法,包括建立远程连接步骤、发送调试命令步骤、分析调试命令步骤、线程核绑定步骤、插入断点步骤、查询断点步骤、删除断点步骤、单步执行步骤、持续执行步骤、执行至结束步骤、查看变量步骤、查看线程运行核步骤、获取核运行线程步骤和统计线程运行时间步骤,其特征在于: (1)建立远程连接步骤,包括下述子步骤: (1.1)调试人员运行目标机端调试代理,参数为被调试应用程序的文件名;运行宿主机端调试器,参数为目标机的IP地址和被调试应用程序的文件名; (1.2)目标机端调试代理首先创建一个子线程,在子线程中调用ptrace函数,ptrace函数的功能参数为PTRACE_TRACEME、线程号、地址和数据均为O,此时所述子线程处于等待状态,等待目标机端调试代理的跟踪,进行子步骤(1.3); (1.3)目标机端调试代理对(1.2)所创建的子线程进行跟踪:调用ptrace函数,其功能参数为PTRACE_ATTACH、线程号为(1.2)所创建的子线程的线程号、地址参数和数据参数均为O ; 然后进行子步骤(1.4); (1.4)目标机端调试代理在所述子线程内部加载被调试应用程序,并另外为被调试应用程序建立符号表,加载被调试应用程序的子线程处于暂停状态,停在代码起始位置;进行子步骤(1.5); (1.5)宿主机端调试器向目标机端调试代理发起远程连接请求,经目标机端调试代理确认后,建立远程连接;在建立远程连接之后的整个调试过程中,目标机端调试代理一直处于监听状态,时刻准备接受宿主机端调试器发送的RSP数据包,进行步骤(2); (2)发送调试命令步骤,包括下述子步骤: (2.1)宿主机端调试器接收调试人员输入的调试命令,判断所述调试命令的命令类型是否为退出命令(quit),是则结束,否则进行子步骤(2.2); (2.2)遍历自身存储的调试命令集,查找所述调试命令的命令类型在调试命令集中是否存在,是则进行子步骤(2.3),否则输出提示信息,提示调试人员调试命令输入错误,转子步骤(2.1);所述调试命令集包括调试命令的下述命令类型:线程核绑定、插入断点、查询断点、单步执行、持续执行、执行至结束、删除断点、查看变量、查看线程运行核、获取核运行线程、统计线程运行时间; (2.3)将所述调试命令作为数据,封装成RSP数据包,发送给目标机端调试代理,转步骤⑶; (2.4)判断在T秒内是否收到目标机端调试代理的执行结果RSP数据包,是则进行子步骤(2.5),否则转子步骤(2.1),O < T≤I ; (2.5)宿主机端调试器解析执行结果RSP数据包,将其中的数据反馈给调试人员,转子步骤(2.1); (3)分析调试命令步骤,包括下述子步骤: (3.1)目标机端调试代理接收宿主机端调试器发送的RSP数据包,提取其中的数据成为调试命令; (3.2)目标机端调试代理分析所述调试命令的命令类型:命令类型为线程核绑定时,相应的命令参数为待绑定的线程号与CPU亲和度掩码,进行步骤(4);命令类型为插入断点时,相应的命令参数为线程号、核号、源代码文件名、源代码文件行号,进行步骤(5);命令类型为查询断点时,相应的命令参数为空,进行步骤(6);命令类型为删除断点时,相应的命令参数为断点编号,进行步骤(7);命令类型为单步执行时,相应的命令参数为空,进行步骤(8);命令类型为持续执行时,相应的命令参数为空,进行步骤(9);命令类型为执行至结束时,相应的命令参数为空,进行步骤(10);命令类型为查看变量时,相应的命令参数为变量名,进行步骤(11);命令类型为查看线程运行核时,相应的命令参数为待查看的线程号,进行步骤(12);命令类型为获取核运行线程时,相应的命令参数为核号,进行步骤(13);命令类型为统计线程运行时间,相应的命令参数为被统计线程的线程号,进行步骤(14); (4)线程核绑定步骤,包括下述子步骤: (4.1)目标机端调试代理从操作系统调用设置亲和度掩码函数,从所述调试命令的命令参数中提取线程号与CPU亲和度掩码,作为所述设置亲和度掩码函数的两个参数,运行所述设置亲和度掩码函数,即能够将所述线程号指代的线程绑定到所述CPU亲和度掩码所确定的核上;所述线程号为子步骤(1.2)所创建的子线程的线程号; (4.2)判断所述设置亲和度掩码函数返回值是否为1,是则将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4);否则将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (5)插入断点步骤,包括下述子步骤: (5.1)目标机端调试代理在自`身存储的断点信息链表中添加一个节点,在该节点数据位加入一个新的断点编号,同时从所述调试命令的命令参数中提取相应的线程号、核号、源代码文件名、源代码文件行号,加入所述节点数据位中;所述线程号为子步骤(1.2)所创建的子线程的线程号; (5.2)目标机端调试代理利用被调试应用程序的符号表,根据(5.1)新添加节点数据位中的源代码文件名和源代码文件行号,确定在目标文件中与之对应的机器指令的地址,然后用一条中断指令替换该地址处的机器指令,将该地址处原有机器指令保存至(5.1)新添加节点数据位的断点指令中;所述中断指令用于暂停执行被调试应用程序,并发送信号通知目标极端调试代理; (5.3)目标机端调试代理将(5.1)新添加节点的数据位作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (6)查询断点步骤: 目标机端调试代理将断点信息链表中的所有节点的数据位作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (7)删除断点步骤,包括下述子步骤: (7.1)目标机端调试代理从所述调试命令的命令参数中提取相应的断点编号,在自身存储的断点信息链表中查找是否存在包含所述断点编号的节点,是则进行子步骤(7.2),否则进行子步骤(7.3); (7.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点编号的节点,将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (7.3)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (8)单步执行步骤,包括下述子步骤: (8.1)按照子步骤(5.1),目标机端调试代理在自身存储的断点信息链表中添加一个节点,所述节点数据位中,源文件名为当前执行的源文件名,源文件行号为当前执行源代码行的下一行的行号,核号为O,线程号为被调试应用程序所对应的线程号;在执行子步骤(5.2)后,进行子步骤(8.2); (8.2)根据被调试应用程序的当前暂停位置处的断点的断点编号,在自身存储的断点信息链表中查找是否存在包含所述断点编号的节点,是则进行子步骤(8.3),否则进行子步骤(8.5); (8.3)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点编号的节点,被调试应用程序恢复执行,然后判断被调试应用程序是否成功执行至(8.1)所设定的断点位置处,是则进行子步骤(8.4),否则进行子步骤(8.5); (8.4)将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (8.5)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (9)持续执行步骤,包括下述子步骤: (9.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(9.2),否则进行子步骤0.5); (9.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(9.3),否则进行子步骤(9.4);(9.3)比较所述应用程序的运行核的核号与所遇到断点位置所对应的节点中数据位的核号是否相同,是则被调试应用程序暂停运行,进行子步骤(9.4),否则进行子步骤(9.1);(9.4)将暂停位置处的行号作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (9.5)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (10)执行至结束步骤,包括下述子步骤: (10.1)目标机端调试代理在自身存储的断点信息链表中,根据被调试应用程序的当前断点的断点地址,查找是否存在包含所述断点地址的节点,是则进行子步骤(10.2),否则进行子步骤(10.4); (10.2)将该节点数据位中断点地址所指代地址处的机器指令删除,并以断点指令中存放的机器指令替换,在断点信息链表中删除包含所述断点地址的节点,被调试应用程序恢复执行;判断在执行过程中是否遇到断点,是则进行子步骤(10.1),否则被调试应用程序执行至结束,进行子步骤(10.3); (10.3)将表示成功的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (10.4)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (11)查看变量步骤,包括下述子步骤: (11.D目标机端调试代理利用被调试应用程序的符号表,从所述调试命令的命令参数中提取相应的变量名称,查找符号表,判断在符号表中是否存在该变量;是则进行子步骤(11.2),否则进行子步骤(11.3); (11.2)将该变量的值作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (11.3)将表示错误的字符串作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (12)查看线程运行核步骤,包括下述子步骤: (12.1)目标机端调试代理从所述调试命令的命令参数中提取相应的线程号,查看其指代的线程在操作系统的进程信息文件系统proc目录下的task文件夹下对应的线程子文件夹下的stat文件,读取该线程的运行核; (12.2)目标机端调试代理将所读取线程的运行核的核号作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (13)获取核运行线程步骤,包括下述子步骤: (13.1)目标机端调试代理从操作系统的进程信息文件系统proc目录下的task文件夹下各线程子文件夹下的stat文件,读取所有线程的运行核,然后统计各个核的核状态及各个核运行线程的状态; 核状态分为三种:运行状态、暂停状态、空闲状态; 核运行线程的状态分为四种:当前核没有线程运行、当前核只有单个线程运行、当前核有多个线程运行、当前核所有线程运行; (13.2)目标机端调试代理从所述调试命令的命令参数中提取核号,将该核号所指代的核的核状态以及在该核上的核运行线程的状态作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4); (14)统计线程运行时间步骤,包括下述子步骤: (14.1)目标机端调试代理从所述调试命令的命令参数中提取相应的线程号,查看其指代的线程在操作系统的进程信息文件系统proc目录下的task文件夹下对应的线程子文件夹下的stat文件,读取该线程在核上运行的系统时间与用户时间; (14.2)目标机端调试代理将所述系统时间与用户时间作为数据,封装成执行结果RSP数据包,发送给宿主机端调试器,转子步骤(2.4)。
【文档编号】G06F11/36GK103729288SQ201310533640
【公开日】2014年4月16日 申请日期:2013年11月1日 优先权日:2013年11月1日
【发明者】李国徽, 欧阳峥峥, 黄瑛, 曹粟, 马艳, 万伟, 杨顺华 申请人:华中科技大学, 武汉轻工大学