一种动态探针方法及其在嵌入式系统中的应用的制作方法

文档序号:6571997阅读:395来源:国知局
专利名称:一种动态探针方法及其在嵌入式系统中的应用的制作方法
技术领域
本发明属于计算机性能分析技术。具体地说,本发明涉及一种基于动态探测技术的动态探针实现方法,以及动态探针在嵌入式系统中的应用,以动态收集嵌入式系统的性能信息。
背景技术
随着嵌入式技术的发展,嵌入式应用的不断增长以及嵌入式系统复杂性不断提高,导致嵌入式软件的规模和复杂性也不断提高,有限的硬件资源和功能越来越强的需求依然是嵌入式软件开发领域的主要矛盾,嵌入式软件必须做到精简高效、稳定可靠。嵌入式软件的质量和开发周期对产品的最终质量和上市时间起到决定性的影响,这使得嵌入式软件的开发、分析与测试成为了研究的热点,而上述问题的基础在于对嵌入式系统性能信息的探测和收集。如何设计和实现一种新的性能信息探测和收集方法,完整准确高效收集嵌入式系统的性能信息已经迫在眉梢。
从性能数据的收集方式的角度来分类,可将目前主流的性能数据收集方式分成两大类,采样技术和探测技术。其中探测技术又分为静态探测技术和动态探测技术。
使用采样技术测量系统性能,首先需要周期性中断应用程序,获取当前程序计数器的值,累计一段时间之后,通过统计分析就可以得到有关性能的精确结果,从而知道程序的热点所在。这种性能测量的方法很简单,不需要增加额外的探测代码,而且对系统的性能干扰很少。目前市场上覆盖测试工具gcov,性能分析工具gprof、VTune等工具都是系统级或者用户级的采样工具。采样技术实现简单,但是存在一定的缺陷。首先,采样技术建立在中断机制的基础之上,不精确的中断机制将会导致不能正确分配指令引起的事件,导致采样失真;其次,采样的量度是固定的,使得采样受限制于采样点,仅仅适合于针对某一特殊目的的有限的性能分析;采样的时间标准受限制,因而只能反映采样进程活跃的时间,当发生了进程切换的时候,时间记录有可能被误记。采样是定时执行的,需要额外访问系统的定时器,且频繁使用中断,开销较大。采样只能描述统计信息,提供系统快照,无法刻画进程间交互信息,不能理解和观测系统动态状况。
静态探测技术通常是直接在程序源代码中的特定位置插入显式的测量代码,以生成性能信息。使用这种方法获取性能信息时,需要重新对程序的源代码进行编译,然后运行新编译的源程序。在程序性能分析的过程中,静态探测方式首先将用于性能分析的补丁代码添加进应用程序源代码,然后重新配置编译源码,之后运行编译生成的可执行程序,程序运行之后就可获得性能分析信息。著名的内核探测工具LTT(Linux Trace Toolkit)就是采用静态探测技术实现的。静态探测技术通常是生成永久保存的性能信息文件以搜集性能数据,方便和利用其他的数据分析工具进行分析。但是静态探测技术存在一些问题。首先,添加增量代码添加了代码开销和执行开销,当探测不断需要精确化的时候,总是需要重新编译和运行应用程序。而且为了避免开销过大,不适宜定义过多的探测点。因此记录事件的范围收到了限制,记录信息的全面性和详细性都有所欠缺,不能完全反应系统行为。静态探测的方法在灵活性上也有所缺乏,他探测的需求变化的时候,需要对探测操作进行重新定义。
与静态探测技术不同,采用动态探测方式对系统性能数据进行采集的时候不需要对程序的源代码预先修改,编写应用程序的时候不需要考虑将来做性能分析时是否要插入动态探测点,即探测点的定义、插入和删除等等的操作和应用程序源码的编写完全无关。在进行性能分析的时候,使用某种方式记录需要插入探测点的地址以及对应该探测点所定义的处理方式,程序源代码不需要做任何的改动。只有当被测试程序调入系统内存中准备运行的时候,才利用相关的技术,动态修改代码,从而达到收集相关信息的目的。IBM的Dprobes技术就是采用动态探测技术,在执行代码的模块中动态插入软件探针以收集相关信息。动态探测技术克服了静态探测技术的缺点,但是完全采用动态探测机制时,激活大量的探测点需要很大的开销,而且动态探测机制对正确性的要求很高,一旦误用,会导致系统的崩溃。
而对于嵌入式系统的性能分析技术上,目前嵌入式性能分析大多采用采样方式或者静态探测的方法收集性能数据。

