调试方法和相关产品与流程

文档序号:29935470发布日期:2022-05-07 13:31阅读:50来源:国知局
调试方法和相关产品与流程

1.本技术涉及计算机技术领域,尤其涉及一种调试方法和相关产品。


背景技术:

2.程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程,这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试,根据测试时所发现的错误,进一步诊断,找出原因和具体的位置进行修正。
3.在现有的调试方法中,通过添加打印代码进行调试的调试方法在添加、移除打印代码时比较麻烦,并且在打印代码的添加位置选取不当时,容易出现频繁打印的问题;而基于linux下的集成开发环境(integrated development environment,ide)和gnu项目调试器(the gnu project debugger,gdb)所涉及的调试方法对新手而言不易于操作,且在对大型软件进行调试时,调试效率较低。因此,需要研究操作更为简便,调试效率更高的调试方法。


技术实现要素:

4.本技术实施例公开了一种调试方法和相关产品,通过自定义的关键字快速指定待调试的代码数据,并采用调试寄存器和调试缓存器等硬件辅助调试,使调试的操作更为简便,且调试效率高。
5.第一方面,本技术实施例提供了一种调试方法,该方法包括:将源码中的关键字指示的变量存于调试寄存器中;将表征该变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中;该机器码通过编译上述源码得到;输出监测数据;该监测数据为包括上述调试寄存器中存储的数据和上述调试缓存器中存储的表征该变量变化过程的上述历史值的第一集合。
6.上述关键字为自定义的特殊字符,例如#dbg_start、#dbg_end。应理解,#dbg_start、#dbg_end只是上述关键字的一种表现形式,上述关键字还可以有其它的表现形式。以#dbg_start、#dbg_end为例进行说明,其中,#称为预处理前导符号。开始调试时,将#dbg_start插入至待调试变量的首端,将#dbg_end插入至待调试变量的尾端,编译器对这些特殊的符号进行识别后,对这些变量特殊处理,将其放入调试寄存器中保存。在上述机器码运行的过程中,由于代码程序的控制,上述调试寄存器中存储的该变量的值发生改变,为方便理解,将该变量变化前的值称为历史值,变化后的值称为当前值,则该历史值将由上述调试寄存器中溢出而转存到上述调试缓存器中,该变量的当前值保存在上述调试寄存器中;当该变量的值继续发生变化时,继续将该变量发生变化前的历史值转存于上述调试缓存器中,将变化后的当前值保存于上述调试寄存器中。换言之,在调试过程中所产生的调试数据将保存于上述调试缓存器和调试寄存器中,而非保存在原始内存中;当监测应用接收到软件发出的打印该变量变化列表的命令,将读取上述调试寄存器和上述调试缓存器中的数据,
然后返回该变量的变化的值(历史值和当前值)的列表,即上述监测数据,并输出该监测数据。
7.本技术实施例通过添加自定义的编译指令即可快速指定欲调试的变量,并且利用如调试寄存器和调试缓存器等硬件装置辅助调试,无需通过添加打印和单步跟踪的方式调试代码,操作简便,数据读取迅速,且内核态和用户态通用,调试效率得到了极大地提高。
8.在一个可选的实现方式中,所述输出监测数据之前,上述方法还包括:获取原始数据;所述原始数据为包括上述调试寄存器中存储的数据和上述调试缓存器中存储的表征该变量变化过程的上述历史值的第二集合;对该原始数据进行分析处理,得到上述监测数据;上述分析处理包括:对上述历史值按其值或存储于上述调试寄存器中的时长由大到小或由小到大进行排序,和/或对该原始数据中大于第一阈值的数据进行标注;和/或对该原始数据中小于第二阈值的数据进行标注。
9.在该实现方式中,对从上述调试寄存器和上述调试缓存器中采集到的调试数据进行了分析处理,对重要的调试数据进行了顺序和格式上的调整,除此方式外还可以设计更为复杂的分析处理方式,使调试人员更为快速的获取关键的调试数据,进一步提高了调试的效率。
10.在一个可选的实现方式中,上述方法还包括:在运行所述机器码的过程中,调整存储于调试寄存器中的所述变量的值,并输出打印日志和系统状态。
11.在该实现方式中,所述调整并非通源程序的代码控制的,而是在后续流程中配置错误值序列,再将该错误值序列注入上述调试寄存器存储的变量中,完成对上述变量值的改变,即程序测试阶段常用的错误注入的方法。在本实施方式中,无需调试人员撰写测试用例,通过简单的配置即可完成所有的测试流程,调试人员只需观察错误注入过程中系统的变化状态即可,操作简单;并且通过自动化测试,可以覆盖大部分的关键分支以及数据异常场景,有效提供了系统的健壮性和可用性。
12.在一个可选的实现方式中,所述调整存储于调试寄存器中的所述变量的值包括:将错误值序列中的元素的值赋值于上述调试寄存器中存储的上述变量,上述赋值按照所述错误值序列中元素的顺序以固定的频率进行,所述变量的值在该赋值的过程中根据该错误值序列中元素的数据类型发生变化,所述错误值序列为包括至少一个元素的数组。
13.在该实现方式中,可循环使用该错误序列,错误注入的数据的类型和频率可控,确保了注入过程的稳定性和系统变化的可监测性。
14.在一个可选的实现方式中,所述将表征上述变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中包括:当上述调试缓存器的内存空间不足时,将上述变量变化后的值存于上述调试寄存器中,将上述变量变化前的所述历史值覆盖所述调试缓存器中存储时间最长的值。
15.应理解,上述调试缓存器的存储空间是有限的,当存储空间不足时,将无法存储该变量变化过程所产生的最新的历史值。若上述变量的变化过程还在进行,监测应用还未接收到打印上述监测数据的指令,而此时,上述调试寄存器已无剩余存储空间用于存储所述变量变化产生的新的历史值,而调试缓存器中的存储的历史值较新产生的历史值而言,对整个调试过程来说意义较小。因此,在该实现方式中,调试缓存器的存储过程利用数据结构中队列的性质,因此对上述调试寄存器中存储的上述变量过程的产生的历史值采用“循环
覆盖”规则,即用新产生的历史值覆盖上述调试缓存器中存储时长最久的历史值,完成数据更新,确保后续达到触发条件时,调试缓存器中能存储更为近期的调试数据。
16.在一个可选的实现方式中,所述输出监测数据之前,上述方法还包括:在所述变量的值满足触发条件时,触发控制逻辑,中断处理器之后,获取系统逻辑数据,所述系统逻辑数据包括系统上下文和系统调用关系;所述输出监测数据包括:输出所述监测数据及所述系统逻辑数据。
17.该实现方式涉及程序调试中的高级调试过程。上述触发条件可以设置为该变量的值变化为某个定值。在上述调试寄存器中存储的该变量的值满足上述触发条件后,触发逻辑将触发控制逻辑,中断中央处理器(central processing unit,cpu)后,系统打印系统上下文以及函数调用栈等系统逻辑数据,简洁明了地呈现给调试人员。
18.在一个可选的实现方式中,所述将该变量存于调试寄存器中之前,上述方法还包括:将上述变量与上述调试寄存器做映射,生成映射表;该映射表为表征上述变量上述调试寄存器之间对应存储关系的映射表;读取该映射表,获取上述变量与上述调试寄存器之间对应的存储关系;所述将该变量存于调试寄存器中包括:利用该存储关系将该变量存于上述调试寄存器中。
19.在调试过程中,可能需要同时对多个变量进行调试,为了后续操作中读取分析操作的方便性和准确性,需要事先配置上述调试缓存器和上述变量之间的对应的存储关系。在该实现方式中,通过配置表征上述变量上述调试寄存器之间对应存储关系的映射表,来获取上述调试寄存器与上述变量之间的映射关系,在后续输出监测数据的过程中,在监测应用接收到打印某变量的变化列表的命令后,首先读取上述映射表,获取上述变量所映射的上述调试缓存器中的数据。
20.在一个可选的实现方式中,所述将源码中的关键字指示的变量存于调试寄存器中之前,上述方法还包括:
21.配置上述调试寄存器与上述调试缓存器之间对应的数据转存映射,该数据转存映射为表征上述调试寄存器中所述变量的变化过程的历史值与上述调试缓存器之间对应存储关系的映射;所述将表征上述变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中包括:利用该数据转存映射,将表征上述调试缓存器中的该变量变化过程的历史值存于上述调试缓存器中。
22.在该实现方式中,通过配置上述调试寄存器与上述调试缓存器之间对应的数据转存映射,明确了调试寄存器和调试缓存器之间的转存关系。在调试过程中,将依据该数据转存映射将调试寄存器中的变量的历史值准确地转存于其对应的调试缓存器中,在后续软件收到命令要求打印某变量变化列表时,需要先通过上述映射表以及该数据转存映射查看映射关系,再去读取相应的调试寄存器和调试缓存器,然后返回该变量的变化的值的列表,以确保监测数据的准确性。
23.第二方面,本技术实施例提供了一种调试装置,所述调试装置包括:存储单元,用于将源码中的关键字指示的变量存于调试寄存器中;转存单元,用于将表征所述变量在运行机器码的过程中的变化过程的历史值存于所述调试缓存器中;所述机器码通过编译所述源码得到;输出单元,用于输出监测数据;所述监测数据为包括所述调试寄存器中存储的数据和所述调试缓存器中存储的表征所述变量变化过程的所述历史值的第一集合。
24.在一个可选的实现方式中,所述装置还包括:整理单元,用于获取原始数据;所述原始数据为包括所述调试寄存器中存储的数据和所述调试缓存器中存储的表征所述变量变化过程的所述历史值的第二集合;并对所述原始数据进行分析处理,得到所述监测数据;所述分析处理包括:对所述历史值按其值或存储于所述调试寄存器中的时长由大到小或由小到大进行排序,和/或对所述原始数据中大于第一阈值的数据进行标注;和/或对所述原始数据中小于第二阈值的数据进行标注。
25.在一个可选的实现方式中,所述装置还包括:测试单元,用于在运行所述机器码的过程中,调整存储于调试寄存器中的所述变量的值,并输出打印日志和系统状态。
26.在一个可选的实现方式中,所述测试单元,具体用于将错误值序列中的元素的值赋值于所述调试寄存器中存储的所述变量,所述赋值按照所述错误值序列中元素的顺序以固定的频率进行,所述变量的值在所述赋值的过程中根据所述错误值序列中元素的数据类型发生变化,所述错误值序列为包括至少一个元素的数组。
27.在一个可选的实现方式中,所述转存单元,还用于当所述调试缓存器的内存空间不足时,将所述变量变化后的值存于所述调试寄存器中,将所述变量变化前的所述历史值覆盖所述调试缓存器中存储时间最长的值。
28.在一个可选的实现方式中,所述装置还包括:高级单元,用于在所述变量的值满足触发条件时,触发控制逻辑,中断处理器之后,获取系统逻辑数据,所述系统逻辑数据包括系统上下文和系统调用关系;所述输出监测数据包括:输出所述监测数据及所述系统逻辑数据。
29.在一个可选的实现方式中,所述装置还包括:映射单元,用于将所述变量与所述调试寄存器做映射,生成映射表;所述映射表为表征所述变量与所述寄存器之间对应存储关系的映射表;所述输出监测数据包括:读取所述映射表,获取所述变量与所述调试寄存器之间对应的存储关系;利用所述存储关系获取所述监测数据;输出所述监测数据。
30.在一个可选的实现方式中,所述映射单元,还用于配置所述调试寄存器与所述调试缓存器之间对应的数据转存映射,所述数据转存映射为表征所述调试寄存器中所述变量的变化过程的历史值与所述调试缓存器之间对应存储关系的映射;所述将表征所述变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中包括:所述转存单元利用所述数据转存映射,将表征所述调试寄存器中的所述变量变化过程的历史值存于所述调试缓存器中。
31.第三方面,本技术实施例提供了一种计算机可读存储介质,该计算机存储介质中存储有计算机程序,该计算机程序包括程序指令,该程序指令当被处理器执行时使该处理器执行上述第一方面及任一种可选的实现方式的方法。
32.第四方面,本技术实施例提供了一种电子设备,该电子设备包括:存储器,用于存储程序;处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如上述第一方面以及任一种可选的实现方式的方法。
附图说明
33.为了更清楚地说明本技术实施例或背景技术中的技术方案,下面将对本技术实施例或背景技术中所需要使用的附图作简单的介绍。
34.图1为本技术实施例提供的一种调试方法的流程图;
35.图2为本技术实施例提供的一种调试系统的架构图;
36.图3为本技术实施例提供的一种调试系统的工作流程图;
37.图4为本技术实施例提供的另一种调试方法的流程图;
38.图5为本技术实施例提供的一种调试过程的示意图;
39.图6为本技术实施例提供的一种测试方法的流程图;
40.图7为本技术实施例提供的一种测试过程的示意图;
41.图8为本技术实施例提供的一种调试装置的结构示意图;
42.图9为本技术实施例提供的一种终端设备的结构示意图。
具体实施方式
43.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地描述。
44.本技术的说明书、权利要求书及附图中的术语“第一”和“第二”等仅用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备等,没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元等,或可选地还包括对于这些过程、方法、产品或设备等固有的其它步骤或单元。
45.在本文中提及的“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本技术的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员可以显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
46.在本技术中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上,“至少两个(项)”是指两个或三个及三个以上,“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:只存在a,只存在b以及同时存在a和b三种情况,其中a,b可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”。
47.本发明实施例提供了调试方法,为更清楚的描述本发明的方案。下面先介绍一些本技术实施例提供的调试方法所涉及的知识。
48.调试和测试:调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。测试是程序运行错误时,根据测试时所发现的错误信息和利用调试工具追踪的提示信息,两者相互结合综合判断错误发生原因和位置。找出错误原因和具体的错误位置,最终方便进行修正。测试是检验程序是否有错误,本身也属于程序调试的过程中的一部分。
49.在代码中添加打印代码是较为常见的调试方法,以此追踪程序的运行踪迹,从而确定程序运行中发生错误的原因和位置。以如下代码为例:
[0050][0051]
该代码旨在计算出25的值。为了追踪程序在计算25的值的过程中所得到的中间结果,可以在代码负责完成该计算过程的循环体中添加打印代码“printf(“%d\n",result);”,则代码在运行时将依次打印出单次循环得到的计算结果。若代码的整个运行过程没有出现错误,则打印得到的上述result的值依次为2、4、8、16、32;若代码运行过程中出现了非预期的值,例如打印得到的上述result的值依次为2、4、8、10、20,则可以推知在在代码的运行过程中,上述循环体代码的运行出现了错误,且该错误极可能发生在上述循环体中的第四次循环。
[0052]
添加打印代码的调试方法存在向源代码中添加、移除打印代码时较为麻烦的缺点,其次,如果选择的打印位置不好,很容易出现频繁打印的现象;以上述代码为例,假设其欲计算的不是25的数值,而是2
100
的值,则循环体将进行100次循环,上述打印代码也将执行100次,共打印出100个运算结果,浪费系统资源的同时也降低了调试效率。
[0053]
另一种常见的调试方法为基于linux环境下的ide或gdb调试,这种调试方法虽然功能较为丰富,但也因此包含了多个特定的编译指令,而且其调试界面庞杂,所以要求调试人员有对该调试方法有一定的学习基础,并不适合初学者使用。此外,该调试方法在对大型软件进行调试时,调试效率并不高,且只能支持用户态使用。
[0054]
针对上述调试方法的不足,本技术实施例提供了一种硬件辅助的调试方法,通过自定义的关键字快速指定待调试的变量,并利用调试寄存器和调试缓存器保存调试过程中产生的调试数据,不需要花费大量的时间进行单步跟踪,并且只需要通过简单的配置即可完成整个调试过程;此外,该方法还同时支持用户态和内核态使用,且支持错误注入功能,且无需开发人员撰写测试用例,极大地节约了调试成本,并提高了调试的效率。
[0055]
下面先介绍一种本技术实施例提供的一种调试方法的流程图,计算机程序和软件的调试可采用该调试方法进行调试,操作简便且调试效率高。
[0056]
请参阅图1,图1为本技术实施例提供的一种调试方法的流程图。该方法可包括:
[0057]
101、调试装置将源码中的关键字指示的变量存于调试寄存器中。
[0058]
上述源码可以是c、c++、python、java或者任一种其他汇编语言种类的代码,该变量可以是数据结构中的变量、数组或结构体。该关键字为自定义的关键字,分别添加在该变量的首端和末尾,在程序进行编译时,编译器将识别用该关键字指示出的变量,并将其存于上述调试寄存器中,而不再和其他未用该关键字指示的变量存入堆栈内存资源中。在一些实施例中,调试寄存器中的变量的值被读写的速度高于堆栈内存资源中的变量的值被读写的速度。在这些实施例中,通过将源码中的关键字指示的变量存于调试寄存器中,可以提高读写待调试的变量的效率。
[0059]
102、上述调试装置将表征该变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中。
[0060]
在上述机器码运行的过程中,由程序代码控制(例如通过循环结构循环地向某个变量赋值)的变量将会发生变化,而在该变量变化的过程中,上述调试寄存器中所存储的该变量的值将发生改变。以单次变化为例,假设其变化前的值称为上述历史值,变化后的值称为当前值,则在该次变化之后,上述调试寄存器将保存上述当前值,而将上述历史值转存于上述调试缓存器中。调式寄存器中的变量的值可读可写,并且可以通过触发逻辑将变化的历史值溢出到调试缓存器中。在一些实施例中,调试装置包括一个或多个调试寄存器,每个调试寄存器存储至少一个变量的值,每个调试寄存器对应一个或多个调试缓存器,每个调试寄存器对应的调试缓存器存储该至少一个变量的多个历史值。举例来说,调试装置包括16个调试寄存器和16个调试缓存器,每个调试缓存器的深度为32,该16个调试寄存器和该16个调试缓存器一一对应,每个调试寄存器存储一个变量的值,每个调试缓存器可最多存储一个变量的32个历史值。又举例来说,调试装置包括16个调试寄存器和16个调试缓存器,其中8个调试寄存器要求48深度的调试缓存器,该8个调试寄存器中每个调试寄存器对应一个深度为48的调试缓存器,另8个调试寄存器中每个调试寄存器对应一个深度为16的调试缓存器。也就是说,调试缓存器的总深度是一定的,由硬件资源决定,可以自由分配给调试寄存器。
[0061]
103、上述调试装置输出监测数据。
[0062]
上述监测数据为包括上述调试寄存器中存储的数据和上述调试缓存器中存储的表征该变量变化过程的上述历史值的第一集合。监测应用接受程序或软件发出的打印该变量的变化列表后,采集上述调试寄存器与上述调试缓存中的数据(即上述监测数据)后,输出该监测数据。
[0063]
在一些实施例中,当上述关键字指示的待调试的变量的个数不止一个时,需要使用多个调试寄存器和多个调试缓存器辅助整个调试过程。为确保调试数据的准确性和条理性,需要确定多个变量、多个调试寄存器以及多个调试缓存器之间的对应关系。因此,在步骤101之前,监测应用将配置上述调试寄存器与上述调试缓存器之间的转存映射关系;同理,调试人员用上述关键字指示出待调试的上述变量之后,监测应用还将根据编译指令对上述变量和上述调试寄存器之间做映射,生成映射表。也就是说,在步骤101中,所述将源码中的关键字指示的变量存于调试寄存器中之后,监测应用将根据每个调试寄存器中存储的变量生成上述映射表;应理解,上述转存映射中调试寄存器与调试缓存器的映射,以及上述映射表中调试寄存器与变量的映射,均为一一映射。举例说明,假设上述源码中用关键字指示出的待调试的变量为a和b,经编译之后,变量a存储于调试寄存器db0中,变量b存储于调试寄存器db1中,则生成的映射表即为a《
--
》db0,b《
--
》db1;而在步骤101之前的初始化阶段配置调试寄存器与调试缓存器的转存映射关系时,调试寄存器db0对应的调试缓存器为buf0(db0《
--
》buf0),调试寄存器db1对应的调试缓存器为buf1(db1《
--
》buf1);因此,在步骤102中,调试寄存器db0中存储的变量a的历史值将保存在调试缓存器buf0中,同理,调试寄存器db1中存储的变量b的历史值将保存在调试缓存器buf1中;在后续的调试过程中,当接收到打印变量a的变化列表的命令而执行步骤103时,监测应用先读取上述映射表,由a《
--
》db0得变量a存储于调试寄存器db0中,再根据上述转存映射关系db0《
--
》buf0,得知调试db0中存储的变量a在变化过程中产生的历史值存储于调试缓存器buf0中;因此,监测应用采集调试寄存器db0以及调试缓存器buf0中的数据;将所得数据(即上述监测数据)呈现
给调试人员。
[0064]
本技术实施例提供的调试方法通过添加关键字的方式快速指定了待调试的变量,并利用调试寄存器以及调试缓存器等硬件设施保存调试过程中的数据,内核态和用户态通用,相比现有的调试方法而言操作更为简便,调试效率更高。
[0065]
下面介绍本技术实施例提供的一种调试系统的架构图,请参阅图2。
[0066]
图2为本技术实施例提供的一种调试系统的架构图。如图2所示,该调试系统包括:硬件逻辑层201、编译层202以及软件层203。
[0067]
硬件逻辑层201:
[0068]
该硬件逻辑层由调试寄存器2011、调试缓存器2012、触发逻辑2013以及控制逻辑2014组成。
[0069]
其中调试寄存器2011用于保存代码中要进行调试的变量(可参考图1中的用关键字指示的变量),可读可写,在调试过程中可将其存储的上述变量的变化过程中产生的历史值溢出到调试缓存器2012中。调试缓存器2012用于保存调试寄存器2011中变化的历史数据,便于调试,深度可以调节。当该调试缓存器的内存被占满后,调试寄存器2011中的变量发生变化产生的新的历史值将覆盖该调试缓存器2012中存储时间最长的历史值。当上述调试寄存器中的值发生变化时,触发逻辑负责将变化前的值保存到调试缓存器中。在一些实施例中,该触发逻辑还可进一步设定触发条件为在上述变量的值变化为某个特定值时,触发控制逻辑2014,控制逻辑2014在收到触发逻辑的消息后,控制halt cpu,并且发出中断或者系统消息,软件层203可以做出相应处理,例如进行启动高级调试2033,打印出系统的上下文和系统调用关系等一系列的操作。
[0070]
编译层202:
[0071]
上述编译层由指令编译2021及映射方法2022两个模块组成。
[0072]
其中,指令编译2021负责识别自定义的关键字(可参考图1中的关键字),并对其指示的变量进行编译得到机器码的逻辑部分。映射方法2022负责保存和维护软件数据以及调试寄存器与上述变量之间的存储关系的映射表,便于软件实现调试和测试功能。
[0073]
软件层203:
[0074]
上述软件层由初始化2031、数据操作2032、高级调试2033以及错误注入2034四个模块组成。
[0075]
其中,初始化2031负责初始化硬件逻辑,配置调试寄存器和调试缓存器的转存映射关系(具体可参考上述对图1的说明中的转存映射关系),并配置上述调试缓存器的深度。举例来说,假定系统包括16个调试寄存器,16个调试缓存器,且每个调试缓存器的深度为32。最基础的对应方式为一一对应,即每个调试寄存器对应一个缓存深度为32的调试缓存。而在某些特定的应用场景下,所调试的变量对上述调试缓存器的深度有特定的要求,例如其中有8个调试寄存器要求其对应的调试缓存器的深度为48时,则可以将前8个调试寄存器对应前8个调试缓存器,每个调试缓存器的深度为48;后8个调试寄存器对应后8个调试缓存器,每个调试缓存器的深度为16。应理解,调试缓存器的总深度是一定的,由硬件资源决定,但其深度可以自由分配给上述调试寄存器,每个调试缓存器的缓存深度可以相同,也可以不同。在一些实施例中,上述调试寄存器中存储的上述变量在变化过程中所产生的历史值不需要存储于上述调试缓存器中,则可以省略该步骤。此外,上述初始化模块还负责配置触
发逻辑2013的触发条件,以及控制逻辑2014被触发后具体执行的系统行为,例如halt cpu。数据操作2032负责读取上述表征调试寄存器与上述变量之间存储关系的映射表,并根据映射表表征的存储关系,实现调试数据的读写操作,以及调试数据缓存的读写操作,以此实现调试过程中的调试寄存器中所存储的变量的值的更新以及调试缓存器中数据的存入和数据覆盖,并采集上述调试寄存器和上述调试缓存器中的数据后输出。高级调试2033负责程序的高级调试过程,并负责高级调试选项的配置,其由硬件逻辑层201中的触发逻辑2013和控制逻辑2014共同控制。例如在调试寄存器中数据变化为一定值(即满足触发条件时),触发逻辑发送指令至控制逻辑,控制逻辑被触发,根据所述高级调试选项的配置所配置的系统行为控制系统工作,完成相应的系统行为,例如halt cpu或者halt所有的cpu,cpu被中断后,控制逻辑发送指令至监测应用,监测应用接受该指令后将保存系统的上下文以及系统的调用关系。错误注入2034负责在特定的注入时间以一定的频率对存于上述调试寄存器中的上述变量进行错误值的注入,该变量将按照该错误值发生变化,系统也会随之发生相应的改变,调试人员只需观测记录数据即可。
[0076]
为了对图2中各层、各模块之间的联系以及具体工作流程做进一步的说明,下面介绍本技术实施例提供的一种调试系统的工作的流程图,请参阅图3。
[0077]
图3为本技术实施例提供的一种调试系统的工作的流程图。如图3所示,图中所示的编译器类似于图2中的编译层,硬件类似于图2中的硬件逻辑层,监测应用类似于图2中的软件层,待调测应用可以是一段代码、一个使用汇编语言撰写的程序或一个应用软件。图中的箭头表示操作的方向,并利用序号

至对操作进行了编号。整个流程分为四个阶段,分别为准备阶段、调试阶段、高级调试阶段以及测试阶段。
[0078]
其中,准备阶段包括:
[0079]
操作

:监测应用初始化模块配置硬件逻辑,包括配置调试寄存器与调试缓存器的对应关系,该对应关系为表征后续测试过程中,该调试寄存器中存储变量变化过程所产生的历史值转存目标的映射关系;配置触发逻辑的触发条件;配置控制逻辑被触发后系统应做出的相应操作,例如halt cpu或者halt所有的cpu;配置错误注入的注入形式等。部分配置可以后续由高级调试阶段和错误注入阶段进行补充或者修改。应理解,在调试阶段上述触发条件可配置为只要上述调试寄存器中的变量值发生改变,即触发将调试寄存器中存储变量的历史值转存于调试缓存器中;若要使用高级调试功能,则该触发条件可在基础上设置为上述调试存储器中存储变量的值变化为某定值或者上述调试寄存器中的数据发生bit翻转等,在满足该触发条件(上述调试存储器中存储变量的值变化为某定值或者上述调试寄存器中的数据发生bit翻转)时,触发上述控制逻辑,该控制逻辑控制系统完成上述应做出的相应操作。
[0080]
操作

:在待调测的代码数据处加入特定的关键字。示例性的,假设a和b为源码中待调试的变量,且在源码中变量a在变量b之前,#dbg_start、#dbg_end为所述关键字,则在源码中变量a的前端加入关键字#dbg_start,在源码中b的尾端加入关键字#dbg_end。
[0081]
操作

:编译器解析代码中的关键字,生成机器码,指明由关键字指示出的变量在调试的过程中存储于调试寄存器中,而非堆栈内存资源。
[0082]
操作

:根据编译指令将代码变量数据与调试寄存器做映射。映射方法为根据调试寄存器中存储的变量与该调试寄存器一一映射(可参考对图1说明中的映射表的映射方
法)。也就是说,每个调试寄存器中只存储一个待调试的变量,假设存在两个待调试变量a、b,变量a和b在图3中所示的映射表中表示为a《
--
》db0,b《
--
》db1,则表示变量a存储于调试寄存器db0中,变量b存储于调试寄存器db1中。
[0083]
操作

:生成映射表并保存,后续监测应用将根据该映射表中的映射关系采集某个调试变量相应的调试寄存器中的调试数据,并通过该映射表中的映射关系查找操作

中配置的该调试寄存器与调试缓存器的对应关系,而后根据该对应关系采集该调试寄存器对应的调试缓存器中的调试数据。
[0084]
调试阶段包括:
[0085]
操作

:运行上述机器码,上述调试寄存器中保存的变量的值发生变化,触发逻辑被触发,该调试寄存器中保存变量变化前的历史值,将该变量变化后的值溢出并转存于与该调试寄存器对应的调试缓存器中。应理解,随着该变量变化过程的进行,所产生的历史值将不断转存于该调试缓存器中;当该调试缓存器的内存不足时,该变量变化产生的最新的历史值在转存过程中将覆盖该调试缓存器中存储时间最久的历史值。
[0086]
操作

:监测应用将根据需求,读取上述映射表,采集上述调试寄存器和上述调试缓存器中的监测数据,分析整理后再输出。示例性的,当软件收到打印某调试变量变化列表的命令时,监测应用需先通过上述映射表获取该变量与调试寄存器的映射关系以及上述调试寄存器与调试缓存器的对应关系,再读取相应的调试寄存器和调试缓存器中的数据形成列表,对该列表中的数据按照其值的大小或其存储与值变化的时间进行排序,或者对大于某个值的数据进行标注,然后返回该变量的变化的值的列表。
[0087]
高级调试阶段包括:
[0088]
操作

:监测应用的高级调试模块配置触发逻辑和控制逻辑,指明触发逻辑的触发条件,以及触发后控制逻辑的行为,如果此步骤省略,则使用初始化时的默认配置。
[0089]
操作

:当调试寄存器中的数据达到触发条件,例如该调试寄存器中的存储的变量的值变化为某个特定值时,触发逻辑通知控制逻辑开始工作。例如halt某个cpu或者halt所有cpu。
[0090]
操作

:控制逻辑发出中断,通知监测应用保存上下文,打印调用栈。
[0091]
应理解,上述触发逻辑的触发条件可在操作

中配置为调试寄存器中的数值发生变化,触发逻辑仅触发将调试寄存器中变量在变化过程中的历史值转存于调试缓存器中;当在此基础上对触发条件进一步设置为当该调试寄存器中的变量的值变化至为某个定值时,触发上述控制逻辑,即进入高级调试阶段,在该变量的值满足该触发条件时,触发逻辑被触发,系统将进行操作

中配置的上述控制逻辑相应的系统操作,例如上述halt cpu。
[0092]
在一个可选的实现方式中,在触发上述触发条件(该调试寄存器中的变量的值变化至为某个定值)后,是否触发后续控制逻辑等一系列行为是可选择的。也就是说,当调试寄存器中变量的值变化为一定值(例如-1)时,可以选择是否halt cpu,如果开启halt cpu,则负责控制调试寄存器变化为-1的cpu就会被中止运行;如果关闭,则不会进行该操作。
[0093]
测试阶段包括:
[0094]
操作监测应用中的错误注入模块根据操作

中配置的注入形式,以一定的频率将错误值序列中的错误值依次赋值于上述调试寄存器中的变量。随着变量的值的变化,系统状态也会发生改变,测试人员可以直接记录系统行为,作为测试是否异常的判断条件。
[0095]
应理解,在上述四个阶段中,准备阶段执行性于其他三个阶段之前,而上述调试阶段、高级调试阶段以及测试阶段之间的执行次序无分先后。也就是说,在准备阶段执行完毕后,其余三个阶段可按任意顺序执行,且可以只执行该三个阶段中的一个、两个或者三个阶段全部执行。
[0096]
本技术实施例通过编译指令的方式,可以由开发人员任意指定要调试的变量,数组,结构体等数据结构,并将这些数据保存到处理器内部的调试寄存器当中,后续程序执行时,这些数据都不会再存入内存中。调试寄存器可以选择支持数据变化时触发将原值存入调试缓存器中,数据变化到一定值时保存上下文,调度栈,halt cpu等硬件功能。此外,本发明还可以支持随机错误注入,测试人员可以设计测试用例,随机修改数据,测试系统的健壮性和可用性。
[0097]
下面对上述图3中的调试阶段(或高级调试阶段)以及上述测试阶段的具体过程与结果进行详细的说明。
[0098]
请参阅图4,图4为本技术实施例提供的另一种调试方法的流程图。如图4所示,该方法可包括:
[0099]
401、调试装置将源码中的关键字指示的变量存于调试寄存器中。
[0100]
上述源码可以是c、c++、python、java或者任一种其他汇编语言种类的代码,该变量可以是数据结构中的变量、数组或结构体。该关键字为自定义的关键字,分别添加在该变量的首端和末尾,在程序进行编译时,编译器将识别用该关键字指示出的变量,并将其存于上述调试寄存器中,而不再存入其他未用该关键字指示的变量所存入的原始内存中。
[0101]
402、上述调试装置将表征该变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中。
[0102]
在上述机器码运行的过程中,由程序代码控制(例如通过循环结构循环地向某个变量赋值)的变量将会发生变化,而在该变量变化的过程中,上述调试寄存器中所存储的该变量的值将发生改变。以单次变化为例,假设其变化前的值称为上述历史值,变化后的值称为当前值,则在该次变化之后,若该变量满足触发条件,上述调试寄存器将保存上述当前值,而将上述历史值转存于上述调试缓存器中。
[0103]
403、当该变量的值满足触发条件时,上述调试装置触发控制逻辑,发生中断,保存系统逻辑数据。
[0104]
在步骤402中,上述触发条件可设置为只要上述调试寄存器中存储的该变量的值发生变化。也就是说,上述变量的历史值将不断地转存于上述调试缓存器中,上述调试寄存器中只保存上述变量变化后的当前值,上述调试缓存器中保存上述变量变化前的历史值。而在此步骤为高级调试阶段,上述触发条件在该基础上进一步设置为当所述变量的值变化为某个特定的值时,或者上述调试寄存器中的数据发生bit翻转时,触发控制逻辑,控制中断cpu,而后获取系统的上下文以及系统的调用关系等系统逻辑数据。
[0105]
404、上述调试装置获取上述调试寄存器与上述调试缓存器中的数据,并对其处理后得到监测数据。
[0106]
监测应用在接受到软件发出的打印上述变量的变化列表的指令后,读取上述调试寄存器和上述调试缓存器中存储的数据,该数据为该变量的当前值以及表征其变化过程的历史值的集合。
[0107]
在一些实施例中,当上述关键字指示的待调试的变量的个数不止一个时,需要使用多个调试寄存器和多个调试缓存器辅助整个调试过程。为确保调试数据的准确性和条理性,需要先确定多个变量、多个调试寄存器以及多个调试缓存器之间的对应关系。因此,在步骤401之前,监测应用将配置上述调试寄存器与上述调试缓存器之间的转存映射关系;同理,调试人员用上述关键字指示出待调试的上述变量之后,监测应用还将根据编译指令对上述变量和上述调试寄存器做映射,生成映射表。也就是说,在步骤401中,所述将源码中的关键字指示的变量存于调试寄存器中之后,监测应用将根据每个调试寄存器中存储的变量生成上述映射表;应理解,上述转存映射中调试寄存器与调试缓存器的映射,以及上述映射表中调试寄存器与变量的映射,均为一一映射。举例说明,假设上述源码中用关键字指示出的待调试的变量为a和数组arr[2](其在编译的过程中可视为两个变量,即arr[0]和arr[1]),经编译之后,变量a存储于调试寄存器db0中,arr[1]存储于调试寄存器db1中,arr[1]存储于调试寄存器db2中,则生成的映射表为a《
--
》db0,arr[0]《
--
》db1,arr[1]《
--
》db2;而在步骤401之前的初始化阶段配置调试寄存器与调试缓存器的转存映射关系时,若调试寄存器db0对应的调试缓存器为buf0(db0《
--
》buf0),调试寄存器db1对应的调试缓存器为buf1(db1《
--
》buf1),调试寄存器db2对应的调试缓存器为buf2(db2《
--
》buf2),则在步骤402中,调试寄存器db0中存储的变量a的历史值将保存在调试缓存器buf0中,同理,调试寄存器db1中存储的变量arr[0]的历史值将保存在调试缓存器buf1中,调试寄存器db2中存储的变量arr[1]的历史值将保存在调试缓存器buf2中;在后续的调试过程中,当接收到打印变量a的变化列表的命令而执行步骤404时,监测应用先读取上述映射表,由a《
--
》db0得知变量a存储于调试寄存器db0中,再根据上述转存映射关系db0《
--
》buf0,得知调试db0中存储的变量a在变化过程中产生的历史值存储于调试缓存器buf0中;据此,监测应用采集调试寄存器db0以及调试缓存器buf0中的数据;将所得数据(即上述监测数据)呈现给调试人员。
[0108]
可选的,在获取上述调试寄存器与上述调试缓存器中的数据之后,上述方法还包括:对上述监测数据进行处理后再输出;所述处理可以是将上述监测数据中存储于上述调试缓存器中的该变量的历史值按其值的大小或其存储于该调试缓存器中的时长进行排序,和/或对上述监测数据中大于第一阈值和/或小于第二阈值的数据进行标注,令监测数据更加明了,便于调试人员的阅读。
[0109]
405、上述调试装置输出上述监测数据以及上述逻辑系统数据。
[0110]
其中监测数据为上述变量在调试阶段发生变化产生的数据,系统逻辑数据为高级调试阶段监测应用控制系统保存的例如系统上下文以及系统调用关系等数据。
[0111]
为了进一步说明图4所涉及的调试方法的使用场景和效果,下面介绍本技术实施例提供的一种调试过程的示意图,请参阅图5。
[0112]
图5为本技术实施例提供的一种调试过程的示意图。如图5所示,源码中用自定义的关键字指示出了两个待调试的数据结构,即图4中的整型变量foo以及长度为3的整型数组bar[3]。在源码中的变量foo前端添加关键字#dbg_start,在数组bar[3]的后端添加关键字#dbg_end;在编译器对源码编译处理得到机器码的过程中,变量foo以及数组bar[3]将被编译器识别,将其存入调试寄存器中;其中变量foo存入调试寄存器db0中,数组bar[3]将以元素bar[0]、bar[1]以及bar[2]的形式分别存储于调试寄存器db1、db2以及db3之中。之后,编译器将生成上述四个变量(应理解,上述长度为3的数组bar[3]在后续的调试过程中可近
似当作三个变量,即bar[0]、bar[1]以及bar[2])与其对应的调试寄存器之间的映射表;由图5中的映射表可知,变量foo存储于调试寄存器db0中,数据bar[3]的三个元素bar[0]至bar[2]分别存储于调试寄存器db1至db3中。在上述机器码运行的过程中,由于代码的控制,变量foo的值将发生变化;某一时刻,foo的值变化为0时,即调试寄存器中存储的foo的值变化为0时,满足触发条件db0=0,触发逻辑触发控制逻辑,进入高级调试状态,监测应用接受到控制逻辑的命令,保存系统的上下文以及调用关系。当监测应用接收到软件分发出的打印变量foo变化列表的指令后,将读取上述映射表,由映射表中的映射关系得知变量foo存储于调试寄存器db0之中,并根据在调试之前配置的调试寄存器与调试缓存器之间的转存映射关系(可参考对图2或图3说明中的转存映射关系),得知调试寄存器db0中溢出的调试数据将转存于调试缓存器buf0中。因此,监测应用将采集调试寄存器db0与调试缓存器buf0中的数据,并对其按存储时间的长短排序后,与上述系统上下文以及调用关系一起输出,呈现给调试人员。
[0113]
应理解,上述调试过程同时进行了如图2和图3中提及的调试过程以及高级调试过程,并且在上述调试过程之前,已经完成了类似对图3说明中涉及的准备阶段,包括配置硬件逻辑,对待调试的代码数据处加入供编译器识别的关键字等操作。
[0114]
接下来请参阅图6,图6为本技术实施例提供的一种测试方法的流程图。如图6所示,该方法可包括:
[0115]
601、调试装置将源码中的关键字指示的变量存于调试寄存器中。
[0116]
上述源码可以是c、c++、python、java或者任一种其他汇编语言种类的代码,该变量可以是数据结构中的变量、数组或结构体。该关键字为自定义的关键字,分别添加在该变量的首端和末尾,在程序进行编译时,编译器将识别用该关键字指示出的变量,并将其存于上述调试寄存器中,而不再存入其他未用该关键字指示的变量所存入的原始内存中。
[0117]
602、上述调试装置将错误值序列中的元素赋值于所述调试寄存器中存储的所述变量。
[0118]
监测应用以一定的频率将错误值依次赋值于上述调试寄存器中的变量,注入形式和时间可自由控制。
[0119]
示例性的,假设对调试寄存器db0中的变量a进行错误注入,监测应用通过查找映射表,获取变量a对应的调试寄存器db0,然后根据频率100hz(每秒修改100次,也就是每10ms修改一次),每10ms从错误值序列中取一个值,赋给db0,直到错误值序列中的值均被赋值于变量a。
[0120]
603、上述调试装置输出打印日志和系统状态。
[0121]
随着步骤602中变量的值发生变化,系统状态也会发生改变,系统可呈现系统的日志文件以及系统状态,测试人员可以直接记录系统行为,作为测试是否异常的判断条件。
[0122]
为了进一步说明图6所涉及的测试方法的使用场景和具体效果,下面介绍本技术实施例提供的一种测试过程的示意图,请参阅图7。
[0123]
接下来请参阅图7。图7为本技术实施例提供的一种测试过程的示意图。如图7所示,源码中用自定义的关键字指示出了两个待调试的数据结构,即图7中的整型变量foo以及长度为3的整型数组bar[3]。在源码中的变量foo前端添加关键字#dbg_start,在数组bar[3]的后端添加关键字#dbg_end;在编译器对源码编译处理得到机器码的过程中,变量foo
以及数组bar[3]将被编译器识别,将其存入调试寄存器中;其中变量foo存入调试寄存器db0中,数组bar[3]将以元素bar[0]、bar[1]以及bar[2]的形式分别存储于调试寄存器db1、db2以及db3之中。之后,编译器将生成上述四个变量与其对应的调试寄存器之间的映射表;由图7中的映射表可知,变量foo存储于调试寄存器db0中,数据bar[3]的三个元素bar[0]至bar[2]分别存储于调试寄存器db1至db3中。在上述机器码运行的过程中,监测应用通过查找上述映射表,获取foo变量对应的调试寄存器db0,然后根据配置的频率100hz(每秒注入100次错误值,即每10ms注入一次),每10ms从错误值序列inject中取一个值,赋给db0中存储的变量foo,直到inject序列消耗完或循环使用inject序列。图7中time 0为开始进行错误注入的时刻,则time 0时刻,调试寄存器db0中foo的值为12,10ms后的time2时刻,调试寄存器db0中foo的值为23,以此类推;在变量foo的值的变化过程中,系统也将随着foo的值的变化而改变,测试人员只需观测记录例如系统的打印日志以及系统状态等数据,提交问题单即可。
[0124]
应理解,图7中的测试过程与图5中的调试过程在执行顺序上无先后关系;此外,上述测试过程不涉及与调试缓存器相关的操作,因此,图3所提供的调试系统在只进行如图7中的测试过程时,在其准备阶段中配置调试缓存器的缓存深度这一步骤可省略。
[0125]
下面介绍本技术实施例提供的一种调试装置的结构示意图,请参阅图8。
[0126]
图8为本技术实施例提供的一种调试装置的结构示意图,如图8所示,该装置包括:
[0127]
存储单元802,用于将上述源码中的关键字指示的变量存于调试寄存器中;
[0128]
转存单元805,用于将表征上述变量在运行机器码的过程中的变化过程的历史值存于所述调试缓存器中;该机器码通过编译上述源码得到;
[0129]
输出单元808,用于输出监测数据;该监测数据为包括上述调试寄存器中存储的数据和上述调试缓存器中存储的表征所述变量变化过程的所述历史值的第一集合。
[0130]
在一个可选的实现方式中,该装置还包括:
[0131]
编译单元801,用于对源码进行编译得到上述机器码;
[0132]
在一个可选的实现方式中,上述装置还包括:
[0133]
整理单元807,用于获取原始数据;该原始数据为包括上述调试寄存器中存储的数据和上述调试缓存器中存储的表征上述变量变化过程的所述历史值的第二集合;并对该原始数据进行分析处理,得到上述监测数据;上述分析处理包括:对上述历史值按其值的大小或存储于上述调试寄存器中的时长由大到小或由小到大进行排序,和/或对上述原始数据中大于第一阈值的数据进行标注;和/或对上述原始数据中小于第二阈值的数据进行标注。
[0134]
在一个可选的实现方式中,该装置还可用于代码、程序或软件的测试,该装置还包括:
[0135]
测试单元804,用于在运行上述机器码的过程中,调整存储于上述调试寄存器中的所述变量的值,并输出打印日志和系统状态。
[0136]
在一个可选的实现方式中,测试单元804,具体用于将错误值序列中的元素的值赋值于上述调试寄存器中存储的所述变量,该赋值过程按照所述错误值序列中元素的顺序以固定的频率进行,上述变量的值在该赋值过程中根据上述错误值序列中元素的数据类型发生变化,该错误值序列为包括至少一个元素的数组。
[0137]
在一个可选的实现方式中,转存单元805,还用于当上述调试缓存器的内存空间不
足时,将上述变量变化后的值存于该调试寄存器中,将该变量变化前的上述历史值覆盖该调试缓存器中存储时间最长的值。
[0138]
在一个可选的实现方式中,所述装置还支持高级调试功能,该装置还包括:
[0139]
高级单元806,用于在上述变量的值满足触发条件时,触发控制逻辑,中断处理器之后,获取系统逻辑数据,该系统逻辑数据包括系统上下文和系统调用关系;上述输出监测数据包括:输出上述监测数据及上述系统逻辑数据。
[0140]
在一个可选的实现方式中,当待调试的变量个数大于1时,所述装置还包括:
[0141]
映射单元803,用于将所述变量与所述调试寄存器做映射,生成映射表;该映射表为表征上述变量与上述调试寄存器之间对应存储关系的映射表;上述输出监测数据包括:读取该映射表,获取上述变量与上述调试寄存器之间对应的存储关系;利用该存储关系获取上述监测数据;输出该监测数据。
[0142]
在一个可选的实现方式中,映射单元803,还用于配置上述调试寄存器与上述调试缓存器之间对应的数据转存映射,该数据转存映射为表征上述调试寄存器中上述变量的变化过程的历史值与上述调试缓存器之间对应存储关系的映射;上述将表征上述变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中包括:转存单元805利用上述数据转存映射,将表征上述调试缓存器中的上述变量变化过程的历史值存于上述调试缓存器中。
[0143]
应理解,以上调试装置的各个单元的划分仅仅是一种逻辑功能的划分,实际实现时可以全部或部分集成到一个物理实体上,也可以物理上分开。例如,以上各个单元可以为单独设立的处理元件,也可以集成同一个芯片中实现,此外,也可以以程序代码的形式存储于控制器的存储元件中,由处理器的某一个处理元件调用并执行以上各个单元的功能。此外各个单元可以集成在一起,也可以独立实现。这里的处理元件可以是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤或以上各个单元可以通过处理器元件中的硬件的集成逻辑电路或者软件形式的指令完成。该处理元件可以是通用处理器,例如cpu,还可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(application-specific integrated circuit,asic),或,一个或多个微处理器(digital signal processor,dsp),或,一个或者多个现场可编程门阵列(field-programmable gate array,fpga)等。
[0144]
下面介绍本技术实施例提供的一种电子设备的结构示意图,请参阅图9。
[0145]
图9为本技术实施例提供的一种电子设备的结构示意图。如图9所示,该电子设备90包括处理器901、存储器902和通信接口903;该处理器901、存储器902和通信接口903通过总线相互连接。图9中的电子设备可以为前述实施例中的调试装置。
[0146]
存储器902包括但不限于是随机存储记忆体(random access memory,ram)、只读存储器(read-only memory,rom)、可擦除可编程只读存储器(erasable programableread only memory,eprom)、或便携式只读存储器(compact disc read-only memory,cdrom),该存储器902用于相关指令及数据。通信接口903用于接收和发送数据。
[0147]
处理器901可以是一个或多个中央处理器(central processing unit,cpu),在处理器901是一个cpu的情况下,该cpu可以是单核cpu,也可以是多核cpu。上述实施例中由调试装置所执行的步骤可以基于该图9所示的电子设备的结构。具体的,处理器901可实现图8
中各单元的功能。
[0148]
该电子设备90中的处理器901用于读取该存储器902中存储的程序代码,执行前述实施例中的调试方法或测试方法。
[0149]
在本技术的实施例中提供另一种计算机可读存储介质,上述计算机可读存储介质存储有计算机程序,上述计算机程序被处理器执行时实现:将源码中的关键字指示的变量存于调试寄存器中;将表征所述变量在运行机器码的过程中的变化过程的历史值存于调试缓存器中;所述机器码通过编译所述源码得到;输出监测数据;所述监测数据为包括所述调试寄存器中存储的数据和所述调试缓存器中存储的表征所述变量变化过程的所述历史值的第一集合。
[0150]
本技术实施例提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行前述实施例所提供的调试方法或测试方法。
[0151]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1