一种嵌入式软件离线重放调试方法和装置与流程

文档序号:24071175发布日期:2021-02-26 15:21阅读:178来源:国知局
一种嵌入式软件离线重放调试方法和装置与流程

[0001]
本发明属于计算机系统软件专业技术领域,涉及一种嵌入式软件离线重放调试方法和装置。


背景技术:

[0002]
调试是软件开发过程的必要步骤。软件调试时多采用循环调试方法,反复重现问题现场。循环调试方法假设以相同的输入重复执行错误程序,会触发相同的故障,导致相同的错误。开发者在每次执行过程中设置断点、分析程序变量状态、收敛代码范围最终定位错误代码。
[0003]
对确定性程序来说,可多次执行、观察程序运行的运行状态。对于嵌入式多线程系统,非确定性的系统调用、外部设备访问、中断响应、操作系统的任务调度,以及多任务对共享资源(如内存、固存)的访问等因素的影响,使得程序的运行具有不确定性,即在相同的输入条件下,也不能保证嵌入式多线程系统重复相同的执行过程和结果,而导致循环调试时错误无法重现。
[0004]
通常采用记录/在线重放的方法实现不确定性程序的确定性循环调试,见图1。记录/在线重放包括记录和重放两个阶段。在记录阶段,记录程序执行过程中发生的非确定性的输入的数据流、同步事件和中断事件。在重放阶段,以记录的不确定性元素为指导在线执行程序,使用重放代理在运行的程序中依次重现记录的事件。
[0005]
记录/在线重放一般针对运行在本地计算机中的程序,不适用于交叉开发的嵌入式软件。嵌入式系统的资源有限,无法直接存储大数据量的记录信息;记录和在线重放需要在嵌入式操作系统的支持下,插入大量记录和重放功能的代码,比如记录阶段要插入记录非确定性事件的代码,重放阶段需要修改任务调度器,这就使得重放调试与嵌入式操作系统及其应用紧密耦合。


技术实现要素:

