TimeMachine -- 新一代的调试技术
严永红 上海祥佑数码科技有限公司 研发部经理
随着技术的发展,嵌入式系统已变得越来越复杂。这同时体现在软硬件设计两个方面。在硬件上,一方面是时钟频率越来越高,另一方面是在同一系统中往往集成了多个CPU内核,有同构的,也有异构的。在软件上,各种复杂的操作系统也都被用到嵌入式系统中,而且这些复杂的操作系统往往兼具了传统实时操作系统和桌面系统的功能和优点。所有这一切,都使嵌入式系统的性能大大提高,但同时也对开发过程提出了严峻的挑战。特别是在调试和测试方面。
在这样一个复杂的系统中,一个错误的出现往往牵扯到很多方面。一个简单的经常出现的错误可以在调试器中很容易被找到并修正,只要能顺序地跟踪代码。而一个难以重现的错误往往占用我们大量时间去寻找产生错误的源头。这样的错误往往在用调试器调试时不会出现。我们只能一遍又一遍地在代码中加入打印语句来收集错误出现的一些蛛丝马迹,然后再猜测错误的源头。这种方法往往只能达到事倍功半的效果,而且随着软硬件复杂程度的增加,消耗在这一过程中的实践会成倍的增加。
今天,随着调试除错技术的发展,新的技术不断的引入,我们已经能够追踪和控制这种复杂的错误。采用新技术的调试器可以让系统在发生错误时停下,并从错误现象产生之处往回单步或直接运行到错误的源头。这样不但能使你抓住这个错误,而且能重现整个产生错误的各个步骤,让一个复杂的错误变得简单、容易重现。例如Green Hills研制的新技术Time Machine。它集成了实时跟踪、反向追踪以及多核技术。
实时跟踪利用CPU内部的一个端口,把CPU内部的动态信息传送出来。这些信息包括执行过的指令,这些指令执行时所访问的内存空间地址,以及所有这些动作的时间戳。所有这些信息都是在CPU全速运行时送出来的,所以这是的信息都是和正常使用的情况相一致的。现在很多CPU都带有这样的功能,ARM7, ARM9, ARM11, POWERPC-4XX, POWERPC-54XX, ColdFire等等。
为了接收这些信息,需要一个设备,叫Trace Probe。现在的Trace Probe可以存储高达千兆字节的信息。在Trace分析软件的帮助下,我们可以通过这些大量的数据重复系统的功能,重构时间序列,定位错误和无效代码。在这之前,一般是采用硬件逻辑分析仪来做这样的工作,但逻辑分析仪只能采集到外部的地址和数据总线,并不能看到CPU内部的信息,例如缓存的动作。
Green Hills提供的高级的跟踪分析工具还能在更高的层次上分析整个系统。例如在RTOS的层面上,Trace工具可以帮助用户理解操作系统中各种事件和资源之间复杂的交互。例如,提供任务切换和中断延时的精确测量,还能让用户检查和分析在系统范围内,事件和任务之间交互。各种事件如任务切换,异常,中断,系统调用,用户事件,人物状态改变等等都可以用图示化的方式在时间轴上图示所示。
反向追踪是建立在Trace基础上的一项新技术。当Trace分析工具掌握了整个指令执行的顺序和当时的内存映像,这些信息可以用来作为调试的基础,而不用再真正连接到目标板上。调试器把原始的指令翻译为源代码行,把内存的值转换为变量,这样可以使你很容易看到每一个时间点上程序的状态,当然你也可以让产生错误的过程重新按原来的路径走一遍。这时候,调试器不但可以让你向前单步更新系统状态,也可以反向复原系统,你甚至可以设置断点和观察点,让系统状态复原到断点或观察点为止。
{{分页}}
反向复原使你可以更快地找到发生错误的源头,而不仅仅知道发生错误现象的地方。你可以检视各种可能的解决方法。因为你有完整的Trace数据,你可以很容易地向前或向后调整程序的状态。这是你很快找到那些用传统调试技术很难找到的错误,因为传统调试技术要求你在调试器中重现错误,这是你必须重启系统,并经过一番复杂的操作才能达到错误点。这还算是好运的。有些错误并不是经常出现,而是和一些偶然的因素相关,这样你在重现错误这个阶段就要耗费很多的时间。而且在调试过程中,一旦你不小心错过了这个错误,一切都得重新开始。这样的噩梦,每个工程师应该都碰到过。但是有了TimeMachine的追踪和反向追踪技术,一切变得不一样了。你只要追踪到一次错误,你就可以充分利用追踪到的数据,重复跟踪指导错误找到并修正为止。
一个复杂的系统往往会采用多核技术,可能是跑在同样主频上的同种CPU,也可能是跑在不同主频上的不同的CPU。不论是何种多核架构,CPU之间的同步和通信都对于软件设计来讲是一个考验。如果软件存在瑕疵,一个细微的时延就可能带来巨大的结果差异。用传统的调试技术来跟踪这样的问题是极其困难的,因为重现这样的问题基本上是不可能的。但是,如果你可以把每个处理器上的实时数据都记录下来的话,你就可以按顺序恢复每一个处理器的状态并找出处理器之间的交互关系。
Green Hills的TimeMachine套件集成了一系列的调试和分析工具,用来帮助工程师发现错误、进行测试和优化程序。以可视化的方法呈现整个程序在时间上的各种行为。这些工具包括TimeMachine Debugger、PathAnalyzer和Multi-Profile等等。PathAnalyzer以可视化的方法呈现了程序的堆栈在时间上的变化,这样可以使你很容易看到程序在那个地方花了较多的时间。而且,你还可以很快看出程序各部分之间的交互关系。
PathAnalyzer
TimeMachine的基础是要有记录下来的大量实时跟踪数据,但还有很大一部分的CPU是没有硬件跟踪功能的。怎么办?对于这样的CPU,Green Hills给出了两种解决办法,一种叫In-Memory,一种叫TraceEdge。若要使用这两种办法,你需要使用Green Hills的编译工具。一些额外的代码会被插入到程序中,而这些额外代码所产生的信息可以被Time Machine用来重构整个程序的流程。In-Memory TimeMachine 和TraceEdge 与传统的代码植入方法相比有明显的优势。第一,代码植入是在Link的时候而不是在编译时,这样使用起来方便而且省时。第二,TraceEdge 一般仅仅插入一条指令,而In-Memory TimeMachine也只插入一条指令去调用一个很小的库函数。这样在空间和时间上都不会对目标程序造成大的影响。第三,使用Green Hills先进的Link技术,可以使需要植入代码的程序块的数目最小化,而不是每一个程序块都要植入。因为有些程序块会有相关性。In-Memory TimeMachine 要使用一块目标系统的内存在存放数据,当数据填满后就被JTAG Probe或Debug Agent 送回PC。而TraceEdge不占用目标系统内存。而且有三种可选的配置,TraceEdge Bus, TraceEdge-PCI, TraceEdge-PMC。用TraceEdge Bus 植入的程序会向系统的一段无缓存的地址空间写信息,这一段地址要有一个独立的CS。Trace Probe会监视这一段地址空间,并把抓到的信息存到保存起来。而TraceEdge-PCI 和TraceEdge-PMC 分别需要一块 TraceEdge PCI卡和PMC卡插到目标系统的PCI或PMC槽中,而Trace Probe直接和卡相连。
评论