CODETEST在线测试与分析工具在嵌入式系统开发中的应用[2] 软件测试
当对程序做覆盖率分析时,因为硬件工具是从系统总线捕获数据的,如当CACHE打开我们会采用指令预取技术,从外存中读一段代码到一级CACHE 中,这时逻辑分析仪在总线上监视到这些代码被读取的信号,就会报告这些代码已经被执行了,但实际上被送到CACHE中的代码可能根本没有被命中。为了避免这种误差必须把CACHE关闭掉,而CACHE关掉就不是系统真实的运行环境了,有时甚至会由于CACHE关闭而导致系统无法正常运行。
而仿真器通常采用内存标记技术,它所关心的也是处理器从外存的代码段读取数据的情况。所以也无法在CACHE打开的方式下工作。而它的性能分析也是以仿真器的时间系统以抽样的方式进行的,也无法时实对系统进行真实的分析。所以我们所得出的结果也是不精确的。
纯硬件工具根本不能对内存分配进行分析和检查的能力。
CodeTEST对软件分析测试功能的实现原理
AMC公司吸取了纯软件测试工具和纯硬件测试工具的优点,并对它们进行改善和提升后推出了CodeTEST。
由上图我们可以看出,程序员编写的源代码首先会通过CodeTEST的编译驱动器调用原编译器对进行预编译,然后CodeTEST的插桩器(源代码分析程序)对预编译好的源代码进行自动的插桩,即在需要插桩的关键位置写入一条赋值语句(如:amc_ctrt=0x74100009),并把插入的标记送入一个数据库文件中生成一个符号数据库暂存起来,以备为以后分析时调用。然后,CodeTEST的编译驱动器又会调用原编译器对插桩后的代码进行编译生成可执行目标代码送到目标板上运行。当程序在目标系统运行到插桩点的位置时,目标板的控制总线和地址总线上会出现相应的控制信号和地址信号。当 CodeTEST的辅助硬件(信号捕获探头)从控制总线和地址总线上监视到符合以上条件的信号时,CodeTEST会主动地从数据总线上把数据捕获回来送到CodeTEST的内存中暂存并对这些数据进行预处理,然后将预处理后的数据通过局域网送到工作平台上。通过与前面生成的符号数据库中的数据进行比较,我们就此得知当前程序的运行状态,借此完成对嵌入式软件的性能分析,高级覆盖率分析,内存分析和大容量的代码跟踪。
由此可知,CodeTEST是一个硬件辅助软件的测试与分析工具,它一方面吸取软件打点技术,并对这种技术进行了改善,纯软件工具插入的是一个函数,而CodeTEST插入的是一条赋值语句,它在汇编级也是一条语句,所以它执行的时间非常短,同时避免了被其它的中断所中断,所以它对目标系统的影响非常小(1%-15%)。另一方面, CodeTEST从纯硬件的测试工具那里吸取了从总线捕获数据的技术并且对它进行了改善,CodeTEST不再是采样的方式,它是通过监视系统总线,当程序运行到插入的特殊的点的时候才会主动的到数据总线上把数据捕获回来,借此,在同样的处理能力下,CodeTEST可以做到精确的数据观察。
CodeTEST强大的测试分析功能。
由于CodeTEST对软件打点技术和从总线捕获数据进行了改善和提升,正是这种原理上的优势,所以CodeTEST具有强大的性能分析、内存分析、高级覆盖率分析和代码跟踪功能。
1.强大的性能分析:CodeTEST能同时对128000个函数和1000个任务进行性能分析,可以精确的得出每个函数或任务执行的最大时间、最小时间和平均时间,精确度达到50ns;能够精确的显示各函数或任务之间的调用情况,帮助你发现系统瓶颈、优化系统和提升你的系统性能。
2. 强大的覆盖率分析。 CodeTEST可以在系统真实的环境下,可以从单元级、集成级、系统级以及产品终端现场阶段进行嵌入式软件的分析与测试。帮助测试工程师掌握当前的测试覆盖率数据,指导测试用例的编写。
3. 强大的内存分析。CodeTEST可以动态追踪内存分配,报告内存出错和相应的原始数据。他不仅可以在程序运行时报告为每条语句分配多少字节的内存,而且他可以鉴别20多种内存分配的错误。例如:CodeTEST可以捕捉“释放空指针(freeing a null pointer)”一样常见的程序错误,报告发生错误的函数和代码行帮,助你尽早发现动态内纯泄漏,而无需到系统崩溃时。
4. 强大的代码跟踪分析。CodeTEST提供400K的追踪缓冲空间,能追踪150万行的源代码。我们可以设置触发器来追踪自己感兴趣的事件,可以显示运行过程中程序运行的实际情况,帮助你查找程序的BUG所在。
结束语
随着后PC时代的到来,嵌入式应用将会迅速增长,应用的复杂性也急剧增加,传统的软件分析和测试手段已不能满足嵌入式软件分析测试的基本要求,与此相比,AMC公司以其公司的几项专利技术,为我们提供的针对嵌入式软件分析测试的解决方案,为广大的嵌入式系统开发者提供了新的技术手段,使我们可以以全新的视角审视我们原有的开发过程,发现一切可以变的如此快捷、简单。