CN112416790B - 一种嵌入式软件离线重放调试方法和装置 - Google Patents

一种嵌入式软件离线重放调试方法和装置 Download PDF

Info

Publication number
CN112416790B
CN112416790B CN202011376685.1A CN202011376685A CN112416790B CN 112416790 B CN112416790 B CN 112416790B CN 202011376685 A CN202011376685 A CN 202011376685A CN 112416790 B CN112416790 B CN 112416790B
Authority
CN
China
Prior art keywords
debugging
commands
command
debugger
gdb
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202011376685.1A
Other languages
English (en)
Other versions
CN112416790A (zh
Inventor
田丹
麦先根
孙景昌
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xian Aeronautics Computing Technique Research Institute of AVIC
Original Assignee
Xian Aeronautics Computing Technique Research Institute of AVIC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xian Aeronautics Computing Technique Research Institute of AVIC filed Critical Xian Aeronautics Computing Technique Research Institute of AVIC
Priority to CN202011376685.1A priority Critical patent/CN112416790B/zh
Publication of CN112416790A publication Critical patent/CN112416790A/zh
Application granted granted Critical
Publication of CN112416790B publication Critical patent/CN112416790B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明提供一种嵌入式软件离线重放调试方法和装置,该方法包括:记录图形化调试器向GDB发送的调试命令以及GDB向图形化调试器反馈的调试命令对应的回复;在记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;调试场景的信息包括如下中的至少一项:调用栈、寄存器、变量、表达式、内存和反汇编的数据。可稳定实现嵌入式软件的确定性离线式重放调试。

Description

一种嵌入式软件离线重放调试方法和装置
技术领域
本发明属于计算机系统软件专业技术领域,涉及一种嵌入式软件离线重放调试方法和装置。
背景技术
调试是软件开发过程的必要步骤。软件调试时多采用循环调试方法,反复重现问题现场。循环调试方法假设以相同的输入重复执行错误程序,会触发相同的故障,导致相同的错误。开发者在每次执行过程中设置断点、分析程序变量状态、收敛代码范围最终定位错误代码。
对确定性程序来说,可多次执行、观察程序运行的运行状态。对于嵌入式多线程系统,非确定性的系统调用、外部设备访问、中断响应、操作系统的任务调度,以及多任务对共享资源(如内存、固存)的访问等因素的影响,使得程序的运行具有不确定性,即在相同的输入条件下,也不能保证嵌入式多线程系统重复相同的执行过程和结果,而导致循环调试时错误无法重现。
通常采用记录/在线重放的方法实现不确定性程序的确定性循环调试,见图1。记录/在线重放包括记录和重放两个阶段。在记录阶段,记录程序执行过程中发生的非确定性的输入的数据流、同步事件和中断事件。在重放阶段,以记录的不确定性元素为指导在线执行程序,使用重放代理在运行的程序中依次重现记录的事件。
记录/在线重放一般针对运行在本地计算机中的程序,不适用于交叉开发的嵌入式软件。嵌入式系统的资源有限,无法直接存储大数据量的记录信息;记录和在线重放需要在嵌入式操作系统的支持下,插入大量记录和重放功能的代码,比如记录阶段要插入记录非确定性事件的代码,重放阶段需要修改任务调度器,这就使得重放调试与嵌入式操作系统及其应用紧密耦合。
发明内容
本发明提供一种嵌入式软件离线重放调试方法和装置,可稳定实现嵌入式软件的确定性离线式重放调试。
本发明一方面提供一种嵌入式软件离线重放调试方法,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的GDB、图形化调试器,以及运行在目标机端的调试代理;所述方法包括:
记录图形化调试器向GDB发送的调试命令以及GDB向图形化调试器反馈的调试命令对应的回复;
在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括如下中的至少一项:调用栈、寄存器、变量、表达式、内存和反汇编的数据。
可选的,所述调试命令包括控制类命令和查询类命令。
可选的,所述GDB和所述图形化调试器采用MI接口通讯。
可选的,所述在所述记录的调试命令中确定所有控制类命令,包括:
采用MI接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
可选的,所述调试命令和所述调试命令对应的回复记录在宿主机上。
本发明另一方面提供一种嵌入式软件离线重放调试装置,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的GDB、图形化调试器,以及运行在目标机端的调试代理;所述装置包括:
记录模块,用于记录图形化调试器向GDB发送的调试命令以及GDB向图形化调试器反馈的调试命令对应的回复;
构建模块,用于在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
显示模块,用于在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括如下中的至少一项:调用栈、寄存器、变量、表达式、内存和反汇编的数据。
可选的,所述调试命令包括控制类命令和查询类命令。
可选的,所述GDB和所述图形化调试器采用MI接口通讯。
可选的,所述构建模块具体用于:
采用MI接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
可选的,所述调试命令和所述调试命令对应的回复记录在宿主机上。
本发明提供一种嵌入式软件离线重放调试方法和装置,可稳定实现嵌入式软件的确定性离线式重放调试。不同于已有的在线重放调试,本方法在线记录阶段执行调试程序后,提出以调试场景为单位的离线重放调试方法,以连续的调试场景重现记录的调试全过程,可以执行前进、后退操作切换到相邻的场景。本发明适应性强,所提出的记录-重放机制运行在宿主机端,离线重放调试时不依赖目标机,实现与目标机软硬件的解耦,既不需要在目标机端增加硬件设备,也不要求在嵌入式软件中插入桩代码或者修改嵌入式操作系统及其应用。因此,本发明可广泛适用于多种嵌入式操作系统及其应用程序的开发调试活动。本发明可以方便的把调试过程保存为记录文件,用于远程交流传递或作为研究讨论的基础。
附图说明
图1是在线重放调试组成结构的示意图;
图2是本发明提供的嵌入式软件离线重放调试方法的流程示意图;
图3是本发明提供的基于GDB的交叉调试的示意图;
图4是本发明提供的离线重放调试组成结构的示意图。
具体实施方式
下面结合附图,对本发明提供的基于GDB MI接口的离线式重放调试方法进行解释说明。
参照图2-4,本发明为嵌入式软件开发调试提供一种基于GDB MI接口的离线式重放调试方法。
执行基于GDB MI接口的离线式重放调试方法的装置称为嵌入式软件交叉调试器,由运行在宿主机上的GDB、图形化调试器,以及运行在目标机端的调试代理组成。GDB和图形化调试器基于GDB MI接口进行通讯。
示例性的,嵌入式软件运行在目标机端,调试软件通常运行在宿主机端,宿主机和目标机通过通信通道(如网络、串口)链接。
其中,GDB全称为GNU Debugger,是GNU开源组织发布的支持多种目标平台的源代码级调试器。GDB提供了基于文本行的机器接口(Machine Interface,MI)。图形化调试器与GDB通过MI接口交互。
图形化调试器接收用户输入的调试操作,GDB通过MI以文本行为单位接收与用户输入的调试操作对应的命令,也以文本行为单位生成回复,输出执行结果。图形化调试器提供的每个调试操作都对应一组MI命令集合,只要完整记录GDB和图形化调试器之间的MI接口数据,就可以完整的描述一次调试过程。
本发明基于GDB调试器,提出一种嵌入式软件离线重放方法,结构见图3。该方法把重放调试的执行过程划分为两个阶段:在线记录阶段和离线重放阶段。
其中,在线记录阶段执行程序,为每个调试操作保存图形化调试器和GDB之间通过MI接口交互的数据,包括图形化调试器发送发给GDB的调试命令,以及GDB的回复命令数据。
离线重放阶段,使用MI接口协议解析记录的数据,构建成一组连续的调试场景。一个调试场景是调试执行时一次程序暂停后的程序现场数据的集合,包括调用栈、寄存器、变量、反汇编、内存和表达式等对象。调试场景来源于记录数据,可以被确定性的重复展示。
本发明提供的嵌入式软件离线重放调试方法的技术方案包括:
1.调试数据记录方法
本发明提供的基于GDB的调试数据记录方法中,GDB的输入流是来自接收图形化调试器的命令;GDB的输出流是对命令执行结果的回复。输入流中的一个命令对应输出流中的一条回复。在记录数据流时,为每组命令及其回复添加全局唯一的标识,建立起命令与回复之间一对一的关系。比如下面的例子是一条查询程序调用栈的命令及其回复。
176-stack-list-frames 0 2
176^done,stack=[frame={level="0",addr="0x6785532c",func="Init",file="./src/init_app.c",line="129"},frame={level="1",addr="0x670039dc",func="??"}]
上面的例子中,第一行是GDB收到的查询从0开始的两层调用栈信息的命令。第二行是GDB回复查到的数据,包括两个调用栈的序号、地址、函数名、文件名及行号。记录器为命令行和回复行分别添加了标记“176”。
2.调试数据解析方法
本发明提供的MI接口记录数据解析过程中,在分析总结GDB命令类型的基础上,提出调试场景的概念。调试场景描述了调试过程中的状态,被调试程序的每次挂起都会形成一个调试场景,是程序挂起后调用栈、寄存器、变量、表达式、内存和反汇编信息的集合,能充分反映程序当时的状态。一个调试场景以一个控制类命令作为开始,以下一个控制类命令作为结束,即两个控制类命令之间的所有其他命令(主要是查询类命令)及其回复构成一个调试场景。
下面是一种可能的调试场景示例。
213-exec-next 1
213^running
*running,thread-id="all"
*stopped,reason="end-stepping-range",frame={addr="0x67855364",func="Init",args=[],file="./src/init_app.c",fullname="./src/init_app.c",line="134"},thread-id="1",stopped-threads="all"
214 info threads
&"info threads\n"
~"Id Target Id Frame\n"
~"*1 Thread<main>Init()at./src/init_app.c:134\n"
214^done
215-stack-info-depth
215^done,depth="2"
216-stack-list-frames 0 2
216^done,stack=[frame={level="0",addr="0x67855364",func="Init",file="./src/init_app.c",fullname="./src/init_app.c",line="134"},frame={level="1",addr="0x670039dc",func="??"}]
217-var-update var1
217^done,changelist=[]
218-var-update var2
218^done,changelist=[]
219-data-list-changed-registers
219^done,changed-registers=["1","3","14","15","25"]
220 info sharedlibrary
&"info sharedlibrary\n"
~"No shared libraries loaded at this time.\n"
220^done
221-stack-list-arguments 0 0 0
221^done,stack-args=[frame={level="0",args=[]}]
222-stack-list-locals 0
222^done,locals=[name="taskCreateParam",name="retCode"]
上述示例是在跟踪程序时经常使用的单步命令-exec-next,其后会连续的查询调用栈、变量、寄存器等对象,如-stack-info-depth、-stack-list-frames、-var-update、-data-list-changed-registers、-stack-list-locals和-stack-list-arguments等命令。在下一个-exec-next之前,这些命令都是为以当前-exec-next为代表的调试场景服务的,定义该场景的具体属性。
其中,GDB控制类命令的具体含义可以参见以下表1。
表1 GDB控制类命令
Figure BDA0002808040920000071
3.调试数据重放方法
本发明提供的脱离目标机的嵌入式软件离线重放调试方法中,以由记录数据形成的调试场景和源代码为输入,完全还原调试现场状态。其中,源代码是可选项,有源码时可重放为源码级、汇编级混合调试;没有源码时只能重放为汇编级调试。一个调试场景代表被调试程序的一次挂起,所有调试场景连续的起来,就可以达到重放全部调试过程的目的。一次离线重放调试从第一个场景开始,到最后一个场景结束,中间提供前进、后退和结束操作,可以在相邻调试场景之间切换,直至完成代码问题分析定位。
实施本发明所述的方法后,可稳定实现嵌入式软件的确定性离线式重放调试。不同于已有的在线重放调试,本方法在线记录阶段执行调试程序后,提出以调试场景为单位的离线重放调试方法,以连续的调试场景重现记录的调试全过程,可以执行前进、后退操作切换到相邻的场景。
本方法适应性强,所提出的记录-重放机制运行在宿主机端,离线重放调试时不依赖目标机,实现与目标机软硬件的解耦,既不需要在目标机端增加硬件设备,也不要求在嵌入式软件中插入桩代码或者修改嵌入式操作系统及其应用。因此,本方法可广泛适用于多种嵌入式操作系统及其应用程序的开发调试活动。
本方法提出了一种保存调试过程的方法。可以方便的把调试过程保存为记录文件,用于远程交流传递或作为研究讨论的基础。
一种嵌入式软件离线重放调试方法的实施步骤为:
S1、配置调试会话参数,包括被调试的目标文件、源代码路径、调试器和远程目标机等属性。
S2、使能重放记录开关,设置记录文件的路径。
S3、启动调试,记录调试操作时GDB输入输出流的数据。
S4、结束调试,保存数据到记录文件。
S5、配置离线重放调试参数,包括记录文件路径、源代码路径。
S6、启动离线重放调试,展示第一个调试场景。
S7、开始遍历、切换重放调试场景,观察场景中的调用栈、寄存器、变量、反汇编、内存和表达式等对象,分析定位程序问题。
S8、结束本次重放调试。
S9、如果需要重新开始离线重放调试,跳转至S5。
S10、调试完成,退出。

Claims (8)

1.一种嵌入式软件离线重放调试方法,其特征在于,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的GDB、图形化调试器,以及运行在目标机端的调试代理;所述方法包括:
记录图形化调试器向GDB发送的调试命令以及GDB向图形化调试器反馈的调试命令对应的回复;
在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括:调用栈、寄存器、变量、表达式、内存和反汇编的数据;
所述在所述记录的调试命令中确定所有控制类命令,包括:
采用MI接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
2.根据权利要求1所述的方法,其特征在于,所述调试命令包括控制类命令和查询类命令。
3.根据权利要求1所述的方法,其特征在于,所述GDB和所述图形化调试器采用MI接口通讯。
4.根据权利要求1所述的方法,其特征在于,所述调试命令和所述调试命令对应的回复记录在宿主机上。
5.一种嵌入式软件离线重放调试装置,其特征在于,应用于嵌入式软件交叉调试器,所述调试器包括运行在宿主机上的GDB、图形化调试器,以及运行在目标机端的调试代理;所述装置包括:
记录模块,用于记录图形化调试器向GDB发送的调试命令以及GDB向图形化调试器反馈的调试命令对应的回复;
构建模块,用于在所述记录的调试命令中确定所有控制类命令,采用每一个控制类命令以及下一个相邻控制类命令之前的所有记录数据分别构建多个调试场景;
显示模块,用于在图形化调试器中,显示每个调试场景的信息以及调试场景在源代码中对应的位置;所述调试场景的信息包括:调用栈、寄存器、变量、表达式、内存和反汇编的数据;
所述构建模块具体用于:
采用MI接口通讯协议对所述记录的调试命令进行解析,得到解析结果;
对所述解析结果中的调试命令进行分类,确定所有控制类命令。
6.根据权利要求5所述的装置,其特征在于,所述调试命令包括控制类命令和查询类命令。
7.根据权利要求5所述的装置,其特征在于,所述GDB和所述图形化调试器采用MI接口通讯。
8.根据权利要求5所述的装置,其特征在于,所述调试命令和所述调试命令对应的回复记录在宿主机上。
CN202011376685.1A 2020-11-30 2020-11-30 一种嵌入式软件离线重放调试方法和装置 Active CN112416790B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011376685.1A CN112416790B (zh) 2020-11-30 2020-11-30 一种嵌入式软件离线重放调试方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011376685.1A CN112416790B (zh) 2020-11-30 2020-11-30 一种嵌入式软件离线重放调试方法和装置

Publications (2)

Publication Number Publication Date
CN112416790A CN112416790A (zh) 2021-02-26
CN112416790B true CN112416790B (zh) 2023-04-14

Family

ID=74829025

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011376685.1A Active CN112416790B (zh) 2020-11-30 2020-11-30 一种嵌入式软件离线重放调试方法和装置

Country Status (1)

Country Link
CN (1) CN112416790B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015184908A1 (zh) * 2014-11-06 2015-12-10 中兴通讯股份有限公司 一种反向调试方法、装置及调试器
CN107870855A (zh) * 2016-09-27 2018-04-03 北京计算机技术及应用研究所 基于天熠嵌入式操作系统的调试系统

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102129408B (zh) * 2011-04-14 2013-09-25 电子科技大学 一种基于记录回放技术的嵌入式软件调试装置和方法
KR20140056478A (ko) * 2012-10-26 2014-05-12 삼성전자주식회사 내장형 소프트웨어의 자동 테스트 장치 및 자동 테스트 방법
CN103218294B (zh) * 2013-04-16 2015-12-02 华为技术有限公司 一种嵌入式系统的调试方法、调试转换装置和系统
CN104461876B (zh) * 2014-11-26 2017-09-22 北京航空航天大学 一种基于运行快照序列的并行程序重现调试方法
CN108664380B (zh) * 2017-03-30 2021-08-03 中国航空工业集团公司西安航空计算技术研究所 一种带性能显示的执行后软件调试系统及调试方法
US10698792B2 (en) * 2018-05-02 2020-06-30 Microsoft Technology Licensing, Llc Execution control with cross-level trace mapping
US11080166B2 (en) * 2018-05-31 2021-08-03 Sap Se Database trace debugger
CN109710470A (zh) * 2018-12-03 2019-05-03 中科曙光信息产业成都有限公司 处理器重放调试方法及系统
CN109936479B (zh) * 2019-03-18 2020-09-01 浙江大学 基于差分检测的控制平面故障诊断系统及其实现方法
US10962594B2 (en) * 2019-05-23 2021-03-30 Bae Systems Information And Electronic Systems Integration Inc. Debug interface recorder and replay unit

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015184908A1 (zh) * 2014-11-06 2015-12-10 中兴通讯股份有限公司 一种反向调试方法、装置及调试器
CN107870855A (zh) * 2016-09-27 2018-04-03 北京计算机技术及应用研究所 基于天熠嵌入式操作系统的调试系统

Also Published As

Publication number Publication date
CN112416790A (zh) 2021-02-26

Similar Documents

Publication Publication Date Title
US5680542A (en) Method and apparatus for synchronizing data in a host memory with data in target MCU memory
KR100248376B1 (ko) 동적-비주얼 통합 병렬 디버깅 장치 및 디버깅 방법
US20050177775A1 (en) Data race detection using sequential program analysis
US10613964B2 (en) Conditional debugging of server-side production code
CA2904253C (en) Computer system using in-service software upgrade
CN111782513B (zh) 基于dll的卫星地面通用自动化测试方法
CN110704314B (zh) 一种嵌入式软件测试的故障注入方法
CN110688313B (zh) 一种VxWorks操作系统下软件测试的故障注入方法
CN109189663A (zh) 一种插件调试方法、测试方法及微内核架构系统
WO2017044291A1 (en) Method and apparatus for generating, capturing, storing, and loading debug information for failed tests scripts
CN110704315B (zh) 一种嵌入式软件测试的故障注入装置
US20040024924A1 (en) Real-time data exchange on demand
CN112416790B (zh) 一种嵌入式软件离线重放调试方法和装置
US20050229163A1 (en) Thread-scoped breakpoints
CN110289043B (zh) 存储设备测试方法、装置、电子设备
Kranzlmüller et al. NOPE: A nondeterministic program evaluator
CN111444109A (zh) 一种移动端ui自动化测试方法及系统
Lee et al. Replay debugging for multi-threaded embedded software
Beynon et al. Low-cost non-intrusive debugging strategies for distributed parallel programs
CN111858205B (zh) 一种芯片调试方法和系统
CN112306845A (zh) 一种并发测试方法、装置、设备及介质
Huselius et al. Starting conditions for post-mortem debugging using deterministic replay of real-time systems
CN111611161B (zh) 一种应用于航空电子软件的轻量级调试工具的实现方法
Lim et al. User-level Deterministic Replay via Accurate Non-deterministic Event Capture
Kacsuk et al. Systematic Debugging of Parallel Programs in DIWIDE Based on Collective Breakpoints and Macrosteps1

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant