1.基本调试
这里只列举最最常用的GDB命令。
(1) 启动GDB
gdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。
(2) 添加断点
b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。
(3) 运行程序
run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常运行时那样。
(4) 单步调试
s/n/si/c/kill:s即step in,进入下一行代码执行;n即step next,执行下一行代码但不进入;si即step instruction,执行下一条汇编/CPU指令;c即continue,继续执行直到下一个断点处;kill终止调试;quit退出GDB。
(5) 打印调试信息
bt:bt是backtrace的缩写,打印当前所在函数的堆栈路径。
info frame id:打印选中的栈帧的信息。
info args:打印选中栈帧的参数。
print variable:打印指定变量的值。
list:列出相应的源代码。
info registers:查看所有寄存器的值。
还有个更灵活强大的是直接打印%esp开始的前N个元素,例如打印栈上前10个元素就是:x/10x $sp。
2.应用实例
例:
利用冒泡排序算法程序bubble.c,演示gdb调试过程,待调试程序bubble.c的源代码如下:
1.编译运行源程序.
为了方便调试,在编译的时候要加上-g选项,生成的可执行文件才能用gdb进行源码的调试.
2.启动gdb,查看bubble程序相关信息
(1)用list(l)指令列出源程序.
一次只能列出10行,如果要从第11行开始继续列出源代码可以直接按回车.
(2)用info source 命令查看以下当前源程序的信息.
可以得知程序名,目录,文件大小,语言等信息.
3.调试bubble程序.
(1)在函数swap处设置一个断点.
br是break的简写.断电设置成功则显示该断点的信息,该断点号为1,地址为0x400589,它在文件bubble.c的7行.
可以用info br命令查看以下文件bubble.c断点的信息和状态.
其中Num列表示断点的断点号;Type列表示断点的烈性,其中breakpoint表示断点,该指令同时也会显示watch的信息,watch表示检查点;Disp表示断点的状态,del表示断点暂停后自动删除断点,keep表示断点暂停后继续保持断点,dis表示断点暂停后关闭断点;Enb表示断点是否启动,该断点是y,表示处于enable状态;Address表示断点的内存地址;What表示断点在源程序中的位置.(2)执行bubble程序.
程序已经在断点1停下来,当断点停下时,可以查看变量值.
(3)用p命令查看断点附近各变量值,并用n进行下一步的单步执行程序.
(4)删除断点1,并用info br查看到,当前断点为无.
(5)在18行号上设一个断点.发现断点号为2,地址为 0x4005e2,它在文件bubble.c的18行.并删除断点2,在18行设置一个断点,当j=5时让程序停下来.
用info br命令查看断点信息.
(6)
继续执行程序
程序在断点3停下,断点3是哥条件断点.要验证,只需要j=5即可.