发明内容
有鉴于此,本公开的目的是提供一种追踪可执行程序中的目标变量的方法和系统,以更方便用户在可执行程序执行时追踪目标变量的变化情况。
第一方面,本公开实施例提供一种追踪可执行程序中的目标变量的方法,包括:
读取描述信息,所述描述信息标识所述目标变量所属区域的基地址的获取来源及所述目标变量在所属区域的地址偏移;
使用所述可执行程序的进程标识,从所述描述信息所标识的获取来源,获取所述目标变量所属区域的基地址;
根据所述基地址和所述地址偏移,确定所述目标变量的实际地址;以及
从所述实际地址读取所述目标变量。
可选地,所述读取所述目标变量包括:读取所述目标变量的数据以及收集造成所述数据的变化的指令流信息。
可选地,所述获取来源指定从进程寄存器还是从指定内存获取所述目标变量所属区域的基地址。
可选地,所述描述信息还指定是否存在下一级地址以及是否下一级地址进行跟踪,则所述读取所述目标变量包括:
当存在下一级地址且指定对下一级地址进行跟踪时,从所述实际地址读取下一级地址,并从所述下一级地址读取所述目标变量。
可选地,所述基地址为所述可执行程序的进程空间的基地址或为所述可执行程序的进程空间内特定区域的基地址。
可选地,还包括:加载并解析所述可执行程序,以构建所述描述信息。
可选地,还包括:根据用户指令确定所述目标变量。
可选地,所述加载并解析所述可执行程序,以获得目标变量的描述信息包括:
确定所述目标变量归属的函数路径;
确定所述目标变量归属的数据类型定义;
根据所述函数路径和数据类型定义构建所述描述信息。
可选地,如果所述目标变量归属的数据类型定义为多级数据结构,则根据所述多级数据结构计算到达所述目标变量经过的每个级的地址偏移并累加到达所述目标变量经过的每个级的地址偏移以得到所述目标变量在所属区域的地址偏移。
可选地,所述目标变量的数据类型包括:数值型、字符型、数据结构、类、指向数据结构或类的指针。
第二方面,本公开实施例提供一种追踪可执行程序中的目标变量的系统,包括:软件部分的分析模块和硬件执行的处理器追踪模块,所述分析模块包括:
加载并解析所述可执行程序,以获得所述目标变量的描述信息;
将所述描述信息存储到所述处理器追踪模块的指定寄存器中,所述描述信息标识所述目标变量所属区域的基地址的获取来源及所述目标变量在所属区域的地址偏移,所述目标变量所属区域位于所述可执行程序的进程空间之中;
所述处理器追踪模块包括:
读取指定寄存器内的描述信息;
使用所述可执行程序的进程标识,从所述描述信息所标识的获取来源,获取所述目标变量所属区域的基地址;
根据所述基地址和所述地址偏移,确定所述目标变量的实际地址;以及
从所述实际地址读取所述目标变量。
可选地,所述获取来源指定从进程寄存器还是从指定内存获取所述目标变量所属区域的基地址。
第三方面,本公开实施例提供一种计算设备,包括:
处理单元,用于执行可执行程序,并将所述可执行程序中的目标变量的描述信息存储在所述处理器追踪模块的指定寄存器中,所述描述信息描述了所述目标变量所属区域的基地址的获取来源以及所述目标变量在所属区域的地址偏移,所述目标变量所属区域位于所述可执行程序的进程空间之中;
处理器追踪模块,用于读取指定寄存器内的描述信息;使用所述可执行程序的进程标识,从所述描述信息所标识的获取来源,获取所述目标变量所属区域的基地址;根据所述基地址和所述地址偏移,确定所述目标变量的实际地址;以及从所述实际地址读取所述目标变量。
综上,本公开实施例提供的方法和系统,通过目标变量的地址偏移确定目标变量在可执行程序的进程空间内的实际地址,并追踪该地址上的数据变化,无需用户添加调试语句,也无需源代码支持,并可追踪可执行程序中的任意目标变量。
具体实施方式
以下基于实施例对本公开进行描述,但是本公开并不仅仅限于这些实施例。在下文对本公开的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本公开。为了避免混淆本公开的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
在介绍本公开的各个实施例之前,先对本公开所使用的一些术语或者概念进行解释和澄清。
数据追踪(trace):处理器上将数据通过引脚输出给编码器,编码器对数据进行编码添加包头并按照一定格式进行压缩,压缩后通过内存或外部接口输出给上位机或分析软件,分析软件按照运行程序和追踪包进行数据重构就能,还原出程序运行的完整过程,包含程序流变化,数据访问等等;
锁:在多线程操作时会通过锁机制来保证内部资源访问时都为互斥,没有两个线程同时访问操作同一个变量。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。避免同时修改的逻辑错误。
指令流水线,指令流水线是为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,每个步骤由专门的电路完成的方式。目前主流的指令流水线的技术有三级、四级、五级、七级和超级指令流水线,等等。例如教课书示例的五级指令流水线包括取指、译码、执行、访存和写回。
指针寄存器:不同指令集使用不同寄存器存储进程相关的地址信息,因此具体本公开时,需根据指令集选择相应的寄存器。例如RISC-V中,使用fp作为栈顶寄存器,sp用于获取堆栈中的数据。
用于实施本发明的系统
图1是用于实施本发明的系统100的结构示意图。如图1所示,系统100包括硬件部分101。硬件部分101包括基于总线102将各种元件与处理单元106耦接到一起。根据软硬件结构要求,总线102可以为各种类型总线。例如为AXI总线、OCP(Open Core Protocol)总线协议或者采用特定领域自主开发的专用总线。而且总线结构还可以包括或者不包括例如AHB/APB桥这样的桥接单元。AXI总线是ARM公司提出的AMBA(Advanced MicrocontrollerBus Architecture)3.0及以上协议中最重要的部分,它是面向于高性能、高带宽、低延迟的片内总线。
高速内存103和输入输出接口104通过总线102与处理单元106耦接。高速内存103例如为随机存取存储器和/或只读存储器,例如高速内存103为静态随机存取存储器(SRAM)或为DRAM(动态随机存取存储器)。接口104用于在系统101与外部设备111之间进行数据转换和传输。外部设备111可以是一些输入输出设备或者存储设备。硬件部分101还可以包括用于直接访问外部存储设备的DMA控制器。
系统100还包括软件部分。如图上所示,软件部分示出了操作系统内核121和应用程序A-N。当系统运行时,操作系统内核121和应用程序A-N可通过接口104被拷贝到高速内存104中,以便于处理单元106从高速内存104中读取并执行程序指令。操作系统内核121还可以在产品出厂之前,就被硬拷贝到高速缓存103(例如只读存储器)中。
处理单元106还与处理器跟踪模块105耦接。处理器跟踪模块105是对处理器架构的扩展,它使用专用的硬件设施跟踪软件执行的信息。处理器跟踪模块105收集程序运行过程中的各种信息并按照一定格式组织成数据包输出。由于这种方式对正在跟踪的可执行程序仅有很小的性能损失,因此可利用该方式对动态生成的目标结构体进行跟踪,具体是:先由处理器跟踪模块105输出追踪数据包,然后由分析软件对数据包进行数据重构,还原出可执行程序运行的完整过程,包含程序流变化,数据访问等等,并进行数据预处理,包括信息过滤、将程序流和数据访问关联,然后预处理后的数据中获取目标结构体的跟踪信息,但是正如背景技术所指,这种方式导致分析软件需要较大的性能开销,并且需要用户对代码有全面和深刻的了解。
为了解决这一问题,本公开提供一种在可执行程序执行时追踪目标变量的技术方案,以实现对任意目标变量(包括而不限于背景技术中所述的动态生成的结构体)进行跟踪,并且无需用户对代码有全面和深刻的了解。
参考图上所示,分析程序131用于加载并解析一个可执行程序,以获得目标变量的描述信息。目标变量可以是处理器支持的任意数据类型,既可以为单一类型,例如为整型、浮点型、字符、或字符串型、指向整型、浮点型、字符、或字符串数据的指针,也可以为复合类型,例如数组、数据结构,指向数据结构的指针、类等,其中数据结构还可以是多级数据结构,例如在linux等较为复杂的操作系统中,会定义一些具有复杂结构的任务结构体,然后将一些动态生成的缓冲区、锁、状态机、配置等数据放到这种结构体中,目标变量还可以是数据结构中的某一项,例如上述任务结构体中的锁。目标变量的描述信息用于描述目标变量在一个基地址基础上的地址偏移,该基地址通常是处理器为可执行程序提供的进程空间的基地址,该基地址还可以是处理器为可执行程序提供的进程空间包含的特定区域(目标变量位于其中)的基地址。目标变量的描述信息还应该包括该基地址的获取来源,例如可从指定寄存器或某个内存地址去读取该基地址。在满足上述条件的基础上,可采用任意适宜格式组织目标变量的描述信息。
为了获得目标变量的地址偏移,需要考虑目标变量所归属的函数(或类或类方法中)和所归属的数据结构,例如对于C/C++程序,在主函数main里有个子函数func,在子函数func定义struct file*file_fp,则当希望追踪file_fp时,得到的file_fp的描述信息要考虑到函数关系(main->func)和struct file的数据结构定义。
分析程序131将描述信息和进程标识经由驱动程序1211发送给处理器追踪模块105中的控制单元1051。驱动程序1211是处理器追踪模块105的驱动程序,操作系统内核121作为沟通硬件和软件的桥梁,不仅包括处理器追踪模块105的驱动程序,还包括诸如处理单元106、内存103、存储器等其他硬件的驱动程序,还向各种应用(例如应用程序A-N)提供基础系统服务。另外,由于操作系统内核121会为每个进程维护一个进程寄存器,因此也可以由操作系统内核121将要追踪的进程标识提供给处理器追踪模块105中的控制单元1051。
控制单元1051接收描述信息和进程标识,根据进程标识和描述信息获取目标变量在进程空间中的实际地址,并根据实际地址访问得到目标变量的数据变化并可获得造成数据变化的指令流信息。处理器追踪模块105包括:指令流追踪单元1053和数据追踪单元1054,指令流追踪单元1053记录程序执行中的分支信息,从而帮助构建程序运行过程中的控制流图。数据追踪单元1054记录是记录各个内存访问地址的数据变化。
可选地,如图上所示,控制单元1051内设置触发寄存器1052,所述触发寄存器1052用于存储目标变量的描述信息,所述控制单元根据进程标识和描述信息获取目标变量在进程空间中的实际地址,当检测到实际地址指示的数据变化时,则触发指令流追踪单元1053和数据追踪单元1054,而且记录导致数据变化的所有操作并生成数据包输出给分析程序131。
分析程序131接收到数据包之后,还原出针对目标变量的所有操作信息,并可进一步地定位出导致目标变量的数据变化的操作记录,当然如果数据包只有导致目标变量的数据变化的操作记录,则可以直接得到该操作记录。
本公开实施例提供的系统,解析可执行程序以构建目标变量的描述信息并传送给处理器追踪模块,通过处理器追踪模块收集目标变量的数据变化以及造成目标变量的数据变化的指令流信息,并作为追踪信息输出,由此得到的追踪信息只是关于目标变量的,因此这样得到的追踪信息更具针对性,更能满足用户需求,而且由于本系统无需可执行程序的源代码支持,因此可用于测试和验证仅有可执行程序的软件产品的代码质量。
在一些实施例中,处理器跟踪模块105可配置为关闭或启动。可选地,在处理器跟踪模块105或处理单元106内部设置一个寄存器,在该寄存器存储一个比特的标志位,当标志位例如为0时,表示关闭处理器跟踪模块105,系统也就不产生跟踪信息,当标志位例如为1时,表示处理器跟踪模块105正常工作,该标志位还可和一个存储进程标识的寄存器关联,分析程序131可将要追踪的进程标识存储到该寄存器中,以便于处理器跟踪模块105只输出特定进程的追踪信息。
上文说过目标变量可以是处理器支持的任意数据类型,下面具体示例性地介绍几种类型和如何定义描述信息。我们知道,当可执行程序执行后,系统会为可执行为其分配一个进程空间,通常该进程空间根据功能不同划分为不同区域,例如C/C++编译的可执行程序占用的空间划分区域为:栈区(stack)、堆区(heap)、全局区(静态区)、文字常量区、程序代码区。除了堆区,其余区由编译器在编译阶段实现分配。
下面是一个非常简单的C/C++的源代码,不同类型的数据都注释了其属于的区。
因此可通过解析可执行文件获得对象在除了堆区之外的各个区的地址偏移量,例如char*p1,*p2都存储在栈上,而如果编译器将int、char、char*的数据类型都使用一个字节存储,则可以计算出b的地址偏移量为0个字节,s的地址偏移量为4个字节,p1的地址偏移量为8个字节。
也就是说,分析模块能够通过解析可执行程序得到每个目标变量的地址偏移。当处理器跟踪模块105接收到进程标识和目标变量的地址偏移时,根据进程标识获可执行程序的进程空间或者可执行程序的进程空间中特定区域(例如堆栈区)的首地址,再根据地址偏移计算出目标变量的实际地址,并读取该实际地址的数据以及收集造成数据变化的指令流信息,例如,处理器追踪模块105在追踪p1指向的字符串空间的数据变化时,需要从实际地址内获取字符串空间的地址,并获得该地址内的数据变化情况以及收集造成数据变化的指令流信息。
在实际工程中,源代码不会向上述示例这么简单,目标变量也更加复杂。在一个实施例中,在处理器追踪模块105中设置触发寄存器(PC trigger寄存器),用于存储目标变量的描述信息。可以由分析模块131根据每个目标变量的地址偏移向触发寄存器按照规定的格式写入该目标变量的描述信息,也可以由控制单元1051根据每个目标变量的地址偏移向触发寄存器按照规定的格式写入该目标变量的描述信息。
在实际工程中,触发寄存器的数据格式有很多设计。图2所示为其中一种。在图2中,规定了R、A、C和L四个标志位以及OFF指定的地址偏移量。四种标志可采用一个比特(bit)存储,其值可置为1或0,OFF可采用32比特或64比特存储。其中R置为1时表示从指定进程寄存器中获取基地址,A置为1时表示基于指定内存获取基地址。由于编译器在将源代码编译为可执行程序时,可指定将可执行程序在运行时其进程空间或者进程空间包含的特定区域的基地址存放在进程寄存器中,或者存放在指定内存中,因此,如果编译器指定可执行程序在运行时其进程空间或者进程空间包含的特定区域的基地址存放在进程寄存器中,则将R置为1,如果编译器指定可执行程序在运行时其进程空间或者进程空间包含的特定区域的基地址存放在指定内存中,将A置为1。C表示是否只对该级目标进行跟踪(0表示是,1表示否)。L表示是否有下一级链接地址的存在(0表示否,1表示是)。
图2中给出了四个示例。第一个示例为:R=1,OFF=+1024(相当于R=1,A=0,C=0,OFF=+1024),则处理器追踪模块105首先通过进程寄存器(TP)获取进程空间或者进程空间包含的特定区域的基地址,之后(+1024)获取要追踪的目标变量。
第二个示例为:A=1,OFF=+64(相当于R=0,A=1,C=0,L=0,OFF=+64),则处理器追踪模块105首先通过指定内存地址获取进程空间或者进程空间包含的特定区域的基地址,之后(+64)获取要追踪的目标变量。
第三个示例为:A=1,OFF=+32(相当于R=0,A=1,C=0,L=0,OFF=+32),则处理器追踪模块105首先通过指定内存地址获取进程空间或者进程空间包含的特定区域的基地址,之后(+32)获取要追踪的目标变量。
第四个示例为:A=1,C=1,L=1,OFF=+64(相当于R=0,A=1,C=1,L=1,OFF=+64),则处理器追踪模块105首先通过指定内存地址获取进程空间或者进程空间包含的特定区域的基地址,之后(+32)获取要追踪的目标变量,由于C表示不仅对该级目标而且要对该级目标的下一级目标进行跟踪,而L表示有下一级链接地址的存在,因此将基于基地址+32获取当前一级的目标变量,然后在追踪目标时,不仅追踪当前一级的目标变量,而且从当前一级的目标变量取出数据作为要追踪的下一级的目标变量。
下面继续结合图2所示的触发寄存器的数据格式的设计与下述C/C++源代码进行示例说明。
struct process{
int pid;
struct task*child;
int cpu;
};
struct task{
int tid;
struct task*next;
struct spin_lock*rq_lock;
};
struct spin_lock{
int lock;
};
int main{
struct*process*a;//变量a
a=(struct*process)malloc(sizeof(struct process));//申请空间
a->child=(struct*task)malloc(sizeof(struct task));//申请空间
}
假设在上述C/C++的源代码对应的可执行程序运行时,要追踪的目标变量为rq_lock。
那么需要向触发寄存器内写入的数据如下所示:A=1,C=1,L=1,OFF=offset1。其中offset1的计算步骤如下所示:首先需要根据数据结构struct process计算structtask*child在struct process的第一偏移量,然后根据数据结构struct task计算rq_lock在struct task中的第二偏移量,将第一偏移量和第二偏移量相加得到offset1。如此,当根据该示例追踪目标变量时,其步骤如下所示:处理器追踪模块105首先通过进程寄存器(TP)获取进程空间或特定区域的基地址,之后通过offset1获取rq_lock,然后追踪rq_lock以及rq_lock下一级的目标变量。
图3是本公开实施例提供的方法的流程图。该流程图包括步骤S301-S304。其中步骤S301-S302可由包括操作系统的软件程序执行。步骤S303-S304则由硬件的处理器追踪模块执行。
步骤S301是解析可执行程序,以获得目标变量的描述信息,所述描述信息描述了所述目标变量所属区域的基地址的获取来源以及所述目标变量在所属区域的地址偏移。
步骤S302是在可执行程序执行时,发送可执行程序的进程标识和描述信息。
步骤S303是读取描述信息,根据其中的读取方式和可执行程序的进程标识获取目标变量所属区域的基地址。
步骤S304是根据目标变量所属区域的基地址和地址偏移计算实际地址,并根据实际地址从进程空间中读取目标变量的数据变化并收集造成数据变化的指令流信息。
在本实施例中,目标变量由用户指示确定,例如用户指示一种数据类型,则目标变量为归属于该数据类型的所有变量,或者用户可以指定一个函数,再例如用户输入正则表达(例如fp*,表示所有以字符fp开头的变量)。
在本实施例中,软件程序在加载和解析可执行程序时,通过查找函数、查找数据结构、查找变量路径等一系列的操作,分别获得目标变量所在的函数,目标变量所在的数据结构,目标变量在所在数据结构中的地址偏移,并基于这些信息构建目标变量的描述信息并将构建好的描述信息存储到硬件的处理器追踪模块的触发寄存器中。其中,由于编译器在编译时会基于配置将进程空间或者进程空间的特定区域的基地址放在进程寄存器或指定的内存地址,因此描述信息中需要指定从进程寄存器还是从指定的内存地址获取进程空间或者进程空间的特定区域的基地址。
在本实施例中,硬件的处理器追踪模块在发现触发寄存器中有新数据后,根据新数据中的相应标志和进程标识从相应的进程寄存器或者从指定的内存地址获取进程空间或者进程空间的相应区域的基地址,然后将基地址加上地址偏移得到要访问的地址,然后监测该地址指示的数据变化,并收集导致数据变化的指令流信息。
在实际工程中,描述信息可采用多种格式表征。在本公开实施例中,提出一个例如图2所示的设定格式,在该设定格式中,包括四种标志R、A、C和L以及一个偏移量OFF,所述四种标志R、A、C和L中的每个标志都可采用一个比特(bit)存储,其值可置为1或0,OFF可采用32比特或64比特存储。其中R置为1时表示从进程寄存器中获取基地址,A置为1时表示基于指定的内存地址获取基地址。由于编译器在将源代码编译为可执行程序时,可指定可执行程序在运行时其进程空间(或者进程空间包含的不同区域)的基地址存放在进程寄存器中,也可以指定存放在指定内存地址,因此,如果编译器指定可执行程序在运行时其进程空间(或者进程空间包含的特定区域)的基地址存放在进程寄存器中,则将R置为1,如果编译器指定可执行程序在运行时其进程空间(或者进程空间包含的不同区域)的基地址存放在指定的内存地址中,将A置为1。C表示是否只对该级目标进行跟踪(0表示是,1表示否)。L表示是否有下一级链接地址的存在(0表示否,1表示是)。
在一些实施例中,目标变量的数据类型包括:数值型、字符型、数据结构、类、指向数据结构或类的指针。
在一些实施例中,所述解析可执行程序包括以下操作:确定目标变量所在的函数路径;确定目标变量相关的数据类型定义;根据函数路径和数据类型定义构建所述描述信息。如果目标变量的数据类型为多级数据结构,则根据多级数据结构的定义确定到达目标变量的路径信息,并在描述信息中体现多级数据结构的各个级的地址偏移。
由于本公开提供的在可执行程序执行时追踪目标变量的方法和系统是对应的,因此在文中以相对简单的方式介绍方法的各个实施例。
本公开实施例提供的处理器的具体应用
图4示出了本公开实施例所应用的通用的计算机体系结构。如图上所示,计算机系统400可以包括一个或多个处理器12,以及存储器14。其中,上述实施例提供的处理器101作为处理器12。
计算机系统400中的存储器14可以主存储器(简称为主存或内存)。用于存储由数据信号表示的指令信息和/或数据信息,例如存放处理器12提供的数据(例如为运算结果),也可以用于实现处理器12与外部存储设备16(或称为辅助存储器或外部存储器)之间的数据交换。
在一些情形下,处理器12可能需要访问存储器14,以获取存储器14中的数据或对存储器14中的数据进行修改。由于存储器14的访问速度较慢,为了缓解处理器12与存储器14之间的速度差距,计算机系统400还包括与总线11耦合的高速缓冲存储器18,高速缓冲存储器18用于对存储器14中的一些可能会被反复调用的程序数据或者报文数据等数据进行缓存。高速缓冲存储器18例如由静态随机存储器(Static Random Access Memory,简称为SRAM)等类型的存储装置实现。高速缓冲存储器18可以为多级结构,例如具有一级缓存(L1Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)的三级缓存结构,也可以是三级以上的缓存结构或其他类型缓存结构。在一些实施例中,高速缓冲存储器18的一部分(例如一级缓存,或一级缓存和二级缓存)可以集成在处理器12内部或与处理器12集成于同一片上系统中。
基于此,处理器12可以包括指令执行单元121、内存管理单元122等部分。指令执行单元121在执行一些需要修改内存的指令时发起写访问请求,该写访问请求指定了需要写入内存中的写入数据和相应的物理地址;内存管理单元122用于将这些指令指定的虚拟地址转译为该虚拟地址映射的物理地址,写访问请求指定的物理地址与相应指令指定的物理地址可以一致。
存储器14和高速缓冲存储器18之间的信息交互通常按块来组织。在一些实施例中,高速缓冲存储器18和存储器14可以按照相同的空间尺寸被划分成数据块,数据块可以作为高速缓冲存储器18和存储器14之间的数据交换的最小单位(包括预设长度的一个或多个数据)。为了表述简洁清晰,下面将高速缓冲存储器18中的各个数据块简称为缓存块(可以称为cacheline或高速缓存线),且不同的缓存块具有不同的缓存块地址;将存储器14中的各个数据块简称为内存块,且不同的内存块具有不同的内存块地址。缓存块地址例如包括用于定位数据块的物理地址标签。
由于受到空间和资源的限制,高速缓冲存储器18无法对存储器14中的全部内容都进行缓存,即高速缓冲存储器18的存储容量通常小于存储器14,高速缓冲存储器18提供的各个缓存块地址无法对应存储器14提供的全部内存块地址。处理器12在需要访问内存时,首先经总线11访问高速缓冲存储器18,以判断所要访问的内容是否已被存储于高速缓冲存储器18中,如果是,则高速缓冲存储器18命中,此时处理器12直接从高速缓冲存储器18中调用所要访问的内容;如果处理器12需要访问的内容不在高速缓冲存储器18中,则高速缓冲存储器18,处理器12需要经总线11访问存储器14,以在存储器14中查找相应的信息。因为高速缓冲存储器18的存取速率非常快,因此当高速缓冲存储器18命中时,处理器12的效率可以显著提高,进而也使整个计算机系统400的性能和效率得以提升。
此外,计算机系统400还可以包括存储设备16、显示设备13、音频设备19、鼠标/键盘15等输入/输出设备。存储设备16例如是通过相应接口与总线11耦合的硬盘、光盘以及闪存等用于信息存取的设备。显示设备13例如经相应的显卡与总线11耦合,用于根据总线11提供的显示信号进行显示。
计算机系统400通常还包括通信设备17,因此可以通过各种方式与网络或其他设备通信。通信设备17例如可以包括一种或多种通信模块,作为示例,通信设备17可以包括适用于特定的无线通信协议的无线通信模块。例如,通信设备17可以包括WLAN模块,用于实现符合电气和电子工程师协会(IEEE)制定的402.11标准的Wi-FiTM通信;通信设备17也可以包括WWAN模块,用于实现符合蜂窝或其他无线广域协议的无线广域通信;通信设备17还可以包括蓝牙模块等采用其它协议的通信模块,或其它自定义类型的通信模块;通信设备17也可以是用于串行传输数据的端口。
当然,不同的计算机系统根据主板、操作系统和指令集架构的不同,其结构也可能有所变化。例如目前很多计算机系统设置有连接在总线11和各个输入/输出设备之间的输入/输出控制中心,且该输入/输出控制中心可以集成于处理器12之内或独立于处理器12。
上述计算机系统还包括未示出的各种软件,例如计算机操作系统和各种应用程序,而用于实施本公开提供的方法的程序包括在上述计算机系统中。
图5是本公开实施例所应用的嵌入式系统的结构图。上述实施例提供的处理器101可用作处理器501。
虽然嵌入式系统在硬件结构上与计算机系统具有高度相似性,但是嵌入式系统应用上的特点致使嵌入式系统在硬件的组成和实现形式上与通用计算机系统又有较大区别。
首先,为满足嵌入式系统500在速度、体积和功耗上的要求,操作系统、应用软件、特殊数据等需要长期保存的数据,通常不使用磁盘这类具有大容量且速度较慢的存储介质,而大多使用随机存储器502或闪存(Flash Memory)503。
另外,在嵌入式系统500中,需要A/D(模拟/数字转换)接口505和串行接口506,用于测控的需要,这在通用计算机中用得很少。A/D接口505主要完成测试中所需要的模拟信号到数字信号的转换、和数字信号到模拟信号的转换。嵌入式系统500应用于工业生产时经常需要测试。由于单片机产生的是数字信号,在测试时需要转换成模拟信号用于测试,因此,与通用计算机不同,需要A/D(模拟/数字转换)接口505完成相关转换。另外,工业中经常需要多个嵌入式系统串接在一起,完成相关功能,因此需要用于将多个嵌入式系统串联的串行接口506,而在通用计算机中则大多不需要。
另外,嵌入式系统500作为一个基本的处理单元,常常在工业设计中需要将多个嵌入式系统500联成网络,因此需要将嵌入式系统500联入网络的网络接口507。这在通用计算机中大多也不需要。此外,根据实际应用和规模的不同,有些嵌入式系统500要采用外部总线504。随着嵌入式系统500应用领域的迅速扩张,嵌入式系统500越来越趋于个性化,根据自身特点采用总线的种类也越来越多。另外,为了对嵌入式处理器501内部电路进行测试,处理器芯片普遍采用了边界扫描测试技术。为了适应该测试,采用了调试接口508。
随着超大规模集成电路(Very Large Scale Integration)和半导体工艺的迅速发展,上述的嵌入式系统的部分或者全部可实现在一个硅片上,即为嵌入式片上系统(SoC)。
上述嵌入式系统还包括未示出的各种软件,例如嵌入式操作系统和各种应用程序,而用于实施本公开提供的方法的程序包括在上述嵌入式系统中。
本公开实施例的商业价值
本公开实施例提供的系统和方法有应用场景,主要用于测试各种不具有源代码的应用程序和操作系统内核,可有针对性地完成其中的目标变量的追踪,因此该系统和方法具备了商业价值和经济价值。
可以采用一个或多个计算机可读介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如但不限于为电、磁、光、电磁、红外线或半导体的系统、装置或器件,或其他任意以上的组合。计算机可读存储介质的更具体的例子包括:具体一个或多个导线的电连接,便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或者闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器、磁存储器或者上述任意合适的组合。在本文中,计算机可读的存储介质可以是任意包含或存储程序的有形介质,该程序可以被处理单元、装置或者器件使用,或者与其结合使用。
计算机可读信号介质可以包括在基带中或者作为截波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或者其他任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质之外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令系统、装置或器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、电线、光缆、RF等等,以及上述任意合适的组合。
可以以一种或者多种程序设计语言或者组合来编写用于执行本公开实施例的计算机程序代码。所述程序设计语言包括面向对象的程序设计语言,例如JAVA、C++,还可以包括常规的过程式程序设计语言,例如C。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络包括局域网(LAN)或广域网(WAN)连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
以上所述仅为本公开的优选实施例,并不用于限制本公开,对于本领域技术人员而言,本公开可以有各种改动和变化。凡在本公开的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。