一种嵌入式软件动态内存检测的方法技术

技术编号:2820275 阅读:215 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供了一种嵌入式软件动态内存检测的方法,将数据采集和数据测试分析相分离,即对涉及动态内存检测所需的数据采集步骤和数据测试分析步骤分别在不同的嵌入式主机进行,且进行数据测试分析的主机与进行数据采集的主机相互连接。本发明专利技术为数据采集和测试分离的交叉测试方法,该方法能够准确度、可靠性、及时性的检测嵌入式软件的内存问题,同时保证嵌入式平台资源的利用率。

【技术实现步骤摘要】

本专利技术属于嵌入式系统的内存动态检测领域,特别是涉及一种将数据采集 和测试分离的交叉测试的方法。
技术介绍
随着嵌入式技术的发展,嵌入式应用的不断增长以及嵌入式系统复杂性不 断提高,嵌入式软件的规模和复杂性也不断提高,有限的硬件资源和功能越来 越强的需求依然是嵌入式软件开发领域的主要矛盾,嵌入式软件必须做到精简 高效、稳定可靠。嵌入式软件的质量和开发周期对产品的最终质量和上市时间 起到决定性的影B向,这使得嵌入式软件的开发、分析与测试成为了研究的热点。嵌入式软件与个人微机软件有着巨大的差别,这表现在它与硬件关系紧 密、内存不丰富,可靠性和实时性要求高的几个方面。嵌入式软件如果出现内 存泄漏等问题,势必导致系统可用内存减少,严重的可能引起系统的崩溃。如何有效管理内存泄露、内存碎片和内存崩溃等问题对嵌入式软件开发变 得越来越突出。同时,考虑到嵌入式平台主要利用率的问题,测试应该尽可能 的减小开销。目前,内存使用错误的预防和处理方法分为静态分析和动态分析两类,静 态分析工具研制复杂,目前还没有得到广泛使用的高效工具。动态分析又分为源代码插装法(SCI: Source Code Instrument)、目标码插装法(OCI: Object Code Instrument)和添加保护字节法三类。SCI法对原始程序进行语法扫描、分析,然后插入检测代码将其转换成新的、等价的源代码,这一过程对用户来说是完全透明的。在整个过程中,原始 代码文件没有被修改,也不需要用户的任何介入。加工好的源文件最后被链接 成可执行文件,从而为检测程序运行时错误做好准备。OCI法对每个目标文件和库进行加工,并工作在汇编码级。在链接时,对每个文件进行解码,分析每条指令,发现与内存有关的指令,插入额外的代码 以检查内存存取的准确性,并以临时文件的形式建立等价的模块。在所有的模 块被改造完毕后,连接成最后的可执行程序。添加保护字节法在每个内存块的边界添加保护字节,这些额外的字节用来 标志该内存块并动态记录内存块的状态。在程序执行过程中,如果程序读写处 于围墙上的字节,就被判为错误。同时,通过分析保护字节的信息,可以检测出该内存块是否被释放,从而判断是否发生内存泄漏。同SCI与OCI方法相比,此方法在实现上难度更大一些,而且添加的保护字节要占用大量的内存空 间,对于大型的应用程序使用此方法检测效率很低。常用的动态内存检测工具如Purify、 Valgrind、 Mpatro、 Memtrace, Memprof等都是基于源代码插装法,FENSE则采用了源代码插装法和添加保护字节法相 结合的方式。然而这些工具都是在同一个主机上采集和分析数据,对于资源紧 缺的嵌入式平台而言,这些测试工具影响系统资源的利用率。
技术实现思路
本专利技术的目的在于克服现有技术的不足,提出了一种数据采集和测试分离 的交叉测试方法,该方法能够准确度、可靠性、及时性的检测嵌入式软件的内 存问题,同时保证嵌入式平台资源的利用率。为了实现上述专利技术目的,采用的技术方案如下,将数据采集和数据测试分析相分离,即对涉及动态内存检测所需的数据采集步骤和数据测试分析歩骤分别在不 同的嵌入式主机进行,且进行数据测试分析的主机与进行数据采集的主机相互 连接。上述技术方案中,进行数据测试分析为开发机,开发机上设置有内存探测 模块和插装库,进行数据釆集为目标机,目标机上设置测试代理模块,所述内存探测模块集成于Edipse平台,包括通信模块、数据管理模块、显示模块,所 述通信模块与目标机上的测试代理模块建立连接,所述数据管理模块通过通信 模块向测试代理模块发送可执行文件,并接收测试代理模块执行文件过程中发 送过来的数据,所述显示模块进行分析数据和图形显示。所述目标机的测试代理模块包括接收和执行文件模块、微观测试模块、宏 观测试模块三部分,所述接收和执行文件模块与开发机建立通信,接收在开发 机上经过交叉编译生成的可执行文件,并把微观测试模块和宏观测试模块获得 的数据传输给开发机,所述微观测试模块捕捉可执行文件的内存操作行为,所 述宏观测试模块根据嵌入式系统内存的变化判断是否出现内存问题。所述插装库是内存信息统计库,在开发机上和被测试文件一起交叉编译生成可执行文件。本专利技术具体包括如下步骤(1) 嵌入式软件在开发机上进行交叉编译,把插装库和嵌入式软件一起 编译生成相对于目标机的可执行文件;(2) 开发机上的内存探测模块把可执行文件发送到目标机卜.,目标机通 过测试代理模块的接收和执行文件模块接收并且执行相应的文件;(3) 在目标机上执行可执行文件的同时,微观测试模块和宏观测试模块 收集数据,再通过测试代理模块把数据发送给开发机,开发机上的数据管理模 块接收数据,再通过显示模块进行分析,并显示分析结果。步骤(1)中插装库是源代码插装库,这个库主要是用来统计内存操作信息,嵌入式软件一般都要通过编译链交叉编译生成可执行文件;步骤(2)中,开发机和目标机之间通过TCP/IP协议建立连接;步骤(3)中的微观测试模块和宏观测试模块负责采集目标机数据,但是不进行分析,具体分析操作是开发机的显示模块负责,这样做的目的大大减少了测试开销。假设T执ff表示被测试文件执行时间;Tsi集表示采集数据时间;T分ff表示分 析数据时间;T^表示传输时间;如果数据采集和测试都在目标机上,那么总 的时间为T ,&=T術+T采集+T分析为目标机的开销。如果数据采集和测试分离,即数 据采集在目标机h而分析在开发机上,那么目标机的总开销为T ^7+T采集+T 传输。比较T分析和T糊,之间大小,实验表明,对于大型嵌入式软件,传输数据时 间比分析数据时间要小很多。并且如果在目标机上分析数据,还占用平台资源。 这对于资源紧缺的嵌入式平台是不可以接受的。所述微观测试模块收集数据通过执行文件里的插装库实现,插装库通过改 写嵌入式操作系统下的涉及内存操作函数,包括在这些函数里增加把对内存操 作的信息发送到开发机上的代码,插装库里改写函数通过调用嵌入式操作系统 标准库stdlib的内存操作函数实现,具体如下如果涉及内存操作函数,会被插装库的函数替换,接着调用目标机上标准 库Stdlib里面的相应函数;如果涉及申请内存函数,那么就把申请成功内存的开始地址存入全局链表,出错就报错;如果是释放内存函数,就搜索全局链表看是否存在该内存,如果没有就报错;最后,获得内存操作的信息,保存起来,再发送给测试代理模块; 插装库设置一个全局链表List,当申请内存时,保存每次申请到的内存的地址;当释放内存时,在链表里面搜索给定内存的地址,然后从链表里面删除,从而保证数据一致性。所述宏观检测模块先从宏观上判断一个进程是否存在内存泄漏,其通过获得应用程序堆空间,虚拟内存和实际内存的变化,来判断是否出现内存问题,具体操作如下测试代理模块执行被测试程序,获得被测试程序的进程号,再把这个进程 号传送给内核态的宏观测试模块的kemeUiser模块;根据这个进程号,宏观测试模块的kemeLuser模块搜索整个进程链表,找 到相应的进程控制块PCB,所述进程链表保存在嵌入式操作系统的内核中;根据进程控制块PCB获取进程的所有内核态信息,包括内存信息,同时把 获得的内存信息写入字符本文档来自技高网
...

【技术保护点】
一种嵌入式软件动态内存检测的方法,其特征在于将数据采集和数据测试分析相分离,即对涉及动态内存检测所需的数据采集步骤和数据测试分析步骤分别在不同的嵌入式主机进行,且进行数据测试分析的主机与进行数据采集的主机相互连接。

【技术特征摘要】

【专利技术属性】
技术研发人员:刘发贵温宇龙
申请(专利权)人:华南理工大学
类型:发明
国别省市:81[中国|广州]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1