要想使用gdb调试,在编译的时候必须加上-g选项,这样才能加入调试信息,让gdb可以正常工作。
gdb+可执行文件:开始调试该可执行文件
1. r:执行run,到断点处暂停
2. c:继续运行
3. 设置断点:
b+函数名:
b+行号:
b+偏移量:
b-偏移量:
b+地址:
4. 删除断点:
d+断点标号n:删除第n个断点
d:删除所有的断点
5. q:退出gdb
6. 查看当前设置的断点信息:
info+b
7. 禁用某个断点:
disable+断点号
8. 开启某个断点;
enable+断点号
9. 查看源代码:
list:查看代码执行位置附近的10行,假设11-20
list+line_number:查看line_number附近的10行代码
list -:查看上一个list命令查看的代码之前的10行
list 1,10:查看1到10行的代码
list main:查看main函数周围的10行代码
list hello.c:13:查看hello.c文件的第13行周围的10行的代码
list hello.c:print:查看hello.c文件的print函数周围10行的代码
10. watch的使用:
watch用来监视当前环境下的变量的变化情况,当前环境是指比如一个函数体内的所有变量=参数+局部变量+全局变量:
首先要使用break在要观察的变量上设置一个断点;
使用run,执行到该断点处;
使用watch,设置好要监视的变量;
使用continue,观察变量每一步的变化情况,即只要变量发生变化就输出一次新旧变化的情况;
11. s、n和si、ni的使用:
s:相当于其它调试器中的“Step Into (单步跟踪进入),执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n:相当于其它调试器中的“Step Over (单步跟踪),执行一行源程序代码,此行代码中的函数调用也一并执行;
si:类似于s命令,不同之处是s针对的是源代码,而si针对的是汇编命令;
ni:类似与n命令,不同之处是n针对的是源代码,而ni针对的是汇编命令 ;
si N:一次执行N条会汇编指令;
12. x的使用:
x是examine的缩写,用来查看内存。
格式:x/nfu address
(1)n表示要显示的内存单元格数;
(2)f表示显示方式, 可取如下值:
x 按十六进制格式显示变量;
d 按十进制格式显示变量;
u 按十进制格式显示无符号整型;
o 按八进制格式显示变量;
t 按二进制格式显示变量;
a 按十六进制格式显示变量;
i 指令地址格式;
c 按字符格式显示变量;
f 按浮点数格式显示变量;
例如:
x/3x:从当前地址向后显示3个内存单元的内容,以16进制显示变量;gdb默认是4个bytes为一个内存单元。
(3)u表示一个地址单元的长度,可取如下值:
b表示单字节;
h表示双字节;
w表示四字节;
g表示八字节;
例如:
x/i 0xffff0:即查看物理地址为0xffff0处的汇编指令;