[0006]
本发明提供一种嵌入式软件离线重放调试方法和装置,可稳定实现嵌入式软件的确定性离线式重放调试。
[0007]
本发明一方面提供一种嵌入式软件离线重放调试方法,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的gdb、图形化调试器,以及运行在目标机端的调试代理;所述方法包括:
[0008]
记录图形化调试器向gdb发送的调试命令以及gdb向图形化调试器反馈的调试命令对应的回复;
[0009]
在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
[0010]
在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括如下中的至少一项:调用栈、寄存器、变量、表达式、内存和反
汇编的数据。
[0011]
可选的,所述调试命令包括控制类命令和查询类命令。
[0012]
可选的,所述gdb和所述图形化调试器采用mi接口通讯。
[0013]
可选的,所述在所述记录的调试命令中确定所有控制类命令,包括:
[0014]
采用mi接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
[0015]
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
[0016]
可选的,所述调试命令和所述调试命令对应的回复记录在宿主机上。
[0017]
本发明另一方面提供一种嵌入式软件离线重放调试装置,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的gdb、图形化调试器,以及运行在目标机端的调试代理;所述装置包括:
[0018]
记录模块,用于记录图形化调试器向gdb发送的调试命令以及gdb向图形化调试器反馈的调试命令对应的回复;
[0019]
构建模块,用于在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
[0020]
显示模块,用于在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括如下中的至少一项:调用栈、寄存器、变量、表达式、内存和反汇编的数据。
[0021]
可选的,所述调试命令包括控制类命令和查询类命令。
[0022]
可选的,所述gdb和所述图形化调试器采用mi接口通讯。
[0023]
可选的,所述构建模块具体用于:
[0024]
采用mi接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
[0025]
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
[0026]
可选的,所述调试命令和所述调试命令对应的回复记录在宿主机上。
[0027]
本发明提供一种嵌入式软件离线重放调试方法和装置,可稳定实现嵌入式软件的确定性离线式重放调试。不同于已有的在线重放调试,本方法在线记录阶段执行调试程序后,提出以调试场景为单位的离线重放调试方法,以连续的调试场景重现记录的调试全过程,可以执行前进、后退操作切换到相邻的场景。本发明适应性强,所提出的记录-重放机制运行在宿主机端,离线重放调试时不依赖目标机,实现与目标机软硬件的解耦,既不需要在目标机端增加硬件设备,也不要求在嵌入式软件中插入桩代码或者修改嵌入式操作系统及其应用。因此,本发明可广泛适用于多种嵌入式操作系统及其应用程序的开发调试活动。本发明可以方便的把调试过程保存为记录文件,用于远程交流传递或作为研究讨论的基础。
附图说明
[0028]
图1是在线重放调试组成结构的示意图;
[0029]
图2是本发明提供的嵌入式软件离线重放调试方法的流程示意图;
[0030]
图3是本发明提供的基于gdb的交叉调试的示意图;
[0031]
图4是本发明提供的离线重放调试组成结构的示意图。
具体实施方式
[0032]
下面结合附图,对本发明提供的基于gdb mi接口的离线式重放调试方法进行解释说明。
[0033]
参照图2-4,本发明为嵌入式软件开发调试提供一种基于gdb mi接口的离线式重放调试方法。
[0034]
执行基于gdb mi接口的离线式重放调试方法的装置称为嵌入式软件交叉调试器,由运行在宿主机上的gdb、图形化调试器,以及运行在目标机端的调试代理组成。gdb和图形化调试器基于gdb mi接口进行通讯。
[0035]
示例性的,嵌入式软件运行在目标机端,调试软件通常运行在宿主机端,宿主机和目标机通过通信通道(如网络、串口)链接。
[0036]
其中,gdb全称为gnu debugger,是gnu开源组织发布的支持多种目标平台的源代码级调试器。gdb提供了基于文本行的机器接口(machine interface,mi)。图形化调试器与gdb通过mi接口交互。
[0037]
图形化调试器接收用户输入的调试操作,gdb通过mi以文本行为单位接收与用户输入的调试操作对应的命令,也以文本行为单位生成回复,输出执行结果。图形化调试器提供的每个调试操作都对应一组mi命令集合,只要完整记录gdb和图形化调试器之间的mi接口数据,就可以完整的描述一次调试过程。
[0038]
本发明基于gdb调试器,提出一种嵌入式软件离线重放方法,结构见图3。该方法把重放调试的执行过程划分为两个阶段:在线记录阶段和离线重放阶段。
[0039]
其中,在线记录阶段执行程序,为每个调试操作保存图形化调试器和gdb之间通过mi接口交互的数据,包括图形化调试器发送发给gdb的调试命令,以及gdb的回复命令数据。
[0040]
离线重放阶段,使用mi接口协议解析记录的数据,构建成一组连续的调试场景。一个调试场景是调试执行时一次程序暂停后的程序现场数据的集合,包括调用栈、寄存器、变量、反汇编、内存和表达式等对象。调试场景来源于记录数据,可以被确定性的重复展示。
[0041]
本发明提供的嵌入式软件离线重放调试方法的技术方案包括:
[0042]
1.调试数据记录方法
[0043]
本发明提供的基于gdb的调试数据记录方法中,gdb的输入流是来自接收图形化调试器的命令;gdb的输出流是对命令执行结果的回复。输入流中的一个命令对应输出流中的一条回复。在记录数据流时,为每组命令及其回复添加全局唯一的标识,建立起命令与回复之间一对一的关系。比如下面的例子是一条查询程序调用栈的命令及其回复。
[0044]
176-stack-list-frames 0 2
[0045]
176^done,stack=[frame={level="0",addr="0x6785532c",func="init",file="./src/init_app.c",line="129"},frame={level="1",addr="0x670039dc",func="??"}]
[0046]
上面的例子中,第一行是gdb收到的查询从0开始的两层调用栈信息的命令。第二行是gdb回复查到的数据,包括两个调用栈的序号、地址、函数名、文件名及行号。记录器为命令行和回复行分别添加了标记“176”。
[0047]
2.调试数据解析方法
[0048]
本发明提供的mi接口记录数据解析过程中,在分析总结gdb命令类型的基础上,提
data-list-changed-registers、-stack-list-locals和-stack-list-arguments等命令。在下一个-exec-next之前,这些命令都是为以当前-exec-next为代表的调试场景服务的,定义该场景的具体属性。
[0078]
其中,gdb控制类命令的具体含义可以参见以下表1。
[0079]
表1 gdb控制类命令
[0080][0081]
3.调试数据重放方法
[0082]
本发明提供的脱离目标机的嵌入式软件离线重放调试方法中,以由记录数据形成的调试场景和源代码为输入,完全还原调试现场状态。其中,源代码是可选项,有源码时可重放为源码级、汇编级混合调试;没有源码时只能重放为汇编级调试。一个调试场景代表被调试程序的一次挂起,所有调试场景连续的起来,就可以达到重放全部调试过程的目的。一次离线重放调试从第一个场景开始,到最后一个场景结束,中间提供前进、后退和结束操作,可以在相邻调试场景之间切换,直至完成代码问题分析定位。
[0083]
实施本发明所述的方法后,可稳定实现嵌入式软件的确定性离线式重放调试。不同于已有的在线重放调试,本方法在线记录阶段执行调试程序后,提出以调试场景为单位的离线重放调试方法,以连续的调试场景重现记录的调试全过程,可以执行前进、后退操作切换到相邻的场景。
[0084]
本方法适应性强,所提出的记录-重放机制运行在宿主机端,离线重放调试时不依
赖目标机,实现与目标机软硬件的解耦,既不需要在目标机端增加硬件设备,也不要求在嵌入式软件中插入桩代码或者修改嵌入式操作系统及其应用。因此,本方法可广泛适用于多种嵌入式操作系统及其应用程序的开发调试活动。
[0085]
本方法提出了一种保存调试过程的方法。可以方便的把调试过程保存为记录文件,用于远程交流传递或作为研究讨论的基础。
[0086]
一种嵌入式软件离线重放调试方法的实施步骤为:
[0087]
s1、配置调试会话参数,包括被调试的目标文件、源代码路径、调试器和远程目标机等属性。
[0088]
s2、使能重放记录开关,设置记录文件的路径。
[0089]
s3、启动调试,记录调试操作时gdb输入输出流的数据。
[0090]
s4、结束调试,保存数据到记录文件。
[0091]
s5、配置离线重放调试参数,包括记录文件路径、源代码路径。
[0092]
s6、启动离线重放调试,展示第一个调试场景。
[0093]
s7、开始遍历、切换重放调试场景,观察场景中的调用栈、寄存器、变量、反汇编、内存和表达式等对象,分析定位程序问题。
[0094]
s8、结束本次重放调试。
[0095]
s9、如果需要重新开始离线重放调试,跳转至s5。
[0096]
s10、调试完成,退出。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1