嵌入式软件调试技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 调试器应当遵循的原则

无论桌面软件调试器还是嵌入式软件调试器,都必须遵守某些原则。前面已经提到了调试器必须要客观公正地看待被调程序,既不能受被调程序影响,也不能反过来影响被调程序的执行。除此之外,调试器还有另外几个必须遵守的原则。

1.4.1 调试器必须反映真实信息

调试器反映的信息要作为判断程序错误、寻根溯源的依据,使命重大,因此调试器反映的信息必须真实可靠。

1.4.2 提供尽可能多的程序上下文信息

大多数情况下,程序中隐藏的错误是很难发现的。因此,如果调试器能够为开发者提供更多、更详尽的信息,就能为程序员判断和定位错误多提供一份依据,从而尽快找出错误。通常而言,调试器除了要能给出程序中全局变量、局部变量、堆、栈和断点的状态等信息之外,还要能够提供CPU寄存器和存储器的内容。如果是提供了多进程或多线程支持的调试器,还应该能够给出各个进程或线程的状态;如果是系统级调试器,还应该能够处理内核符号表等。

1.4.3 Heisenberg原则——尽可能减少对被测系统的影响

前面提到的Heisenberg于1927年提出的测不准原理不仅适用于物理学,其影响范围也波及了计算机科学的领域。

软件调试的基础是检测。理想的检测手段不应该使被测试对象的一切状态因受到影响而改变,否则测到的数据就是不准确的,就是有损检测,而与之相对的则是无损检测[9]。然而,绝对意义上的无损检测是无法做到的。调试器所能做的就是尽可能减少对被测对象的影响,将误差减少到可以接受的程度。

由于调试器在执行过程中采取向被调程序插入断点等手段来控制被调试程序,如果断点触发引起的短暂停顿导致了程序时序的某种微妙改变,仍然可能导致调试器“失灵”,这种问题是极难察觉的。在嵌入式环境中,目前广泛采用的调试方法是调试器加调试代理。可是,调试代理的存在实际上已经在一定程度上改变了被调程序的运行环境。这使得要满足Heisenberg原则变得更加困难。