假设现在有文件c1.c,在该目录下打开命令行,用gcc进行编译,编译的时候加上‘-g’。它的目的是向编译后的可执行程序中加入包括源代码、符号表在内的调试信息,这些额外的内容将有助于GDB更好地完成调试工作:
接下来启动gdb并调试刚生成的程序a.exe:
由于版本不同,这里是gdb32。-silent用于屏蔽gdb的前导信息,否则它会先在屏幕上打印一堆免责条款。启动gdb后,它输出的信息表明已经读入了a.exe的符号表。接下来,gdb会显示自己的提示符“(gdb)”,提示并等待你输入调试命令。
在gdb中,设置断点的方法很多,包括在指定的内存地址处设置断点、在源代码的某一行设置断点或者在某个函数的入口处设置断点,命令是“b”或者“break”。下面我们将main函数的入口处作为断点:
b命令在执行后返回了断点的具体信息,也就是说,断点的内存地址为0x40155d,对应于源文件的第4行。
如果我们用内存地址的方式来设置这个断点,则可以是:
b * 0x40155d
*意味着是以内存地址作为断点的。
或者,如果用源代码行的形式设置这个断点,则可以是:
b 5
一旦设置了断点,下一步就是用‘r’或者‘run’命令执行被调试的程序,执行后会在第一个断点处停下来。
在运行了被调试程序后,GDB的输出信息显示程序已经启动,下一个将要执行的语句是第4行的“n=1;”注意,这条语句现在还没有执行。
“p”或“print”命令用来显示变量的值:
gdb的p命令用来打印一个变量的值,在这里是表达式n。gdb先计算表达式的值,并把它保存在一个存储区中,存储区的名字用“$”外加数字表示,并且这个数字会随着调试过程的进行不断递增(这意味着存储区也是不断开辟的)。上面的意思是表达式n的值保存在“$1”中,其内容为21。
“n”或“next”用于继续执行源文件中的下一行。
“c”或“continue”用来持续执行程序,直至遇到断点或者程序结束。
“q”或“quit”结束调试工作。
参考:《C语言非常道》李忠著