一个调试器(精确地称为symbolic debugger),是一个运行你的程序的应用。它可以单步调试源码、一行一行地执行你想要执行的每一行代码。你甚至可以单步调试你的机器指令。在任何时候,你可以在运行时检查甚至修改任何变量的值。如果你的程序崩溃,一个符号调试器会告诉你程序在哪以及为什么崩溃。你可以执行程序并看到哪些源码行以哪种顺序被执行。
调试器也可以解决无限循环的问题。使用它可以单步调试这个循环并看到你的条件为什么不像你所期望的那样工作。它还可以解决一个变量访问时导致的程序崩溃。它可以告诉你关于你尝试访问的变量之间被赋的值(或可能从未被赋过值)。如果你代码里有一行没有执行,使用调试器可以看到什么被执行了,以何种顺序,以及为什么一个特定行不能到达。除了编译器,调试器是一个程序员可以使用的最有用的工具。
不要使用printf来调试代码。当调试的点很多时,放入printf再取出让事情变得复杂。而且调试器可以做到很多printf不能做到的事:在运行时改变变量、临时中断程序、列出源码、打印你不认识的变量或结构体的数据类型、跳到代码里的任意一行、等等等等。调试器还能附加到一个正在运行的进程上,且不用杀死它个进程。它还可以在一个已经崩溃并死掉的程序上使用,而不必重新运行这个程序,并看到程序死的时候程序的状态和所有变量的值。
同样,GDB的知识会增加你对程序、进程、内存和你选择的语言的了解。虽然偶尔printf可能更有用,但绝大多数情况下调试器会更快更容易。使用调试器总是更优雅,如果你不关心优雅,你应该退出Linux编程并开始使用VC。
调试器有许多种,GDB是其中一个。GDB是GNU操作系统的一部分。它的原作者是Richard M. Stallman。它可以用来调试C、C++、Objectiv-C、Fortran、Java、和汇编程序。对Modula-2和Pascal也有部分支持。它可以运行在任何支持Unix的架构上,所以在你的PC上学习GDB会给你在任何Unix可以运行的地方调试代码的能力!
过去,dbx是Unix系统上的权威调试器。随着GNU的出现成为衡量所有Unix系统的标准,GDB变成了调试世界的权威调试器。结果,甚至商业调试器都倾向于与GDB命令行兼容(甚至是概念兼容),所以学习GDB可以使你能够使用大量的其它调试器。简而言之,如果你学习GDB,你几乎可以在Unix世界是使用任何调试器来调试任何东西。
GDB的主页是www.gnu.org/software/gdb/gdb.html。当前最新的版本(2012年1月24日发行的)是7.4。GDB有很多前端,比如DDD(Data Display Debugger)等。