发明内容
本发明的目的在于克服现有技术的不足,提供一种动态探针的方法,提高数据收集的正确性、精确性以及完备性,使之能高效、稳定地运行目标机平台。
本发明的另一目的在于提供一种动态探针在嵌入式系统中的应用。
本发明所要解决的技术问题是设计一种新型的嵌入式动态探针并将之高效实现,将其应用在嵌入式的性能分析工具中。主要目标是实现嵌入式目标机性能数据的动态收集,满足嵌入式性能分析需求。
为了实现发明目的一,采用的技术方案如下一种动态探针方法,在被测程序运行时采用断点机制将探针插入到被测程序中;具体实现过程为首先确定探针的插入位置,在插入位置处用探针调用指令替换原有的指令,然后执行探针指令,等待探针动作完成之后,再执行插入位置处的原指令。
上述技术方案中,所述探针包括嵌入式动态探针管理器和嵌入式动态探针库;所述嵌入式动态探针管理器负责探针的定义、注册、查询、删除,所述嵌入式动态探针库存储已定义的探针。
本发明的动态探针方法以断点机制为基础,当处理器执行断点指令的时候,将产生断点异常,将控制权限转移到异常处理程序。动态探针利用动态指令替换技术,用断点指令替换要调试的特定地址的指令,程序执行到断点指令的时候,将触发断点异常。此时,经过修改的断点中断处理程序会及时通知调试器,检查断点发生的地址,搜索断点处对应的断点处理过程等等。采用这种技术,探针将完全动态插入到内存代码中,定义、插入和删除探针的探针操作的编写和应用程序源代码的编写完全无关。即应用程序的开发人员在编写程序源代码的过程中完全不需要考虑在程序运行的时候是否要插入动态探针,使用动态探针的时候也不需要修改程序的源代码。
在不同体系结构的处理器中,使用不同的断点指令。IA-32的体系结构中,采用INT3断点指令,在ARM体系结构中,使用Break断点指令。断点的处理方法可由用户定义。调试器不做任何的代码修改动作,只是采用特定的方法记录需要插入的探针地址和对应的探针处理程序。当被调试的程序加载进内存,并且准备执行的时候,调试器要插入探针地址处的内容被保存,将其替换成断点指令。程序运行中,当执行到断点的位置的时候激活中断,经过修改的中断处理程序将判断出断点的位置,将控制权限交给调试器,以执行与此探针对应的探针处理程序。执行完毕之后再用原来的指令替换掉断点指令,或者模拟执行原有的指令,然后进行后续的处理。探针可以多次被触发,即在原指令执行完毕的时候可以再次使用断点指令进行替换。
为了实现发明目的二,采用的技术方案如下一种动态探针方法在嵌入式系统中的应用,具体应用过程为在嵌入式系统的被测程序运行时,采用断点机制将探针插入到被测程序例程,以无干扰地收集嵌入式系统的详细性能信息。
上述技术方案中,所述收集嵌入式系统的详细性能信息通过由探针对被测程序运行时的相关信息进行探测所实现。
本发明在嵌入式系统中的应用引用动态探测思想,在嵌入式程序运行的同时动态探测和收集嵌入式系统的相关信息。这样进行探测和数据收集的效率明显提高,数据的精确性和完备性得到较大改善。
本发明动态探针方法在嵌入式系统中的应用提出了若干关键实现技术1、指令替换技术为了实现探针在程序运行的同时动态插桩,进行数据的探测和收集,本发明采取指令替换技术实现动态探针的插入。插入断点、监控上下文信息、当断点被触发的时候转储特定的数据区。当被调试的程序加载进内存,并且准备执行的时候,调试器要插入探针地址处的内容被保存,将其替换成断点指令。程序运行中,当执行到断点的位置的时候激活中断,经过修改的中断处理程序将判断处断点的位置,将控制权限交给调试器,以执行与此探针对应的探针处理程序。执行完毕之后再用原来的指令替换掉断点指令,或者模拟执行原有的指令,然后进行后续的处理。
2、动态探针的插装策略探针插桩策略是指探针植入的位置。在本发明中,为了满足嵌入式开发的需求,按照探针完成的任务划分,可以探针的策略分成七种类型函数探针、基本块探针、分支探针、断言探针、时间探针、变量跟踪探针和系统信息跟踪探针。每种类型的探针采用特定的插装策略,动态探测嵌入式系统的相应信息。
3、动态探针的类型在本发明中,针对嵌入式开发的需求,设计两类十四种动态探针函数,用以在嵌入式开发中动态探测各种类型的信息。其中一类为跟应用程序信息相关的探针,主要有函数插桩探针函数、块插桩探针函数、分支插桩探针函数、时间插桩探针函数、断言插桩探针、字符变量插桩探针函数、整型变量插桩探针函数、长整型变量插桩探针函数、浮点变量插桩探针函数、双精度浮点变量插桩探针函数、长双精度浮点变量插桩探针函数。另一类为跟探测系统信息相关的探针有CPU探针、I/O探针、内存探针。
在设计嵌入式动态探针的时候,既不能影响探针本身的特性,包括动态性和执行效率,而且要注意符合跟踪的需求;既要提高使用效率,又要方便探针的管理。本发明针对如下基本原则,设计和实现嵌入式动态探针1、保持动态性嵌入式动态探针的基本特性是动态性,在设计时的前提条件时保持其动态的特性。探针的动态性是指在运行的程序中放置探针的能力,探针的插入不需要修改程序的源代码,而是将嵌入式探针插入以加载的运行的代码中,并覆盖探针地址处的指令,原指令在探针处理结束之后被模拟执行。若探针没有被激活,则系统运行没有任何改变,系统的性能不受任何的影响。
2、记录日志嵌入式探针根据跟踪机制的要求,主要用于记录特定代码处的事件日志信息。因此,定义的标准动态探针模块需要将探针处理程序和记录的具体时间相绑定,用户使用的时候不要额外编写,只需要提供相应的入口地址就可以注册插入。
3、消除依赖性探针处理程序设计成中断处理程序一样运行。这需要最大限度的减少探针处理接口对系统接口和资源的依赖性,并容易从潜在的致命错误中恢复。探针的放置位置不受限制,探针处理程序执行的时间不受限制,如果探针放置到错误的位置,该探针能被探测到并且被自动移除,不影响系统的正常运行。
本发明的动态探针可以放置在任何的位置,包括被测应用程序和第三方应用中。第三方程序包括操作系统内核模块,动态共享库,应用程序等等。探针的设置全局有效,并且能够与其他的调试器配合使用。若探针方式在可执行程序中,则探针在所有此程序的实例中活跃;若探针放置在动态共享库中,则探针在所有应用此共享库的进程上下文中活跃;甚至在处理调试器控制之下的进程实例中的探针都是有效的。被激活的探针对当前驻留在物理内存中虚地址空间中的任何区域都拥有读和写的权限。
对比现有嵌入式性能分析工具的数据采集方法,本发明所述的嵌入式动态探针的最显著特色是数据动态收集,而且灵活性高,方法简便,易于实现。实验结果表明,采用嵌入式动态探针收集的数据正确性、准确性和完备性都较好。
和IBM的动态探针Dprobes相比,本发明所述的嵌入式动态探针有以下几个特点首先,IBM的Dprobes主要应用于单机环境下的探测,本发明所描述的动态探针是针对于嵌入式开发的特点及需求设计的,适用于嵌入式交叉开发的特殊要求。探针的源代码经过交叉编译后生成探针二进制程序,然后通过串口、JTAG或者网络的方式下载到嵌入式平台上,在嵌入式平台上执行动态探测的任务。
其次,由于本发明的探针植入基于断点机制,故而本发明所描述的嵌入式动态探针的适用范围比Dprobes更加广泛。IBM的Dprobes只能应用于X86体系结构的计算机上,而本发明所述的动态探针可以应用到任何体系结构的嵌入式平台上,不但包括X86体系结构,还包括ARM,MIPS及51等常见的嵌入式处理器的体系结构。探针的使用者只需了解待开发的嵌入式平台相应的断点指令即可。
再次,本发明所描述的嵌入式动态探针比Dprobes更加灵活。Dprobes探测到的信息的种类是固定的,不能更改。而本发明中设计的嵌入式动态探针可以根据需求定制不同类型的探针以收集特定的信息。这样,本发明中所描述的动态探针可以应用在嵌入式性能分析工具、嵌入式覆盖测试工具的数据收集和探测中。
最后,本发明所描述的嵌入式动态探针探测到的信息比Dprobes更加全面。IBM的Dprobes一般应用于内核信息的探测和收集,而本发明的嵌入式动态探针不但可以探测嵌入式系统的信息,还能够探测嵌入式应用程序运行时的相关信息。


