嵌入式系统软件开发环境中调试器的设计
扫描二维码
随时随地手机看文章
1、程序调式与调试器的设计与概述
调试就是发现程序中的错误并修改错误的过程,在软件开发流程中,调试是一个比较重要的环节。调试器就是帮助程序员发现并排除错误的软件工具,它给程序员提供从不同角度观察程序执行情况的能力。同时,好的调试器也是“读”程序的好帮手,程序员通过调试器调试程序时提供的各种功能和运行时的状态信息可以更深刻地理解程序功能。可以说调试器的优劣是衡量软件开发环境好坏的重要标准。在嵌入式系统软件开发环境中,调试尤显其重要性。因为许多嵌入式应用系统的软件规模并不是太大,也就是说设计和代码编写工作量相对较小,而开发者所面对的硬件对象千差万别,操作系统和就用程序也往往是绑定在一起的,如何“导出”调式结果信息也是软硬件开发者必须考虑的一个问题。
2、调试的一般过程
当程序运行后未得到预期结果,也就是程序有了“问题”,如何从程序的运行结果出发找到出错的根源,不同的程序员可能各有自己不同的经验和方法,但基本的调试过程还是类似的,可简单图示如下:
500)this.style.width=500;" border="0" />
图1—1调试的一般过程
3、调试器的分类
从调试器参与与调试的时机来看,或划分为静态调度器和动态调器两类。静态调试器的典型做法是在源程序中需要收集信息的位置插入跟踪语句,然后重新编译、执行程序,程序执行完毕后,用调试器分析执行时出跟踪语句保留下来的信息,将分析的结果给程序员作判断用。动态调器(又称源代码调试器或符号调试器),则是在程序运行的过程中动态地监控程序运行,并提供给程序员控制被调试程序的运行和访问被调试程序信息的手段。这一类调试器最本质的特征是提供有设置断点(breakpoint)和单步跟踪程序运行等能力,被调试程序运行时遇到断点后便停下来,调试器给程序员提供可从不同的角度观察程序运行情况的能力,以方便程序找出错原因,进而修改程序。本论文讨论的主要是这类调试器。其实,现在有些调试器这两种特点兼而有之。
从调试器提供给程序员的抽象层次来分,可分为高层调试器和低层解试器。所谓的低层调试器通常指调试程序时仅能在汇编代码一级反映程序的运行状态,程序员只能从指令级和CPU的各种寄存器状态中分析程序运行是否正常。高层调试器则指能在高级语言一级反映程序的运行状态的调试器。
从使用的被调试程序的功能特点来分,又可分为简单调试器。并行调试器,分布式调试器等等。
4、调试器设计应遵循的一般原则
●Heisnberg原则:调试器应尽量减少对被调试器对象的影响
特别是对于动态调试器来说,出于其直接介入了被调度对象的运行,就必须考虑这种介入是否对被调度器程序有所干扰,如果产生了干扰,其反映的被调试对象的信息肯定就不完全真实。对大多数传统的顺序执行的程序而言,出于被调试的程序进行与调试器程序进程不同一虚地址空间,因而不存在多大的干扰。但是,对于并行和分布式系统中的程序调试而言这种干扰就不可避免了,如何尽可能的减少对被调试对象的影响,则是这类调试器设计要考虑的首要问题。
●程序员通过调试器所获得的信息应真实反映被调试器执行的实际情况
如对于高层调试器设计而言,程序实际执行代码的实际位置得与源代码行应准确对应起来,特别是再考虑到允许编译器做代码优化工作话,这个原则更必须予以重视,因为代码优化之后,源代码行与目标代码指令序列的对应关系遭到破坏,从而也就打乱了目标文件调试信息中的对应关系。故一般调试程序时,都要求编译器在编译时不使用优化选项。
●尽可能我的给出有关被调试对象的上下文信息[!--empirenews.page--]
调试器应提供给程序员从不角度和层次观察调试对象状态和行为的功能。一般而言,调试器至少得具有断点设置和查看、单步跟踪程序执行流程、以及程序在断点处停下来时对各种寄存器和内存内容的访问、显示调用栈中函数的调用关系等等功能。当然,对于多进程和多线程的调试器,还得具有查看进程或线程之间的通信关系,以及它们各自的状态信息等等。
5、嵌入式系统软件开发中的调试方法
嵌入式系统产品的开发中,嵌入式操作系统和开发具起到非常重要的作用。首先嵌入式操作系统机构了软件开发的基本执行支撑,是软件开发的基础。另一方面,嵌入式系统产品的硬件通常使用专用芯片及System—On—Chinp技术,通常需要新的工具包支持。工具中编译工具对发挥芯片的性能至关重要,调试工具对开发效率至关重要。
对嵌入式系统的软件开环境而言,开发者所面对的硬件对象往往千差万别,软件开发的规模一般较小,还带有各种如实时性、内存大不、能耗小、安全性的特殊需求,调试荼就显成尤为重要。最早期的调试方法基本采取的是“crash and burn”的方法,即把编译好的目标代码“烧”到目标板上,让它跑起来,如果未得到预期结果,仔细检查源代码,猜测出问题可能出现的地方,尝试修试源代码,再重新“烧”到目标板上,再运行,一直重复这个过程,直到结果正确为止。使用这种方法,犹如在暗室中维修精密仪器,可想而各程序调试的难度有多大。
为了方便嵌入系统中代码的调试,在硬件上,出现了各种各样的具有调式功能的调试板(本文称之为目标板-Target)。如增加了串口,并口,网口使之通过串、并口线或网线并借助另外一台通用计算机(本文称之为主机-Host)把调式信息输出并显示出来,有的甚至在微代码一级增加了实现调试功能的指令。在软件上,也出现了大量嵌入式调试器,即使不是专门向嵌入系统的调试器往往也是一定程度上考虑了嵌入式系统软件调试功能。如Microsoft.VxWOrks,pSoS均提供图形化的易用的程序开发调试环境,开发调试环境已经监控系统核心(Kernel Aware),可视化整个系统(System Visual)。但由于一些嵌入式系统产品的通常使用专用芯片,其开发环境相对较弱,调试器的开发也必然是完善这些软件开发环境的重要环节。
6、嵌入式系统软件开发环境中调试器的特点
●具有跨平台的交叉调试功能,与嵌入系统软件开发环境的编译器一样,被调试程序的运行平台与调试器本身的运行平台往往是不一致的。
●一般得具有远程调试的功能。嵌入式系统中对程序的调试往往通过串口通信,网络通信等方式来完成调试器与运行目标程序的嵌入式设备的交互。这就使得被调试程序中得有实现这种交互的功能模块。
●根据嵌入式硬件环境的不同特点,针对这种硬件平台的调试器往往也具备一些独特功能。
●如果有某类嵌入式设备的仿真环境的话,相应的应用程序的调试一般先考虑在仿真环境下调试,以减少调试代价。