程序的运行方法、装置、设备及介质与流程

未命名 08-06 阅读:97 评论:0


1.本技术涉及程序处理技术领域,特别是涉及一种程序的运行方法、装置、设备及介质。


背景技术:

2.在芯片设计领域,一般在芯片交付前,需要对需要运行在芯片上的应用程序进行仿真测试,以不断调试程序,从而使得在芯片出厂后,可以直接装载调试好的应用程序,以使芯片和应用程序在交付使用中能提供稳定的性能。
3.然而,目前的仿真测试往往只有测试完后的测试结果,程序员在调试时,需要依据经验对可疑位置重新编写后再进行调试,如此一来,效率非常低。


技术实现要素:

4.鉴于上述问题,提出了本技术实施例的一种程序的运行方法、装置、设备及介质,以便克服上述问题或者至少部分地解决上述问题。
5.为了解决上述问题,本技术的第一方面,公开了一种程序的运行方法,所述方法包括:
6.模拟运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有预设的目标指令;所述目标指令用于指示采集所述目标程序的运行状态;
7.在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供根据所保存的各个所述运行数据,对所述目标程序进行调试。
8.可选地,所述在每运行至一个所述目标指令所在的位置时,所述方法还包括:
9.关闭虚拟时钟;
10.所述将所述运行数据进行保存之后,所述方法还包括:
11.恢复所述虚拟时钟,以从所述目标指令所在的位置开始继续运行所述目标程序。
12.可选地,在将所述运行数据进行保存之后,所述方法还包括:
13.响应于对所述目标程序中目标程序段的运行指令,从所保存的各个所述运行数据中,确定与所述目标程序段对应的目标运行数据;
14.加载所述目标运行数据,以从所述目标程序段的起始位置处运行所述目标程序。
15.可选地,所述获取目标程序的当前运行数据,包括:
16.获取处理器中至少一个寄存器的状态信息;
17.根据所模拟的内存大小,获取内存的状态信息;
18.将所述寄存器的状态信息和所述内存的状态信息,作为所述运行数据。
19.可选地,所述将所述运行数据进行保存,包括:
20.获取所述目标程序当前运行到的所述目标指令对应的目标指令标识;
21.对所述目标指令标识和所述运行数据进行关联存储。
22.可选地,所述目标指令的类型包括r-typed指令扩展指令集的类型。
23.可选地,所述目标指令包括多个位段,多个所述位段用于指示以下多者:所述目标指令的标识、所述目标指令对应的保存地址、所述目标指令对应的多个功能操作、所述运行数据的来源地址。
24.本技术实施例的第二方面,提供一种程序的运行装置,所述装置包括:
25.模拟运行模块,用于利用模拟芯片运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有预设的目标指令;所述目标指令用于指示采集所述目标程序的运行状态;
26.数据保存模块,用于在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供基于所保存的各个所述运行数据,对所述目标程序进行调试。
27.本技术实施例的第三方面,还公开了一种芯片的仿真测试设备,其特征在于,包括:存储器、处理器及存储在存储器上的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现第一方面所述程序的运行方法的步骤。
28.本技术实施例的第四方面,还公开了一种计算机可读存储介质,其存储的计算机程序使得处理器执行如本技术第一方面实施例所述的程序的运行方法。
29.本技术实施例包括以下优点:
30.在本技术实施例中,可以模拟运行待调试的目标程序,在目标程序的至少一个位置插入有预设的目标指令;接着,在每运行至一个目标指令所在的位置时,可以获取目标程序的当前运行数据,并将运行数据进行保存;这些保存的各个所述运行数据,以供对目标程序进行调试。
31.其中,由于在目标程序的至少一个位置插入目标指令,在每运行到一个目标指令处时,便可以获取目标程序的当前运行数据,因此,可以获取运行过程中的中间数据,继而在进行目标程序的调试时,可以不再仅基于测试结果调试程序,而可以根据出现问题的中间数据精准定位到目标程序中出现问题的具体程序位置,实现了应用程序的精准调试,从而提高了程序的调试效率。
附图说明
32.为了更清楚地说明本技术实施例的技术方案,下面将对本技术实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
33.图1是示出了本技术实施例中的程序的运行方法的步骤流程图;
34.图2是本技术实施例中的目标指令的结构示意图;
35.图3是本技术实施例中的对程序段中待调试的具体程序行镜像定位并调试的步骤流程示意图;
36.图4是本技术实施例中的针对程序段进行目标程序的运行的步骤流程示意图;
37.图5是本技术实施例中的程序的运行装置的框架结构示意图;
38.图6是本技术实施例中的一种芯片的仿真测试设备的框架结构示意图。
具体实施方式
39.为使本技术的上述目的、特征和优点能够更加明显易懂,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
40.为方便理解本技术,首先对本技术所针对的探针和模拟器进行介绍:
41.其中,目标指令可以是探针,探针是一种可以植入原程序任意位置并且可以获取程序运行到该位置时系统任意状态信息的软件标识,本技术中以探针的植入不会对原程序在模拟器中的运行产生影响为目标,进行程序仿真的设计。
42.其中,模拟器用于模拟硬件运行应用程序,可以理解为是一种软件化的虚拟硬件。本技术的模拟器可以是qemu(quick emulator,快速仿真器),qemu是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,包括cpu模拟、内存模拟、i/o设备模拟等,qemu使用各类数据结构和函数来模拟设备的硬件状态和动作。一般而言,qemu通过微指令生成器将多种不同结构的程序代码,如x86、arm、riscv、mips上的,翻译为统一的中间语言。之后,qemu再根据宿主系统不同的结构,将中间语言翻译为宿主操作系统可识别的机器码,进而运行程序,这一系列操作对用户来说,是无感知的,也就是说用户在利用模拟器模拟硬件设备时,应用程序在模拟器上的运行,对于用户来说都是透明的。
43.有鉴于相关技术中存在的问题,提出了本技术的一种程序的运行方法,该方法的主要目的在于:在目标程序的运行过程中可以获取程序运行的中间运行状态,以更精确定位到缺陷位置,从而进行高效的程序调试。
44.为实现上述技术目的,本技术采用的主要实现手段是:在程序中的任意位置插入目标指令,以指示模拟器在程序运行到该位置时,获取程序的运行状态信息。当然,在程序中不止一个位置可以插入目标指令,在多个不同的位置均可以插入目标指令,这样便可以获取到程序运行过程中多个位置的中间运行状态,通过比较这些中间运行状态,便可以定位到程序的缺陷位置。
45.下面,对本技术的几种具体实施例进行介绍。
46.参照图1所示,示出了本技术的一种程序的运行方法的步骤流程图,该方法可以由模拟器执行,其中,本技术基于目标指令适配性的改进了模拟器,该模拟器能够在目标程序运行到目标指令所在位置时,基于该目标指令的指示,获取目标程序的运行状态信息。
47.如图1所示,该方法可以包括以下步骤:
48.步骤s101:模拟运行待调试的目标程序,其中,在目标程序的至少一个位置插入目标指令。
49.步骤s102:在每运行至一个目标指令所在的位置时,获取目标程序的当前运行数据,并将运行数据进行保存,以供根据所保存的各个运行数据,对目标程序进行调试。
50.其中,目标指令用于指示采集所述目标程序的运行状态,具体来说,目标指令可以是软件探针,或者可以是其他类型的指令,只要能达到在目标程序运行过程中,可以指示模拟器保存目标程序的当前运行数据即可。
51.本实施例中,可以采用模拟器模拟芯片,其中,芯片可以是cpu,可以是内存或者可以是其他类型的芯片。具体而言,利用模拟器模拟芯片的情况下,模拟器可以向系统模拟芯
片,以使系统认为自己在和硬件直接交互,而实际上是模拟器模拟出来的芯片在与系统进行交互,实际中,模拟器可以将指令转移给真正的硬件。
52.具体地,目标程序是需要运行在芯片上的程序,由于模拟器模拟了芯片,因此目标程序实际是运行在模拟器所模拟出来的虚拟机上,这样,可以通过模拟器对目标程序在芯片中的运行状态和动作进行监控、保存和恢复等操作,由此,可以通过模拟器运行目标程序,并保存运行中的运行数据,从而帮助用户找出目标程序中可能存在的缺陷。
53.为了使得目标程序在运行中,可以通过模拟器获取运行过程中的中间信息,可以预先在目标程序中插入目标指令,该目标指令的数量可以是一个,也可以是多个,目标指令所插入的位置可以是目标程序的任一位置,具体来说可以是中间位置。其中,在插入的目标指令有多个的情况下,多个目标指令可以分布在目标程序的多个不同位置,示例地,有三个目标指令的情况下,三个目标指令可以分布到目标程序的三个不同的程序行。
54.如上所述,目标指令可以是软件目标指令,在插入到目标程序时,可以在目标程序运行到目标指令所在的位置处时,模拟器开始执行目标指令所指示的功能。
55.具体而言,在目标程序每运行至一个目标指令所在的位置时,模拟器识别到目标指令,便会执行如下功能:获取目标程序的当前运行数据,并将运行数据进行保存。
56.其中,模拟器可以通过记录芯片的当前存储信息和运行信息,获取目标程序的当前运行数据,也就是说当前运行数据可以包括所模拟的芯片的存储信息和运行信息,运行信息可以包括所模拟的芯片的运行状态。
57.在进行运行数据的保存时,模拟器可以将运行数据保存到指定的存储地址,该指定的存储地址可以是模拟器自身的默认地址。如此,在需要进行程序的调试时,可以从存储地址中调取所保存的运行数据。
58.其中,由于目标指令的数量可以是一个,也可以是多个,则在有多个目标指令的情况下,在进行运行数据的保存时,可以以目标指令所在位置为标识,标识目标指令对应的运行数据,以便指示每个运行数据对应到目标程序的哪一位置。
59.其中,目标程序的当前运行数据可以用于表征目标程序执行到当前一个目标指令所在位置处的运行状态,因此,可以基于所保存的运行数据,以及运行数据所对应的目标指令所在位置,定位出目标程序需要调试的缺陷位置,进而对缺陷位置的程序进行调试。
60.实际中,用户可以通过分析运行数据便知道目标程序在该目标指令之前的运行是否正常,由此可以确定在目标指令插入位置之前的程序编译是否存在问题。具体地,若运行数据不包含异常数据,则表征目标指令插入位置之前的程序编译不存在问题,若运行数据包含异常数据,则表征目标指令插入位置之前的程序编译存在问题。
61.在目标程序中插入多个目标指令的情况下,由于目标程序是按照所编译的各个程序行顺序运行的,这样,多个目标指令可以将目标程序划分为多个程序段,不同的目标指令对应的运行数据可以反映目标程序中的各个程序段的运行状态。
62.示例地,目标程序总计有1000行程序行,插入的目标指令有10个,则10个目标指令将1000行程序行划分为11个程序段,按照目标程序的执行顺序,每个程序段都会对应至少一个目标指令对应的运行数据,可以反映目标程序在运行该段程序时是否存在异常。
63.示例地,按照位置顺序,第一个程序段会在运行到第一个目标指令时,保存对应的运行数据,若该运行数据正常,则表征该程序段的编译正常无需调试。接着,目标程序继续
运行,在运行到第二个目标指令时,又保存对应的运行数据,此时,若第二个目标指令对应的运行数据存在异常,则表征该第二个程序段出现了运行异常,该程序段的编译需要调试。
64.采用此种实施方式的技术方案,通过在目标程序的至少一个位置插入目标指令,使得在目标程序每运行到一个目标指令所在的位置时,由模拟器获取目标程序的当前运行数据,因此,可以获取运行过程中的中间数据,继而在进行目标程序的调试时,可以不再仅基于测试结果调试程序,而可以根据出现问题的中间数据精准定位到目标程序中待调试的缺陷位置,实现了应用程序的精准调试,从而提高了程序的调试效率。
65.其次,由于模拟器模拟运行目标程序,如此,模拟器具备捕获目标指令对应的状态信息的功能。
66.并且,本技术的模拟器模拟运行目标程序,这样,在运行目标程序的过程中,由于获取的运行数据可以包括所模拟的芯片的状态信息,因此,一次性的模拟可以同时验证目标程序的运行也验证芯片对目标程序的支持状态,从而在对目标程序的调试过程中,同时可以帮助实现芯片调试和程序调试。
67.如上述实施例所述,在基于模拟器的目标指令实现方案中,目标指令可以是一条自定义指令,具体而言,可以在目标程序中增加一条自定义指令来作为目标指令,在一种实施例中,该自定义指令可以以内嵌汇编的方式插入到目标程序的任意位置。
68.其中,汇编语言是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
69.其中,内嵌汇编是将汇编语言代码嵌入到高级语言的程序中,例如嵌入到c语言程序中。linux操作系统下,c语言程序的编译一般使用gcc来编译,而gcc编译器提供了内嵌汇编的功能,也就是说可以在c代码中直接内嵌汇编语言语句。gnu汇编器使用的是at&t汇编语言语法,因此内嵌在c语言中的汇编语言语法就是at&t语法。
70.本技术采用内嵌汇编的方式插入目标指令,可以保证对原目标程序的影响较小。
71.在一种可选实现方案中,为了使得大多数的芯片均能识别所插入的目标指令,也就是说,为了适配尽可能多的riscv架构中的被模拟cpu,目标指令可以是r-typed指令扩展指令集的类型,该类型的目标指令可以被大多数的riscv架构中的编译器gcc所识别,因此,可以满足在多种情况下的程序调试需求。
72.当然,该示例仅为可选的一种示例,实际中,根据需求,目标指令也可以是除r-typed指令扩展指令集外的其他类型的指令,如i-typed、s-typed、b-typed等。
73.在一种可选示例中,目标指令可以包括多个位段,多个位段用于指示以下多者:目标指令的标识、目标指令对应的保存地址、目标指令对应的多个功能操作、所述运行数据的源地址。
74.其中,目标指令的标识可以用于标识目标指令,即可以用目标指令的标识区分不同的目标指令,从而区分不同位置的运行数据。
75.其中,目标指令对应的保存地址可以用于指示运行数据所要保存到的地址。
76.其中,功能操作可以是指运行到目标指令对应的位置时,需要执行的操作,本技术中,所要执行的功能操作可以包括运行数据的获取、存储、虚拟时钟的暂停和恢复等操作。
77.参照图2所示,示出了一种示例中的r-type指令扩展指令集的目标指令。如图2所示,目标指令指令是一个32位的自定义指令,示例性地,该目标指令中的opcode=1110011;其mret指令的opcode相同,funct7=0011001,目标指令的指令总体为:0011001 00010.....000 00000 1110011。
78.其中,opcode表示7位指令操作码,其作用是区分不同的指令用于指定要执行的某种操作;rd指示目的的操作数寄存器,用来存放操作结果,具体来说可以指示保存地址,本实施例中,该目标指令可以无返回值(例如默认存储下),并选择x0作为rd。
79.rs1和rs2表示两个5位的源寄存器,具体来说可以是源寄存器的地址,在本技术中,rs1由编译器分配,用来传递目标指令标号(即目标指令的标识),以便区分不同位置的目标指令,从而区分出所保存的各个运行数据所对应到的目标程序中的位置,其中,为了方便获取sp的值rs2设计为x2。
80.funct3表示3位的功能码,funct7表示7位的功能码,其二者用于指示对应的功能操作。
81.本实施例中,目标指令各个位段的值也可以参照图2所示,通过该目标指令各个位段的指示,完成运行数据的获取和保存等操作。
82.在一种实施例中,在进行目标指令插入时,可以以汇编语言的形式插入目标指令,也可以将目标指令翻译为机器码后插入到目标程序。也就是说,目标指令的汇编语言属于r型基本指令;所述目标指令在所述目标程序表示为机器码。
83.具体而言,可以用.insn的方式在c语言程序(即目标程序)中插入软件目标指令:
84.asm volatile(
85.".insn r 0x73,0x0,0x19,x0,%0,x2"
86.:
87.:"r"(num_addr)
88.);
89.其中,.insn r opcode,func3,func7,rd,rs1,rs2为目标指令,采用上述插入的方式,可以在目标指令插入中,直接插入所涉及的r型基本指令,降低了编译人员的编译难度。
90.或者,在有一种实施例中,可以在目标程序中,直接以机器码的方式插入该软件目标指令,也即将目标指令翻译为机器码后插入到目标程序。
91.示例地,以机器码的方式插入该目标指令的形式可以是如下形式:.word0x32278073。
92.其中,在目标程序每运行到目标指令所在位置时,获取了目标程序的运行数据后,模拟器可以从该目标指令所在的位置处继续恢复目标程序的运行,也就是继续执行目标程序的后续程序内容,这样,可以在插入目标指令后,对目标程序的影响尽可能地小,也就是说尽可能保证目标程序的正常运行。
93.可选地,在一种实施例中,可以在每运行至一个目标指令所在的位置时,关闭模拟器的虚拟时钟,相应地,在将所述运行数据进行保存之后,可以恢复虚拟时钟,以从目标指令所在的位置开始继续运行目标程序。
94.本实施例中,在目标程序运行到目标指令所在位置时,便会关闭虚拟时钟,由此,可以充分区分出目标程序的运行和模拟器的运行,从而不影响目标程序的运行过程。而继
续执行时,只需要恢复虚拟时钟,便可以从目标指令对应的位置开始继续运行目标程序,从而使得执行目标指令所指示的操作,不影响目标程序的后续程序段的运行。
95.在一些实施例中,在模拟器保存完运行数据后,用户便可以通过查看所保存的运行数据,进行应用程序的调试,一般情况下,用户坑你需要选择性地执行某一段程序,此种情况下,模拟器可以加载对应的运行数据,使得目标程序直接从对应的位置处运行目标程序。
96.具体地,可以响应于对目标程序中目标程序段的运行指令,从所保存的各个运行数据中,确定与所目标程序段对应的目标运行数据;并加载目标运行数据,以从目标程序段的起始位置处运行目标程序。
97.由于目标程序在运行过程中均保存了各个目标指令对应的运行数据,这样,在后续调试过程中,若用户需要执行目标程序段,则可以向模拟器输入针对目标程序段的运行指令,接着,模拟器便可以从响应于对所述目标程序中目标程序段的运行指令,其中,该运行指令中可以携带目标程序段对应的目标指令的标识,这样,模拟器可以从所保存的各个所述运行数据中,加载与该标识对应的目标指令的运行数据,进而使得目标程序直接从目标程序段的起始位置处运行目标程序,而无需目标程序从头开始运行,从而节省了程序运行的时长。
98.其中,对本技术的程序的调试过程进行详细说明,具体地,在一种实施例中,参照图1所示的步骤流程图,对程序的运行方法的具体流程进行说明。
99.步骤s101:模拟运行目标程序,在所述目标程序的至少一个位置插入有预设的目标指令;
100.步骤s102:在每运行至一个目标指令所在的位置时,获取目标程序的当前运行数据,并将运行数据进行保存。
101.其中,在目标程序中可以插入多个预设的目标指令,具体地,每间隔预设数量的程序行便插入有一个目标指令,或者,在目标程序的每个节点位置处插入有一个目标指令,节点位置可以是对目标程序的运行起着重要作用的程序行所在的位置;其中,在每间隔预设数量的程序行插入有目标指令的情况下,预设数量可以根据实际情况确定,这样可以分段调试目标程序。
102.当然,实际中,也可以在目标程序的中间位置插入有一个目标指令,以获取前半段和后半段程序的运行状态。
103.当然,为了实现精准定位,可以每间隔预设数量的程序行插入目标指令,预设数量不宜定的过大。如此,可以将目标程序均匀划分为多个程序段,如此,可以在进行程序调试时,实现对目标程序按照均匀的间隔段进行调试。
104.在又一种可选方式中,在目标程序中的每个执行功能块中可以插入有一个目标指令,一个执行功能块可以理解为是目标程序的一个子实现功能,如数据读功能、写入功能、更新功能、数据转换功能、控制功能等,具体地,在每个子实现功能的开始执行处可以插入有目标指令,或者在每个子实现功能的结束位置处可以插入有目标指令。这样,可以依据每个目标指令的运行数据,确定哪一子实现功能出现缺陷,并针对子实现功能所在的程序段进行调试。
105.可选地,在一种实施例中,本步骤s102中,模拟器所模拟的芯片可以是一种类型的
处理器,该处理器可以包括cpu、gpu、npu,在获取目标程序的当前运行数据时,获取的当前运行数据可以包括寄存器的状态信息和内存的状态信息。
106.可以理解的是,在模拟器所模拟的芯片是cpu的情况下,cpu用于运行目标程序,其运行目标程序所需的数据一般会由内存加载到cpu中的寄存器,而内存的数据会从硬盘中加载。因此,程序的运行数据在包括寄存器的状态信息的情况下,可以通过寄存器的状态信息确定目标程序在运行过程中,加载所需数据到寄存器的过程是否正常。以及,在包括内存的状态信息的情况下,也可以通过内存的状态信息确定目标程序加载数据到内存中的过程是否正常,以及内存是否在目标程序运行过程中出现异常状态。
107.具体实施时,保存目标程序的当前运行数据时,可以获取处理器中至少一个寄存器的状态信息,并根据所模拟的内存大小,获取内存的状态信息;之后,将寄存器的状态信息和内存的状态信息,作为运行数据。
108.其中,处理器可以是cpu,至少一个寄存器可以是cpu中的全部寄存器,在包括全部寄存器的情况下,可以包括控制寄存器和通用寄存器,也就是说可以获取目标程序在运行过程中的控制状态和通用的数据读取类型的状态。
109.或者,至少一个寄存器可以是cpu中的部分寄存器,例如,部分的控制寄存器,或部分的通用寄存器,或者是仅包括全部的通用寄存器,或仅包括全部的控制寄存器。
110.其中,可以根据内存的大小,确定是否要保存内存的状态信息。具体地,若内存空间较大,则由于状态信息的数据量较多,因此可以无需获取内存的状态信息,若内存空间较小,则状态信息的数据量较少,因此可以获取内存的状态信息。
111.采用本实施例的运行数据的获取方式,可以在目标程序在芯片上运行的过程中,获取支持目标程序运行的各个目标机的状态,从而可以全方面反映目标程序在设计上是否与各个物理机适配,进而达到对目标程序的全方位的调试。
112.其中,获取到当前运行数据后,可以将当前运行数据进行保存,具体地,可以将运行数据保存在模拟器的默认存储地址,或者,可以将运行数据保存到目标指令所指定的存储地址。
113.如上述实施例所述,在编译目标指令时,由于目标指令是自定义指令,因此,可以在编译目标指令时,在指令中指定运行数据的对应存储地址,该存储地址可以是用户方便查看的地址,以便于模拟器根据该指定的地址,从该地址处获取到运行数据,并将运行数据保存到指定的存储地址。
114.或者,在一种情况下,编译目标指令时,可以不用指定存储地址,模拟器在获取到运行数据后,可以将运行数据保存到自身默认的存储地址,例如模拟器自身的模拟存储地址,这样,可以在默认存储地址获取所保存的运行数据即可。
115.在又一种可选的示例中,由于在目标程序的多个位置具有目标指令,这样,对于每个目标指令都对应保存有一个运行数据,如上述实施例所述的,可以采取一些手段区分不同位置处的目标指令所对应的运行数据。
116.本可选示例中,可以通过为目标指令设计目标指令标识,并将目标指令标识映射到所对应的运行数据,从而可以区分出每个运行数据在目标程序中所针对的位置,以方便用户精确定位到缺陷位置。
117.具体实施时,可以在将运行数据进行保存的过程中,获取目标程序当前运行到的
目标指令对应的目标指令标识;并对所述目标指令标识和所述运行数据进行关联存储。
118.其中,不同位置处的目标指令可以对应不同的目标指令标识。
119.如上所述,在自定义的目标指令指令中,rs1由编译器分配,用来传递目标指令标号,以便区分不同位置的目标指令,因此,在目标程序运行到目标指令时,会触发模拟器保存目标程序的当前运行数据,并触发模拟器获取当前的一个目标指令的目标指令标识,如模拟器可以读取rs1字段中各个位的值,然后将rs1字段值作为目标指令标识。
120.接着,在获取到运行数据后,可以将该目标指令标识和运行数据进行关联,关联的方式可以是:在运行数据以单独的文件存储的情况下,可以在运行数据的存储文件的命名中添加目标指令标识;或者,在每个运行数据不以单独的文件存储的情况下,可以在运行数据之前添加目标指令标识,以标识后续的运行数据属于哪一目标指令。
121.步骤s103:响应于对目标程序中目标程序段的运行指令,从所保存的各个所述运行数据中,加载与目标程序段对应的目标运行数据,以从目标程序段的起始位置处运行目标程序。
122.本实施例中,所保存的不同的运行数据对应目标程序中的不同位置,实际中,可以通过比对不同位置处的运行数据,确定出现运行故障的运行数据所在的位置,接着对该位置进行调试。实际中,用户可以发送针对待调试的目标程序段的运行指令,接着,可以加载对应的目标运行数据,以直接从目标程序段的起始位置处开始运行目标程序。
123.下面,基于本技术提供的程序运行方法,提供几种程序调试的方式,该方式可以由用户主导,也可以由用户根据调试逻辑,编译相应的代码到模拟器所在的系统中,由系统主导模拟器进行。
124.其中,为尽可能缩小对目标程序进行调试的位置范围,可以基于位置相邻的每两个目标指令各自对应的运行数据,确定目标程序中待调试的程序段,并对程序段进行调试。
125.在对程序段进行调试时,用户可以对程序段中的可疑位置进行编译,以消除缺陷,其中,可疑位置可以由用户根据经验判断,在重新编译程序段中可疑位置的程序后,可以直接向模拟器发送该可疑位置处(目标程序段)的运行指令,从而通过上述方式运行目标程序,并可以基于该目标程序段的前后两个目标指令各自对应的运行数据,确定程序调试是否成功。
126.当然,若用户根据经验无法捕捉到程序段中的可疑位置的情况下,还可以通过在程序段中继续插入第一目标指令的方式,对该程序段的运行状态进行仿真,从而多次试探后,定位到有缺陷的程序位置。
127.具体实施时,在对程序段中的待调试位置(既可疑位置)进行定位的过程中,插入到程序段的目标指令可以称为第一目标指令。其中,在一种第一目标指令的插入方式中,可以每间隔预设数量的程序行,插入一个第一目标指令,也就是说,在调试过程中,目标程序段中被新插入了目标指令,则运行目标程序段时,可以参照上述步骤s103的过程进行即可。
128.参照图3所示,示出了对目标程序段进行定位并调试的步骤流程示意图,如图3所示,具体可以包括以下步骤:
129.步骤s301:响应于对所述目标程序段的运行指令,从所保存的各个运行数据中获取目标程序段对应的目标指令所对应的目标运行数据;
130.其中,该目标程序中插入有至少一个第一目标指令;
131.步骤s302:加载所述目标运行数据,以从目标程序段的起始位置处运行目标程序,并在运行的过程中,获取第一目标指令对应的运行数据;
132.步骤s303:保存第一目标指令对应的运行数据,以供所述目标程序段的调试。
133.本实施例中,在目标程序段中插入有一个或多个第一目标指令,接着按照上述实施例的方式,再运行目标程序,并获取目标程序在运行到第一目标指令所在位置时的运行数据,接着,用户可以根据第一目标指令对应的运行数据,定位到程序段中出现程序问题的目标程序行,该目标程序行即为待调试的程序行,从而用户可以目标程序行进行调试。
134.当然,实际中,目标程序行的数量可以是一个,或者可以是多个,也就是说可能存在一个程序行待调试,或者,可能存在多个程序行均待调试。
135.一种可选示例中,可以在目标程序段中插入多个第一目标指令的情况下,可以取消目标程序中其他位置处已插入的目标指令。需要说明的是,插入的第一目标指令可以是与目标程序的原插入目标指令有同一功能的目标指令,也就是说可以都是如图2所示的目标指令,只是目标指令各自具有不同的目标指令标识。
136.这样,在目标程序段中便仅包括第一目标指令,而不包括前几次运行时所具有的目标指令。
137.例如,在目标程序的位置1(例如对应第102个程序行)、位置2(例如对应第204个程序行)和位置3((例如对应第400个程序行))中插入了目标指令,运行发现,出现问题的程序段是位置1-位置2之间的程序,则可以在位置1-位置2之间的程序中插入至少一个目标指令,例如,在位置1到位置2之间的位置4(例如第160个程序行)上插入第一目标指令,并取消原来的位置1的目标指令、位置2的目标指令和位置3的目标指令。其中,位置4的第一目标指令和原来的位置1、位置2和位置3的目标指令具有相同的功能。
138.在一种可选的实施方式中,第一目标指令的数量可以是多个,具体地,该目标程序段中的每个程序行插入有一个第一目标指令,或者,可以该目标程序段中每间隔一个或多个程序行插入有一个第一目标指令,这样,在再运行目标程序段的过程中,便可以基于这些第一目标指令各自所对应的运行数据,精确到其中一个待调试的目标程序行。
139.在又一种可选的实施方式中,可以在目标程序段中插入一个第一目标指令或插入两个第一目标指令,根据第一目标指令的运行数据的结果,确定下一次运行时第一目标指令的插入位置,从而不断更新第一目标指令的插入位置后,根据更新后的第一目标指令所对应的运行数据,逐渐定位到目标程序行。
140.具体实施时,在每运行一次目标程序段后,可以确定当次对应的第一目标指令对应的运行数据是否存在异常状态;若是,则基于当次对应的第一目标指令所在的位置和目标位置,确定目标程序行;其中,目标位置为当次之前最近一次插入的第一目标指令所在位置,或者为程序段的起始位置;
141.若否,则在当次对应的第一目标指令的位置之后,插入新的第一目标指令,并重复确定当次对应的第一目标指令对应的运行数据是否存在异常状态的步骤,直到所插入的第一目标指令对应的运行数据存在异常状态。
142.一种实施例中,程序段中插入的第一目标指令为一个的情况下,每次进行目标程序行的定位时,在程序段中所插入的第一目标指令均为一个,只是不同次插入的第一目标指令所对应的位置不同,具体地,在前后两次运行目标程序段时,目标程序段中的第一目标
指令所在的位置不同;具体地,前一次目标程序段中的第一目标指令,相比于后一次目标程序段中的第一目标指令更靠近程序结束位置。
143.如此,可以从程序段的两端位置,逐程序行地检测运行故障,进而逐渐定位到目标程序行。
144.另一种实施例中,程序段中插入的第一目标指令为两个的情况下,每次进行目标程序行的定位时,在程序段中所插入的第一目标指令均保持为两个,此种情况下,可以在后一次进行目标程序行的定位时,可以将前一次插入的两个第一目标指令中的一个第一目标指令取消,并重新选一个位置插入一个第一目标指令。具体地,在前后两次运行目标程序段时,前一次目标程序段中两个第一目标指令之间的程序段,是后一次目标程序段中两个第一目标指令之间的程序段的前一程序段,或者,可以是后一次目标程序段中两个第一目标指令之间的程序段的后一程序段。
145.具体实施时,在按照从程序段的起始位置到程序段的结束位置的顺序,在程序段中依次插入第一目标指令的方式中,后一次进行目标程序行的定位时,可以将前一次插入的两个第一目标指令中位置靠前的一个第一目标指令取消,并在位置靠后的第一目标指令之后新插入一个第一目标指令。或者,在按照从程序段的结束位置到程序段的起始位置的顺序,在程序段中依次插入第一目标指令的方式中,后一次进行目标程序行的定位时,可以将前一次插入的两个第一目标指令中位置靠近结束位置的一个第一目标指令取消,并在位置靠近起始位置的第一目标指令之前新插入一个第一目标指令。
146.示例地,程序段第一次插入了两个第一目标指令,分别为第一目标指令4和第一目标指令5,其中,第一目标指令4对应160个程序行,第一目标指令5对应第170个程序行,从程序段开始运行目标程序,得到第一目标指令4到第一目标指令5之间的程序行没有问题,则取消第一目标指令4,在第一目标指令5之后的程序行插入第一目标指令6,例如,在第175个程序行插入第一目标指令6,接着从第一目标指令5开始运行目标程序,运行后,若仍确认不存在问题,则取消第一目标指令5,在第一目标指令6之后的位置插入新的第一目标指令7,依此类推,直到定位到存在运行故障的目标程序行。
147.其中,在采用两个第一目标指令的情况下,可以一次性对目标程序段的一个子段进行检测,定位子段中的程序是否异常,从而可以在目标程序重复运行较少的次数下,迅速定位出目标程序行。
148.在具体实施时,可以采用以上任一插入第一目标指令的方式,定位到目标程序行:
149.下面,进行示例性说明,以目标程序段为第102个程序行到第204个程序行的程序段、每运行一次目标程序段时,该目标程序段中插入有一个第一目标指令为例,通过以下步骤定位到目标程序行:
150.步骤一,在目标程序段中的任意一个位置,插入有一个第一目标指令4,而目标程序的其他位置处的目标指令被取消;如在第120个程序行插入第一目标指令4;
151.步骤二,加载第102个程序行的运行数据,以运行目标程序段,并在运行到第一目标指令4所在位置处时,获取对饮的运行数据,将该运行数据作为第一目标指令4对应的运行数据;
152.步骤三,若用户基于第一目标指令4对应的运行数据,确定在第一目标指令4之前的程序段出现运行问题,则将目标程序段(第102个程序行)到第一目标指令4(第120个程序
行)之间的程序作为待调试的多个目标程序行,在该多个目标程行中插入一个信的第一目标指令,并重复步骤二和步骤三。示例地,在第一目标指令4保持的运行数据出现了问题,则将第102个程序行-第120个程序行之间的程序作为待调试的目标程序行。
153.步骤四,若用户基于第一目标指令4对应的运行数据确定未出现运行问题,则在该目标程序段中位于第一目标指令4之后的位置处插入一个第一目标指令,并取消原来位置处的第一目标指令4,重复执行上述的步骤二和步骤三,直到定位到出现问题的程序位置。例如,在第120个程序行之后的第135个程序行处插入第一目标指令5,并取消第120个程序行的第一目标指令4。
154.当然,在步骤四中,若确定某一次插入的第一目标指令对应的运行数据表征出现运行问题,则可以将前一次第一目标指令所插入的位置与当次插入第一目标指令的位置之间的程序作为待调试的目标程序行。
155.需要说明的是,在进行目标程序行的定位过程中,可以在目标程序运行到第一目标指令处时,便结束运行,因为,目标程序段本身是出现运行问题的程序段,实际中,可以仅检测该目标程序段中各个位置的运行是否正常即可,对于后续程序段的运行可以不用检测。
156.当然,在其他一些实施例中,也可以在运行到第一目标指令所在位置,获取到第一目标指令对应的运行数据后,继续恢复目标程序的运行,以完整运行一次目标程序。
157.采用此种实施方式时,可以在目标程序段仅插入一个第一目标指令的情况下,便可以逐步定位到待调试的目标程序行,由于仅插入了一个第一目标指令,可以保证目标程序的运行过程中,仅保存一次运行数据,从而可以在较短的时间内运行完目标程序,从而提高定位到目标程序行的效率。
158.下面,再进行示例性说明,以程序段为第102个程序行到第204个程序行的目标程序段、在目标程序段中每次具有两个第一目标指令为例,通过以下步骤定位到目标程序行:
159.见以下流程:
160.步骤一,在目标程序段中的任意两个位置,分别插入有一个第一目标指令,并取消目标程序段的其他位置处的目标指令;示例地,位置1到位置2之间的位置4和位置5处分别插入一个第一目标指令;其中,位置4是第120个程序行,位置5是第130个程序行;
161.步骤二,加载第102个程序行的运行数据,以运行目标程序段,并在每运行到第一目标指令所在位置处时,获取目标程序的运行数据,将该运行数据作为第一目标指令对应的运行数据;
162.步骤三,若用户确定该两个第一目标指令对应的运行数据存在运行问题,则根据出现问题的第一目标指令的位置,定位目标程序行;
163.此步骤三中,若位置在前的第一目标指令对应的运行数据表征运行出现问题,则可以将该程序段的开始位置到位置在前的第一目标指令对应的位置之间的程序,作为待调试的目标程序。示例地,在位置4保持的运行数据对应出现了问题,则将位置1-位置4之间的程序作为待调试的目标程序行,如此,便进一步缩小了调试范围。
164.若位置在后的第一目标指令对应的运行数据表征运行出现问题,则可以将两个目标指令之间的程序,作为待调试的目标程序;示例地,在位置5保持的运行数据对应出现了问题,则将位置4-位置5之间的程序作为待调试的目标程序行,如此,便进一步缩小了调试
范围。
165.示例地,若位置5处的第一目标指令5的运行数据异常,则问题出在位置4和位置5之间,若位置4处的第一目标指令4的运行数据异常,则问题出在位置1和位置4之间。若位置4和位置5均出现运行数据异常,则问题出在位置1到位置5之间。
166.步骤四,若用户确定第一目标指令对应的运行数据未出现运行问题,则在该目标程序段中位于位置在后的第一目标指令之后的位置处再插入一个第一目标指令,而取消原来的位置在前的第一目标指令;并向模拟器发送运行指令,模拟器基于该运行指令,加载位置在前的第一目标指令所对应的运行数据,以运行该程序段,并重复上述步骤三,直到定位到出现问题的程序行。
167.示例地,位置5和位置4处的第一目标指令5的运行数据都不存在异常,则会在位置5之后的位置6处插入第一目标指令6,取消第一目标指令4,然后重复以上步骤,直到定位到目标程序行。
168.当然,按照上述两种方式,还可以精准定位到出现问题的一个目标程序行,也就是实际中,可以在程序段中的每个程序行中依次插入第一目标指令的方式,精确定位到目标程序行。或者,可以在程序段中的每两个程序行中分别插入第一目标指令的方式,精确定位到目标程序行,该每两个程序行可以是相邻的两个程序行,或者可以是中间间隔有一个程序行的程序行。
169.如上所述,在定位到目标程序段又需要从目标程序段中定位到目标程序行的情况下,为了提高定位效率,可以在每次运行目标程序时,可以让目标程序的运行时间尽量缩小,具体的实现方式是,从目标程序段的起始位置处附近开始目标程序的运行。
170.此种可选方式中,可以从各个运行数中加载距离目标程序段的起始位置处最近的一个目标指令(以下称为第二目标指令)对应的运行数据,以从第二目标指令的位置处开始运行目标程序。
171.参照图4所示,示出了本技术的针对目标程序段进行目标程序的运行的步骤流程示意图,如图4所示,具体可以包括以下步骤:
172.步骤s401:获取目标程序中位于所述第一目标指令之前,且距离第一目标指令最近的第二目标指令对应的运行数据;
173.步骤s402:加载第二目标指令对应的运行数据,以运行目标程序,并对所述第一目标指令处的运行数据进行保存。
174.本实施例中,第二目标指令可以是原始插入到目标程序的目标指令,或者,可以是目标程序段中在先插入的第一目标指令。示例地,在第一次针对目标程序段进行目标程序行的定位时,第二目标指令可以是位于目标程序段之前的原始插入的目标指令。在第二次针对目标程序段进行目标程序行的定位时,第二目标指令便可以是位于目标程序段内的在先插入的第一目标指令。
175.示例地,在目标程序的位置1(例如对应第102个程序行)、位置2(例如对应第204个程序行)之间的程序段作为待调试的目标程序段,则在第一次定位目标程序行时,将位置1处的目标指令1作为运行起始位置。
176.其中,可以加载第二目标指令对应的运行数据,也就是说将第二目标指令对应的运行数据加载到目标程序,使得目标程序直接从第二目标指令处开始运行,这样每次针对
目标程序段进行目标程序行的定位时,都可以从距离当前插入的第一目标指令最近的位置处开始运行目标程序段,无需目标程序从头运行,大大降低了程序的调试时间。
177.采用此种实施方式时,可以直接加载距离程序段最近的一个位置处对应的运行数据,并从该位置处开始运行目标程序,也就是说每次针对目标程序段进行目标程序行的定位时,都可以从中间位置开始运行目标程序,而无需从头重新运行目标程序。
178.实际中,目标程序行的数量可以指定,例如可以指定为1或3,这样,当定位到的出现问题的程序段所包括的程序行小于指定的数量的情况下,便可以结束检测,从而对定位的目标程序行进行修改后再调试。
179.为完整说明的本技术的程序的运行方法,结合图4所示,以一个具体示例为例,进行示例性地完整说明:
180.该示例以芯片为cpu说明,假设某公司开发了一个cpu或一款新程序,需要在cpu上运行该新程序,以便确定该新程序在cpu上运行的状况,或者,cpu负载程序的能力,可以采用qemu模拟cpu,然后确定程序在这个cpu上运行一遍会有什么问题,其中,无论是需要验证新程序还是需要验证新开发的cpu,都可以通过对运行的程序的调试,达到对指导cpu的设计和程序的设计的目的,其中,该运行的程序即为目标程序,也就是说是待调试的程序。
181.首先,在目标程序中的多个位置插入探针(即目标指令),例如,在位置1、位置2和位置3分别插入探针1、探针2和探针3。其中,探针是自定义的r-type类型的指令,具体为图2所示的指令,具体插入方式是:用.insn的方式在c语言程序中插入软件探针:
182.asm volatile(
183.".insn r 0x73,0x0,0x19,x0,%0,x2"
184.:
185.:"r"(num_addr)
186.);
187.接着,利用本技术改进后的模拟器模拟cpu运行目标程序;其中,在每运行至一个探针所在的位置时,模拟器执行以下操作:
188.①
探针执行时关闭虚拟时钟,减小探针对整个目标程序执行时间序的影响;
189.②
记录所有寄存器的信息,包括通用寄存器和状态和控制寄存器,并保存到本地文件中;
190.③
保存系统内存信息,并保存到本地文件中;
191.④
恢复虚拟时钟,以从当前的探针处继续目标程序的运行;
192.接着,用户或系统可以基于所保存的各个运行数据,对所述目标程序进行调试,具体包括:
193.s1,比较每两个位置相邻的探针对应的运行数据,确定运行数据存在问题的目标探针,将与目标探针位置相邻的前一探针的位置和目标探针的位置之间的程序确定为待调试的目标程序段。
194.例如,探针2对应的运行数据存在问题,则表征运行到探针1的位置时,不存在运行问题,而在自探针1的位置运行到探针2的位置的过程中,出现了运行问题,因此,探针1到探针2之间的程序段需要待调试。
195.其中,为了精确定位出探针1到探针2之间的程序段中出现问题的程序行,可以通
过以下方式找出目标程序行:
196.步骤一,在目标程序段中的任意一个位置,例如,目标程序段的中间位置插入一个第一探针4,并取消目标程序的其他位置处的探针2和探针3;向模拟器发送该目标程序段的运行指令。
197.步骤二,模拟器响应于该运行指令,加载探针1的运行数据,以从探针1的位置处开始运行目标程序,缩短程序运行时间;
198.步骤三,在运行到第一探针4所在位置处时,获取目标程序的运行数据,并保存该运行数据;
199.步骤四,用户确定第一探针4对应的运行数据是否存在问题,若是,则将第一探针1到第一探针4之间的程序作为待调试的多个目标程序行,若否,则进入步骤五;
200.步骤五,在该目标程序段中位于第一探针4的位置之后的位置处插入一个第一探针5,并取消原来位置处的第一探针4,发送运行指令,模拟器响应于该运行指令,加载第一探针4对应的运行数据,从第一探针4开始运行目标程序,并重复执行上述的步骤三和步骤四,直到定位到出现问题的程序位置。
201.假设经过几次插入后,发现第一探针7对应的运行数据出现问题,则可以将第一探针7和上一次插入的第一探针6之间的程序作为目标程序行。
202.当然,在一些示例中,也可以在第一探针4对应的运行数据存在问题的情况下,继续在第一探针1到第一探针4之间的程序中插入第一探针,以继续缩小查找范围,按照上述方式查找出目标程序行。
203.基于相同的发明构思,本技术还提供了一种程序的运行装置,参照图5所示,示出了本技术的程序的运行装置的结构示意图,该运行装置可以是位于模拟器的虚拟装置,如图5所示,所述装置具体可以包括以下模块:
204.模拟运行模块501,用于利用模拟运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有目标指令;
205.数据保存模块502,用于在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供基于所保存的各个所述运行数据,对所述目标程序进行调试。
206.可选地,所述装置还包括:
207.时钟关闭模块,用于在每运行至一个所述目标指令所在的位置时,关闭所述模拟器的虚拟时钟;
208.时钟恢复模块,用于将所述运行数据进行保存之后,恢复所述虚拟时钟,以从所述目标指令所在的位置开始继续运行所述目标程序。
209.可选地,所述模拟运行模块501,包括:
210.数据获取模块,用于响应于对所述目标程序中目标程序段的运行指令,从所保存的各个所述运行数据中,确定与所述目标程序段对应的目标运行数据;
211.加载模块,用于加载所述目标运行数据,以从所述目标程序段的起始位置处运行所述目标程序。
212.可选地,所述数据保存模块502,包括:
213.第一信息获取单元,用于通过所述模拟器获取处理器中至少一个寄存器的状态信
息;
214.第二信息获取单元,用于根据所模拟的内存大小,获取内存的状态信息;
215.数据获取单元,用于将所述寄存器的状态信息和所述内存的状态信息,作为所述运行数据。
216.可选地,所述数据保存模块502,包括:
217.标识获取单元,用于获取所述目标程序当前运行到的所述目标指令对应的目标指令标识;其中,不同位置处的目标指令对应不同的目标指令标识;
218.关联存储单元,用于对所述目标指令标识和所述运行数据进行关联存储。
219.可选地,所述数据保存模块502,具体用于将所述运行数据保存在所述模拟器的默认存储地址,或者,将所述运行数据保存到所述目标指令对应的存储地址。
220.可选地,所述目标指令的类型包括r-typed指令扩展指令集的类型。
221.可选地,所述目标指令采用汇编语言,并通过内嵌汇编的方式插入所述目标程序。
222.可选地,所述目标指令包括多个位段,多个所述位段用于指示以下多者:所述目标指令的标识、所述目标指令对应的保存地址、所述目标指令对应的多个功能操作、所述运行数据的来源地址。
223.需要说明的是,装置实施例与方法实施例相近,故描述的较为简单,相关之处参见方法实施例即可。
224.采用上述实施例的程序的运行方法和程序的运行装置具有以下优点:
225.第一,由于在目标程序的至少一个位置插入有目标指令,在每运行到一个目标指令处时,模拟器便可以获取目标程序的当前运行数据,因此,可以获取运行过程中的中间数据,继而在进行目标程序的调试时,可以不再仅基于测试结果调试程序,而可以根据出现问题的中间数据精准定位到目标程序中出现问题的具体程序位置,实现了应用程序的精准调试,从而提高了程序的调试效率。
226.第二,由于模拟器模拟芯片运行目标程序,如此,可以利用模拟器修改灵活、方便获取模拟芯片状态的特性来实现软件目标指令的设计及使用;
227.第三,由于模拟器模拟芯片运行目标程序,这样,不仅可以根据保存的运行数据对需要运行在芯片上的目标程序进行调试,进而也可以基于目标程序的调试过程,指导对芯片的设计,达到芯片设计和程序设计同步仿真、同步设计的目的;
228.第四,采用上述程序的运行方法,可以帮助用户定位到目标程序段中的待调试的目标程序行,因而可以实现程序的精准调试,提高调试成功率。
229.第五,在定位到目标程序行的过程中,模拟器可以从最近插入的目标指令处加载运行数据,从而避免在每次定位中从头开始运行目标程序,从而提高每次定位的程序运行时间,提高定位效率。
230.第六,插入的目标指令是r-type指令扩展指令集的类型,因此可以适配大多数的riscv架构,使得不同配置的cpu均可以识别,拓宽了本技术的目标指令的适用范围。
231.第七,在定位到目标程序行时,可以允许一次性插入多个目标指令,这样可以减少定位次数,即一次就可以定位到目标程序行,可以提高用户的体验。或者,在定位到目标程序行时,一次插入一个第一目标指令,或者插入两个第一目标指令,可以避免目标程序中目标指令插入的数量过多时,所导致的目标程序频繁被模拟器暂停运行和恢复运行,而导致
的程序运行风险增高的问题,从而可以更加精准地实现程序调试。
232.基于同一发明构思,本技术实施例提供一种芯片的仿真测试设备,包括:存储器、处理器及存储在存储器上的计算机程序,处理器执行计算机程序以实现本技术实施例的程序的运行方法的步骤。
233.本技术在一个可选实施例中提供了一种芯片的仿真测试设备,如图6所示,图6所示的芯片的仿真测试设备200包括:处理器201和存储器203。其中,处理器201和存储器203相通信连接,如通过总线202相连。
234.处理器201可以是cpu(central processing unit,中央处理器),通用处理器,dsp(digital signal processor,数据信号处理器),asic(application specificintegrated circuit,专用集成电路),fpga(field-programmable gate array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本技术公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器201也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等。
235.总线202可包括一通路,在上述组件之间传送信息。总线202可以是pci(peripheral component interconnect,外设部件互连标准)总线或eisa(extendedindustry standard architecture,扩展工业标准结构)总线等。总线202可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
236.存储器203可以是rom(read-only memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,ram(random access memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是eeprom(electrically erasableprogrammable read only memory,电可擦可编程只读存储器)、cd-rom(compact discread-only memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。
237.可选地,芯片的仿真测试设备200还可以包括收发器204。收发器204可用于信号的接收和发送。收发器204可以允许芯片的仿真测试设备200与其他设备进行无线或有线通信以交换数据。需要说明的是,实际应用中收发器204不限于一个。
238.可选地,芯片的仿真测试设备200还可以包括输入单元205。输入单元205可用于接收输入的数字、字符、图像和/或声音信息,或者产生与芯片的仿真测试设备200的用户设置以及功能控制有关的键信号输入。输入单元205可以包括但不限于触摸屏、物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆、拍摄装置、拾音器等中的一种或多种。
239.可选地,芯片的仿真测试设备200还可以包括输出单元206。输出单元206可用于输出或展示经过处理器201处理的信息。输出单元206可以包括但不限于显示装置、扬声器、振动装置等中的一种或多种。
240.虽然图6示出了具有各种装置的芯片的仿真测试设备200,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
241.可选的,存储器203用于存储执行本技术方案的应用程序代码,并由处理器201来控制执行。处理器201用于执行存储器203中存储的应用程序代码,以实现本技术实施例提供的任一种程序的运行方法。
242.当然,在一实施例中,存储器203可以包括易失性存储器和非易失性存储器,其中,易失性存储器可以理解为是随机存取记忆体,用来存储和保存数据的。非易失性存储器是指当电流关掉后,所存储的数据不会消失的电脑存储器,当然,本技术的程序的运行方法的计算机程序可以存储在易失性存储器和非易失性存储器中,或者存在二者中的任意一个中。
243.本技术实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如本技术实施例所述的程序的运行方法。
244.本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
245.本领域内的技术人员应明白,本技术实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本技术实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
246.本技术实施例是参照根据本技术实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
247.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
248.这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
249.尽管已描述了本技术实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本技术实施例范围的所有变更和修改。
250.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包
括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
251.以上对本技术所提供的一种程序的运行方法、装置、设备和存储介质进行了详细介绍,本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想;同时,对于本领域的一般技术人员,依据本技术的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本技术的限制。

技术特征:
1.一种程序的运行方法,其特征在于,所述方法包括:模拟运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有预设的目标指令;所述目标指令用于指示采集所述目标程序的运行状态;在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供基于所保存的各个所述运行数据,对所述目标程序进行调试。2.根据权利要求1所述的方法,其特征在于,所述在每运行至一个所述目标指令所在的位置时,所述方法还包括:关闭虚拟时钟;所述将所述运行数据进行保存之后,所述方法还包括:恢复所述虚拟时钟,以从所述目标指令所在的位置开始继续运行所述目标程序。3.根据权利要求1所述的方法,其特征在于,在将所述运行数据进行保存之后,所述方法还包括:响应于对所述目标程序中目标程序段的运行指令,从所保存的各个所述运行数据中,确定与所述目标程序段对应的目标运行数据;加载所述目标运行数据,以从所述目标程序段的起始位置处运行所述目标程序。4.根据权利要求1所述的方法,其特征在于,所述获取目标程序的当前运行数据,包括:获取处理器中至少一个寄存器的状态信息;根据所模拟的内存大小,获取内存的状态信息;将所述寄存器的状态信息和所述内存的状态信息,作为所述运行数据。5.根据权利要求1所述的方法,其特征在于,所述将所述运行数据进行保存,包括:获取所述目标程序当前运行到的所述目标指令对应的目标指令标识;对所述目标指令标识和所述运行数据进行关联存储。6.根据权利要求1-5任一项所述的方法,其特征在于,所述目标指令的类型包括r-typed指令扩展指令集的类型。7.根据权利要求1-5任一项所述的方法,其特征在于,所述目标指令包括多个位段,多个所述位段用于指示以下多者:所述目标指令的标识、所述目标指令对应的保存地址、所述目标指令对应的多个功能操作、所述运行数据的来源地址。8.一种程序的运行装置,其特征在于,所述装置包括:模拟运行模块,用于模拟运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有预设的目标指令;所述目标指令用于指示采集所述目标程序的运行状态;数据保存模块,用于在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供基于所保存的各个所述运行数据,对所述目标程序进行调试。9.一种芯片的仿真测试设备,其特征在于,包括:存储器、处理器及存储在存储器上的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现权利要求1-7中任一项所述程序的运行方法的步骤。10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-7中任一项所述程序的运行方法的步骤。

技术总结
本申请实施例提供了一种程序的运行方法、装置、设备及介质,所述方法包括:模拟运行待调试的目标程序;其中,在所述目标程序的至少一个位置插入有预设的目标指令;所述目标指令用于指示采集所述目标程序的运行状态;在每运行至一个所述目标指令所在的位置时,获取所述目标程序的当前运行数据,并将所述运行数据进行保存,以供基于所保存的各个所述运行数据,对所述目标程序进行调试。所述目标程序进行调试。所述目标程序进行调试。


技术研发人员:徐航
受保护的技术使用者:北京奕斯伟计算技术股份有限公司
技术研发日:2022.12.13
技术公布日:2023/8/5
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