第一章 调试符号和调试器

当谈论调试一个程序的时候,调试器也许是人们想到的第一个事物,因为它是这个过程中不可避免的部分。而这源于考虑到现代编程语言和操作系统的复杂性,就算不是无法实现,知道一个程序的状态也是非常困难。一个写代码的开发人员应该已经知道什么是调试器和如何或多或少去使用一个调试器。但是你了解调试器足够多吗?

答案很大程度取决于你在问谁。对于一些人,设置断点和检查变量的值是他们所有的需要,但是另外一些人需要检查程序的比特和字节来获取线索。从我个人的经验,每一个程序员都应该知道一点调试器是如何实现它的魔法。尽管不必要去了解所有深入血肉的调试器内在细节,如调试符号是如何产生、组织和最终被调试器使用,但知道概念和一些它的实现细节可以帮助你理解调试器的强项,也理解它的不足。

有了这些知识,你将更有效率地使用调试器。举个例子,如果你明白什么样的调试符号在调试优化后的代码(如发行版或者系统库)可以访问,你将知道在哪里设置断点来获取你所需要的;你会知道尽可能地怎样减少调试器侵入式的影响,比如为了使成功地重现问题,使用硬件断点。本章节揭露一些调试器内在,从而让我们比平常知道更多一点。你将不仅知道调试器可以做什么,也将知道它是怎么做的,而也许更重要的是,为什么有时候它没有做到你期望的事情,在哪些情况下,你可以变通一下。我们也将看到如何使用自定义命令如插件函数来增强调试器的能力。