一种程序调试方法与流程

阅读: 评论:0



1.本发明涉及一种程序调试方法,属于计算机技术领域。


背景技术:



2.当前国产化适配过程中,随着应用程序的规模和复杂度上升,其对调试器依赖度越来越高,这就要求开发与处理器相对应的配套高级调试工具来适应适配国产化进程,反向调试和架构紧密相关,工作量庞大且复杂,其包括反汇编、指令识别、状态记录、以及信息恢复等。
3.目前反向调试对于传统调试器极其重要,但是大部分传统调试器均没有支持该功能,反向调试技术不支持共享内存、多线程和子进程,同时反向调试状态记录方法需要大量的内存空间,在执行过程中需要大量的时间负载。
4.公开于该背景技术部分的信息仅仅旨在增加对本发明的总体背景的理解,而不应当被视为承认或以任何形式暗示该信息构成已为本领域普通技术人员所公知的现有技术。


技术实现要素:



5.本发明的目的在于克服现有技术中的不足,提供一种程序调试方法,解决了传统调试器信息记录不精准、架构支持不足的问题。
6.为达到上述目的/为解决上述技术问题,本发明是采用下述技术方案实现的:一种程序调试方法,包括:运行程序至第n条指令时,记录当前指令n的程序状态为pcr;根据当前进程的执行方向状态值判断调试方向为正向调试或反向调试;若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换;当前指令n的程序状态pcr指向所要跳转目标指令n-1的指令位置;若调试方向为正向调试,则将当前指令n的程序状态pcr指向指令n+1的指令位置,并在双向链表中查指令n+1的历史状态record(n+1)是否存在;若指令n+1的历史状态record(n+1)已被记录,则将当前指令n的程序状态pcr与指令n+1的历史状态record(n+1)进行交换,执行第n+1条指令;若指令n+1的历史状态record(n+1)未被记录,则解析指令n+1的程序状态并将其记录至历史状态record(n+1)中,执行第n+1条指令。
7.进一步地,所述程序状态包括程序计数器pc、状态控制寄存器、通用寄存器和内存中的数据。
8.进一步地,所述历史状态record(n+1)包括执行指令n+1的程序计数器pc和指令n+1所修改的寄存器或内存信息。
9.进一步地,所述将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换具体包括:
检查要跳转的目标指令n-1的历史状态record(n-1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n-1)的每一个节点,直至遇到结束标记结束。
10.进一步地,所述当前指令n的程序状态pcr与历史状态record(n+1)进行交换具体包括:检查指令n+1的历史状态record(n+1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n+1)的每一个节点,直至遇到结束标记结束。
11.进一步地,所述解析指令n+1的程序状态并将其记录至历史状态record(n+1)中具体包括:解析指令n+1所对应的程序计数器pc位置;得到指令类型和目的操作数;将目的操作数和程序计数器pc保存至双向链表对应的节点中。
12.本发明的目的之二在于提供一种程序调试装置,包括处理器及存储介质;所述存储介质用于存储指令;所述处理器用于根据所述指令进行操作以执行上述的方法的步骤。
13.本发明的目的之三在于提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述方法的步骤。
14.与现有技术相比,本发明所达到的有益效果:本发明调试过程开启record记录之后,将指令关键信息保存在一个双向链表结构中,利用结束标记区分每一条指令的历史执行状态,该链表始终维持着程序状态调试轨迹,通过把所要跳转的目标指令历史状态和程序当前状态下的寄存器和内存做内容交换,实现正向和反向调试,解决了传统调试器信息记录不精准、架构支持不足的问题。
附图说明
15.图1是本发明实施例提供的一种程序调试方法的流程图;图2是本发明实施例提供的一种程序调试方法的双向链表结构的示意图;图3是发明实施例提供的一种程序调试方法的双向链表的结构体示意图;图4是发明实施例提供的一种程序调试方法的record结构体示意图。
具体实施方式
16.下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
17.实施例一如图1所示,一种程序调试方法,包括:运行程序至第n条指令时,记录当前指令n的程序状态为pcr,程序状态包括程序计数器pc、状态控制寄存器、通用寄存器和内存中的数据;根据当前进程的执行方向状态值判断调试方向为正向调试(exec_forward)或反
向调试(exec_reverse);若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换;当前指令n的程序状态pcr指向所要跳转目标指令n-1的指令位置,具体的:检查要跳转的目标指令n-1的历史状态record(n-1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n-1)的每一个节点,直至遇到结束标记结束;若调试方向为正向调试,则将当前指令n的程序状态pcr指向指令n+1的指令位置,并在双向链表中查指令n+1的历史状态record(n+1)是否存在;历史状态record(n+1)包括执行指令n+1的程序计数器pc和被指令n+1所修改的寄存器或内存信息;如图4所示,record结构体记录每条指令的历史状态信息,每一个历史状态对应一条已执行的历史指令;程序每一个历史状态中的内容为寄存器、内存和结束标记等三类节点,由于程序计数器pc在动态变化,因此每个历史状态都包含程序计数器pc寄存器节点;结束标记表示一条指令记录内容的结束,实现对相邻的指令历史状态的区分;其中,record(n-1)为其前一条指令反向执行状态双向链表存储情况,即record(n-1)=record(n)-》prev;record(n+1)为其下一条待执行指令正向执行状态双向链表存储情况,即record(n+1) =record(n)
ꢀ‑
》next;若指令n+1的历史状态record(n+1)未被记录,则解析指令n+1的程序状态并将其记录至历史状态record(n+1)中,执行第n+1条指令;具体的:解析指令n+1所对应的程序计数器pc位置,得到指令类型和目的操作数;为了得到程序的历史调试状态,需基于国产平台反汇编其指令流得到汇编指令,根据指令操作码不同分类为五大类指令格式:系统调用类、转移控制类、访存类、简单运算类、复合运算类;针对指令译码后得到目的操作数以及类型,进而决定该指令目的操作数修改的是寄存器还是内存,例如:指令(ldl ra,disp(rb)),其指令格式为访存类,目的操作数是ra;打开记录record功能后,提取申威指令32位中的前6位得到操作码;根据操作码解析指令类型,判断目的操作数在指令中的偏移位置;将目的操作数和程序计数器pc保存至双向链表对应的节点中;根据申威处理器指令特点,对于涉及浮点运算的指令还需要维护程序状态寄存器fpcr,包含浮点异常的状态、浮点舍入模式、浮点异常自陷控制以及特殊数据的控制等从而支持浮点操作的正确调试;若指令n+1的历史状态record(n+1)已被记录,则将当前指令n的程序状态pcr与指令n+1的历史状态record(n+1)进行交换,执行第n+1条指令;具体的:检查指令n+1的历史状态record(n+1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n+1)的每一个节点,直至遇到结束标记结束;程序反向运行至第n条指令位置,反向调试支持单步反向、多步反向执行等;对于多步反向执行操作,支持指令计数和插入断点两种方法,在源码级别逆向调试时,首先得到源码行对应的指令总条数,在该总条数内循环回退每一条指令即可;在记录record功能下,可以在任何指令位置设置标签,回退时将会计算标签到程序当前状态的指令总条数,最后
回退所记录指令总条数即可到达标签位置;支持执行rc调试,可以插入断点实现逆向到达指定位置的目的;支持反向跳出函数体,通过在函数首条指令位置插入断点。
18.如图2所示,由于每条指令目的操作数可能会修改内存,也可能会修改寄存器,也有可能不需要对操作数做任何修改,因此使用固定数组来存储历史状态势必会造成内存浪费,循环分配双向链表节点,只对执行过程中被修改的寄存器和内存记录信息并分配双向节点,极大地节省了内存,也保证了反向调试的效率;如图3所示,定义双向链表节点结构体instruction_node,每个节点的记录内容可能是寄存器、内存和结束标记之一;其中,reg表示寄存器,内容为寄存器编号number和寄存器值reg_buffer;mem为内存,内容为地址addr和对应值mem_buffer;end是链表结束标记,内容为信号signal和已记录指令的数量insn_num;prev和next是链表节点的前驱和后继指针。
19.实施例二一种程序调试装置,包括处理器及存储介质;存储介质用于存储指令;处理器用于根据指令进行操作以执行以下的方法的步骤:运行程序至第n条指令时,记录当前指令n的程序状态为pcr;根据当前进程的执行方向状态值判断调试方向为正向调试(exec_forward)或反向调试(exec_reverse);若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换;当前指令n的程序状态pcr指向所要跳转目标指令n-1的指令位置;若调试方向为正向调试,则将当前指令n的程序状态pcr指向指令n+1的指令位置,并在双向链表中查指令n+1的历史状态record(n+1)是否存在;若指令n+1的历史状态record(n+1)已被记录,则将当前指令n的程序状态pcr与指令n+1的历史状态record(n+1)进行交换,执行第n+1条指令;若指令n+1的历史状态record(n+1)未被记录,则解析指令n+1的程序状态并将其记录至历史状态record(n+1)中,执行第n+1条指令。
20.实施例三一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下方法的步骤:运行程序至第n条指令时,记录当前指令n的程序状态为pcr;根据当前进程的执行方向状态值判断调试方向为正向调试(exec_forward)或反向调试(exec_reverse);若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换;当前指令n的程序状态pcr指向所要跳转目标指令n-1的指令位置;若调试方向为正向调试,则将当前指令n的程序状态pcr指向指令n+1的指令位置,并在双向链表中查指令n+1的历史状态record(n+1)是否存在;
若指令n+1的历史状态record(n+1)已被记录,则将当前指令n的程序状态pcr与指令n+1的历史状态record(n+1)进行交换,执行第n+1条指令;若指令n+1的历史状态record(n+1)未被记录,则解析指令n+1的程序状态并将其记录至历史状态record(n+1)中,执行第n+1条指令。
21.以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

