调试器gdb
一、启动和退出gdb
gdb调试的对象是可执行文件,而不是程序的源代码。如果要使一个可执行文件可以被gdb调试,那么在使用编译器gcc编译程序时需要加入-g选项。gdb调试一个程序的命令格式是:
gdb 程序文件名
也可以在Linux提示符下,直接输入gdb,然后使用file命令装入要调试的程序:
file 程序文件名
如果要结束调试,使用quit命令就可以退出gdb,返回到Linux的提示符。
二、显示和查找源程序代码
list命令用于列出程序的源代码,它的使用格式如下:
1. list:显示10行代码,若再次运行该命令则显示接下来的10行代码。
2. list 5,10:显示第5行到第10行的代码。
3. list get_sum:显示get_sum函数周围的代码。
另外,如果要在调试过程中运行Linux命令,则可以在gdb的提示符下输入shell命令。例如:
shell ls
三、开始调试
1. 使程序开始运行:run
注:使用gdb 程序文件名或file 程序文件名只是装入程序,程序并没有运行。
2. 设置和管理断点
1) 以行号设置断点,例如:
break 7
2) 以函数名设置断点,例如:
break get_sum
3) 以条件表达式设置断点,命令格式是:break 行号或函数名 if 条件,例如:
break 7 if i==99
还有一种以表达式设置断点的方法,这种设置方式不需要指定行号或函数名,而是在整个程序运行中当条件表达式的值发生改变时程序会暂停下来。命令格式是:watch 条件表达式
4) 查看当前设置的中断点,使用info breakpoing命令。
5) 使中断失效或有效,使用disable 断点编号命令可以使某个断点失效。使用enable断点编号命令可以使某个断点恢复有效。
6) 删除断点,disable只是让某个断点暂时失效,断点依然存在于程序中。如果要彻底删除某个断点,可以使用clear或delete命令。命令格式如下所示:
Ø clear 行号:删除此行的断点。
Ø clear函数名:删除该函数的断点。
Ø delete 断点编号:删除指定编号的断点。如果一次要删除多个断点,各 断点编号以空格隔开。
三、查看和设置变量的值
1. print命令
print命令一般用来打印变量或表达式的值,也可以用来对某个变量进行赋值。其使用格式为:
Ø print 变量或表达式:打印变量或表达式当前的值。
Ø print 变量=值:对变量进行赋值。
2. whatis命令
whatis命令用来显示某个变量或表达式值的数据类型。格式如下:
whatis 变量或表达式
3. display 命令
在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。格式如下:
display 变量或表达式
4. backtrace 命令
用于查看函数堆栈。
四、控制程序的执行
1. continue 命令
让程序继续运行,知道下一个断点或运行完为止。
2. kill命令
将强行终止当前正在调试的程序。
3. next和step命令
用于单步调试,对于step命令,如果有函数调用,则进入函数。与命令step不同,next是不进入调用的函数的。
五、练习
练习1 下面这个程序是否有问题?
#include <stdio.h>
#define MAX 255
int main()
{
unsigned char a[MAX], I;
for(I = 0; I <= MAX; i++)
a[i]=I;
for(I = 0; I <=MAX; i++)
printf(“%d ”, a[i]);
printf(“\n”);
return 0;
}