图1为嵌入式动态探针运行过程示意图;图2为嵌入式动态探测框架EM-DDF结构图;图3为嵌入式探针EM-DP结构组成图;图4为嵌入式探针插入过程示意图;图5为嵌入式探针的处理过程示意图。
具体实施例方式
下面结合附图,对本发明的具体实施做进一步的详细描述。
嵌入式动态探针工作流程如附图1所示原先程序的执行过程表现为一系列的顺序指令流。使用探针必须首先确定探针点,即探针插入的位置。确定探针点之后,在探针点处用探针调用指令替换探针点处原有的指令,然后执行探针指令。等待探针动作完成之后,需要执行探针点处的原指令,然后继续执行原先应用程序探针点之后的指令流。
为了对应用程序进行探测,要建立相应的探测模型和探针模型。探测模型负责系统模块划分“线性块”和“探针”设计;探针模型负责探针初始化、相关信息获取、测试信息记录。
探测模型为T={MB,PD},其中,T为探测模型,MB为程序模块线性块过程,PD为探针模型。探针模型为PD={PI,PT,PW},其中PI为探针初始化过程,PT为探针信息获取过程,PW为探针收集信息记录过程。
在对程序进行探测时,首先将程序划分为各个线性块,然后为线性块声明探针变量,为探针变量赋初值;探针初始化执行测试信息获取,当有错误发生时,保护局部现场、探针目标定位和目标类型的识别等;最后把探针测试结果记录起来,修改探针变量,恢复现场。
探针变量以矩阵PMB表示,其中M为系统划分的模块数,在具体应用程序系统中,M为各模块事件过程和函数之和的最大值;B为各个模块划分线性块分支数的最大值。
本发明中的采用动态探测技术,建立嵌入式动态探测框架EM-DDF。EM-DDF的主要目标是获得详细的性能数据。在系统中设置探测点,对程序的运行情况进行跟踪,为开发者提供性能数据,以达成其消除热点和瓶颈的目标。因此EM-DDF立足于在系统中设置跟踪探测点,以获得程序运行时的性能信息。
如附图2所示EM-DDF提供了强行进入任何应用程序例程无干扰地收集信息的接口,使用它可以轻松地收集处理器寄存器和全局数据结构等调试信息,用户也可以利用它执行自己编写的指令收集需要的信息。它的核心包括动态探针管理器DPM(Dynamic Probes Manager)和动态探针事件处理器DPEH(Dynamic Probes Event Handler)。其中DPM负责接受探针的注册或者注销请求,将每一个探针定义保存到动态探针对象DPO(Dynamic Probe Object)中,DPO是用于描述探针的对象,其中也包含一些处理指令。无论何时在内存中加载包含探针模块的页,都将插入探针,重新加载作废页时,探针也将再次插入;DPEH中包含当激活探针时需要执行的具体指令,完成对断点中断的具体响应。EM-DDF为插入动态探针设计了三个函数预处理函数pre-handler,它在执行被调试内存地址处的指令之前执行;后处理函数post-handler,它在被调试指令执行之后执行;错误处理函数error-handler,它在指令出错时执行。该探测框架除了支持跟踪时动态编写探针模块之外,还支持嵌入式动态探针EM-DP,它是根据嵌入式性能分析的需求预先编写的标准探针,可以直接使用。
如附图3所示,嵌入式探针EM-DP(Embedded Dynamic Probes)由两个部分构成,分别是嵌入式动态探针管理器(EDPM)和嵌入式动态探针库(EDPL)。
其中,嵌入式动态探针管理器是整个嵌入式动态探针的核心部分,它负责探针生命周期中的任何工作,包括探针的查询,探针的定义,探针的删除,并向整个探测机制的DPM进行探针注册。
用户可以通过动态探针接口提交探针注册请求,它和EDPM模块通信,如果用户需要插入的探针已存在于探针库中,EDPM将直接向动态探测机制中的DPM注册,否则,就通过EDPM定义探针,首先生成标准探针,并将其保存至探针库中,然后再到DPM中进行注册。
嵌入式动态探针库中包含各种类型的嵌入式探针,如线性块探针、分支探针、模块探针、I/O探针、时间探针、同步互斥探针等。这些探针通过EDPM进行创建。每一个探针都包括有三个处理函数,分别是X_pre_handler()、X_post_handler()以及X_error_handler()。这三个处理函数分别在断点插入指令之前,之后以及指令出错时执行。每个探针都拥有其唯一性的标志-探针标识符。当探针被创建的时候,并不将探针装配进系统,而是返回一个探针标识符,并且将其探针标识符保存进探针库中,以便将来使用。探针库中的关键部分是一张探针登记表,该表中记录了探针对应的函数名、探针标识符、探针事件处理程序以及其他一些索引信息。这样方便可EDPM进行探针查询和动态探针事件处理器(DPEH)在响应断点的时候执行具体的操作。
使用嵌入式动态探针的时候,通过em-dprobe数据结构描述动态探针,它保存了探针插入的位置、探针的三个处理函数pre_handler、post_handler以及error_handler,并且形成注册探针链表。em-dprobe具体描述如下struct em-dprobe{
struct list_head list;
char*addr;
char*pre_handler;
char*post_handler;
char*error_handler;
char opcode;
char insn[MAX_INSN_SIZE];
};
其中各个参数的说明如下list表示所有打开的探针形成的链表;addr表示探针即将插入的位置;pre_handler表示指定的预处理函数的位置;post_handler表示指定的后续处理函数的位置;error_handler表示出错处理函数的位置;opcode表示要替换的指令;insn[MAX_INSN_SIZE]表示原来的指令。
为了配合嵌入式动态探针管理器的要求,方便探针的管理和查询工作,设计数据结构mprobe,保存已经存在的探针。mprobe的定义如下所示struct mprobe{int p_index;
char*f_name;
int p_flags;
char*pre_handler;
char*post_handler;
char*error_handler;
};
其中各个参数的说明如下p_index记录该探针在探针索引表中的索引值;f_name记录探针对应的探针函数名称表明探针记录的跟踪事件的内容;p_flags标志探针是否是自定义的;pre_handler表示指定的预处理函数的位置;post_handler表示指定的后续处理函数的位置;error_handler表示出错处理函数的位置;使用嵌入式动态探针,在探针插入时需要判断该探针是否已经存在与探针库中。如果是,则提供地址入口就可以直接注册插入;若不是,由EDPM生成新的探针之后,再进行注册。嵌入式探针列表由EDPM负责管理和维护。定义三个函数find_probe()、add_probe()和delete_probe(),分别完成现有探针查找、添加用户自定义探针和删除用户自定义探针的动作。
探针插桩策略是指探针植入的位置。一般的说,探针在程序的以下位置插桩1、程序的入口和出口处;2、基本块的入口和出口处;3、转移指令之前,如goto、continue、break、return语言之前;4、标号语句之前,如LABLE具体的,对于嵌入式动态探针库的不同的探针有着不同的插桩策略。按照探针完成的任务划分,可以探针的策略分成七种类型函数探针、基本块探针、分支探针、断言探针、时间探针、变量跟踪探针和系统信息跟踪探针。
函数探针在每个函数的第一块开始处植入该探针,如果函数被选为插桩,则返回1,否则返回0。另外,对于main()函数还负责创建数据跟踪文件。
基本块探针为了提高效率,采用了以基本块单位的语句插桩。一个基本块只插桩一次。探针能否被触发,取决于基本块所在的函数被插桩,即基本块所在函数的“函数探针”返回1,同时该语句所在的块被执行。
分支探针在C语言中,分支结构分为if、if-else、while、do-while、for几种结构。无论哪种分支结构都含有条件判定,而分支探针则是对条件表达式的值进行跟踪。分支探针在上述语句时被植入。
断言探针断言表现为一逻辑表达式,因此断言探针只需在断言设置位置的下一语句首部植入以断言为内容的逻辑表达式。如果该断言所在的语句被执行,则断言探针向数据跟踪文件中写入1或0。
变量跟踪探针变量跟踪支持了所有C语言的原子类型变量,但在变量跟踪探针上化归为6类数据类型。变量跟踪探针使用的默认条件是,变量必须在声明后的某处被跟踪。实现变量跟踪的方法是在跟踪处向植入变量跟踪探针函数。
时间探针在指明时间跟踪的地方,植入时间探针函数以截获的系统时间。
系统信息跟踪探针在程序开始的地方植入系统信息跟踪探针,在程序运行的过程中全程跟踪获取系统信息。
插入探针的过程如附图4所示嵌入式动态探针在被调用时注册,并在调用完成时注销。因此,构造函数init_probe()和exit_probe()。init_probe()函数完成注册初始化,它首先填写em-dprobe结构,然后调用register_em-dprobe()进行探针注册,并将所有已注册的探针形成一个探针链表。exit_probe()则取消注册探针。
探针注册主要通过register_em-dprobe()函数完成。该函数的核心是em-dprobe用断点指令替换需插入探针内存地址处相应的指令,而原来的指令将被保存。函数执行过程如下首先在探针链表中增加新的探针节点;其次保存原地址处的指令;用断点指令进行指令替换工作;最后返回。
探针的注销工作由unregister_em-dprobe()函数完成,该函数主要的工作就是从探针链表中删除节点。
探针的注册和注销都是需要操作探针链表,因此必须互斥的进行,保持注册和注销操作的原子性,以免发生错误。
在探针注册之后,注册函数register_em-dprobe()使用断点指令替换原有的指令,当程序控制达到断点的地址时,执行断点异常处理。原有的断点异常处理程序被探针修改。此时,将检查在断点的地址处是否存在探针,如果存在,就执行探针预处理程序,然后执行探针内部的指令,执行探针动作,随后执行探针后处理程序,期间若发生错误则执行探针出错处理程序;如果不存在就将执行正常的断点异常处理程序,最后提交日志。探针处理过程如附图5所示其中,探针预处理程序由em-dprobe_pre_handler()函数执行,该函数屏蔽中断,保存探针插入地址的原指令,然后进行指令替换,并且调用用户自己定义的pre_handler();探针后处理程序由em-dprobe_post_handler()函数执行,该函数展开用户自己定义的post_handler();探针出错处理程序由em-dprobe_error_handler()函数执行,该函数负责调用用户定义的出错处理程序error_handler()。
嵌入式动态探针库(EDPL)中包含各种不同的嵌入式动态探针,用来在嵌入式的性能分析的过程中,跟踪和收集不同类型信息。根据嵌入式性能分析过程中要收集和获取的信息,探针分成两大类,一部分是用来收集跟应用程序信息相关的探针;另一部分是收集系统相关信息的探针。具体的探针函数如下跟应用程序信息相关的探针函数插桩探针函数func_probe()该探针的作用是在函数执行时插桩,收集函数执行情况的相关数据,包括函数ID、函数调用者和被调用者、函数被调用次数、函数参数等信息。
块插桩探针函数block_probe()该探针的作用是在基本块执行时插桩,收集基本块执行情况的相关数据,包括基本块ID、基本块执行次数、基本块所属函数等。
分支插桩探针函数branch_probe()该探针的作用是在分支执行时进行插桩,跟踪分支执行情况。
时间插桩探针函数time_probe()该探针的作用是对程序进行时间插桩,收集相关的时间信息,包括程序开始/结束时刻、函数开始/结束时刻、基本块开始/结束时刻等等。
断言插桩探针assert_probe()该探针的作用是跟踪断言结果。
字符变量插桩探针函数var_char_probe()该探针的作用是跟踪字符类型变量。
整型变量插桩探针函数var_int_probe()该探针的作用是整形变量。
长整型变量插桩探针函数var_long_int_probe()该探针的作用是跟踪长整形变量。
浮点变量插桩探针函数var_float_probe()该探针的作用是跟踪float类型的变量。
双精度浮点变量插桩探针函数var_double_probe()该探针的作用是跟踪double类型的变量。
长双精度浮点变量插桩探针函数var_long_double_probe()该探针的作用是跟踪longdouble类型的变量。
跟探测系统信息相关的探针CPU探针cpu_probe()该探针的作用是跟踪并收集CPU相关信息;I/O探针io_probe()该探针的作用是跟踪并收集I/O相关信息;内存探针mem_probe()该探针的作用是跟踪并收集内存相关信息。
权利要求
1.一种动态探针方法,其特征在于在被测程序运行时采用断点机制将探针插入到被测程序中;具体实现过程为首先确定探针的插入位置,然后在插入位置处用探针调用指令替换原有的指令,执行探针指令,等待探针动作完成之后,再执行插入位置处的原指令。
2.根据权利要求1所述的动态探针方法,其特征在于所述探针包括嵌入式动态探针管理器和嵌入式动态探针库;所述嵌入式动态探针管理器负责探针的定义、注册、查询、删除,所述嵌入式动态探针库存储已定义的探针。
3.根据权利要求1或2所述的动态探针方法,其特征在于通过em-dprobe数据结构对所述探针进行描述,所述em-dprobe具体如下struct em-dprobe{struct list_head list;char *addr;char*pre_handler;char*post_handler;char*error_handler;char opcode;char insn[MAX_INSN_SIZE];};其中,list表示所有打开的探针所形成的链表;addr表示探针即将插入的位置;pre_handler表示指定的预处理函数的位置;post_handler表示指定的后续处理函数的位置;error_handler表示出错处理函数的位置;opcode表示要替换的指令;charinsn[MAX_INSN_SIZE]表示原来的指令。
4.根据权利要求3所述的动态探针方法,其特征在于采用数据结构mprobe描述保存的已存在的探针,所述mprobe的定义如下struct mprobe{int p_index;char*f_name;int p_flags;char*pre_handler;char*post_handler;char*error_handler;};其中,p_index记录该探针在探针索引表中的索引值;f_name记录探针对应的探针函数名称表明探针记录的跟踪事件的内容;p_flags标志探针是否是自定义的;pre_handler表示指定的预处理函数的位置;post_handler表示指定的后续处理函数的位置;error_handler表示出错处理函数的位置。
5.根据权利要求4所述的动态探针方法,其特征在于所述动态探针的插入位置包括程序的入口和出口处;和/或基本块的入口和出口处;和/或转移指令之前;和/或标号语句之前。
6.根据权利要求5所述的动态探针方法,其特征在于还通过动态探针框架获取详细的性能数据,所述动态探针框架包括动态探针管理器和动态探针事件处理器,所述动态探针管理器负责接受探针的注册或者注销请求,并将每一个探针定义保存到动态探针对象中,所述动态探针事件处理器包含当激活探针时需要执行的具体指令,完成对断点中断的具体响应。
7.一种动态探针方法在嵌入式系统中的应用,其特征在于在嵌入式系统的被测程序运行时,采用断点机制将探针插入到被测程序例程,以无干扰地收集嵌入式系统的详细性能信息。
8.根据权利要求7所述的动态探针方法在嵌入式系统中的应用,其特征在于所述收集嵌入式系统的详细性能信息通过由探针对被测程序运行时的相关信息进行探测所实现。
9.根据权利要求7或8所述的动态探针方法在嵌入式系统中的应用,其特征在于该应用过程包括(1)指令替换技术,包括插入断点、监控上下文信息、当断点被触发的时候转储特定的数据区;(2)动态探针的插桩策略,即动态探针插入的位置,所述插桩策略包括函数探针、基本块探针、分支探针、断言探针、时间探针、变量跟踪探针和系统信息跟踪探针;(3)动态探针的类型,包括跟应用程序信息相关的动态探针,以及跟探测系统信息相关的动态探针。
全文摘要
本发明提供一种动态探针方法及其在嵌入式系统中的应用,在被测程序运行时采用断点机制将探针插入到被测程序中;具体实现过程为首先确定探针的插入位置,在插入位置处用探针调用指令替换原有的指令,然后执行探针指令,等待探针动作完成之后,再执行插入位置处的原指令。在嵌入式系统应用时,嵌入式系统的被测程序运行时,采用断点机制将探针插入到被测程序例程,以无干扰地收集嵌入式系统的详细性能信息。对比现有嵌入式性能分析工具的数据采集方法,本发明所述的嵌入式动态探针的最显著特色是数据动态收集,而且灵活性高,方法简便,易于实现。实验结果表明,采用嵌入式动态探针收集的数据正确性、准确性和完备性都较好。
文档编号G06F11/36GK101067798SQ200710028580
公开日2007年11月7日 申请日期2007年6月14日 优先权日2007年6月14日
发明者刘发贵, 宋潇豫, 吴庆波 申请人:华南理工大学, 广东美泰科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1