技术特征:


1.一种程序调试方法,其特征在于,包括:运行程序至第n条指令时,记录当前指令n的程序状态为pcr;根据当前进程的执行方向状态值判断调试方向为正向调试或反向调试;若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换;当前指令n的程序状态pcr指向所要跳转目标指令n-1的指令位置;若调试方向为正向调试,则将当前指令n的程序状态pcr指向指令n+1的指令位置,并在双向链表中查指令n+1的历史状态record(n+1)是否存在;若指令n+1的历史状态record(n+1)已被记录,则将当前指令n的程序状态pcr与指令n+1的历史状态record(n+1)进行交换,执行第n+1条指令;若指令n+1的历史状态record(n+1)未被记录,则解析指令n+1的程序状态并将其记录至历史状态record(n+1)中,执行第n+1条指令。2.根据权利要求1所述的一种程序调试方法,其特征在于,所述程序状态包括程序计数器pc、状态控制寄存器、通用寄存器和内存中的数据。3.根据权利要求1所述的一种程序调试方法,其特征在于,所述历史状态record(n+1)包括执行指令n+1的程序计数器pc和指令n+1所修改的寄存器或内存信息。4.根据权利要求1所述的一种程序调试方法,其特征在于,所述将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态pcr进行交换具体包括:检查要跳转的目标指令n-1的历史状态record(n-1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n-1)的每一个节点,直至遇到结束标记结束。5.根据权利要求1所述的一种程序调试方法,其特征在于,所述当前指令n的程序状态pcr与历史状态record(n+1)进行交换具体包括:检查指令n+1的历史状态record(n+1)结束标记的前驱节点;如果该节点类型是寄存器,则和当前指令n的程序状态pcr交换寄存器的值,否则交换内存中的值;循环遍历历史状态record(n+1)的每一个节点,直至遇到结束标记结束。6.根据权利要求1所述的一种程序调试方法,其特征在于,所述解析指令n+1的程序状态并将其记录至历史状态record(n+1)中具体包括:解析指令n+1所对应的程序计数器pc位置;得到指令类型和目的操作数;将目的操作数和程序计数器pc保存至双向链表对应的节点中。7.一种程序调试装置,其特征在于,包括处理器及存储介质;所述存储介质用于存储指令;所述处理器用于根据所述指令进行操作以执行根据权利要求1~6任一项所述方法的步骤。8.计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1~6任一项所述方法的步骤。

技术总结


本发明公开了一种程序调试方法,属于计算机技术领域,包括:运行程序至第n条指令时,记录当前指令n的程序状态为PCr;根据当前进程的执行方向状态值判断调试方向为正向调试或反向调试;若调试方向为反向调试,则将所要跳转目标指令n-1的历史状态record(n-1)与当前指令n的程序状态PCr进行交换;当前指令n的程序状态PCr指向所要跳转目标指令n-1的指令位置;本发明调试过程开启record记录之后,将指令关键信息保存在一个双向链表结构中,该链表始终维持着程序状态调试轨迹,把所要跳转的目标指令历史状态和程序当前状态下的寄存器和内存做内容交换,解决了传统调试器信息记录不精准、架构支持不足的问题。架构支持不足的问题。架构支持不足的问题。


技术研发人员:

谢汶兵 王俊 仲海梅 刘汉旭 尚博文 李佳梅

受保护的技术使用者:

无锡先进技术研究院

技术研发日:

2022.11.04

技术公布日:

2023/2/3

本文发布于:2023-02-27 05:27:26,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/57789.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   状态   程序   寄存器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图