由于面试原因我特意总结一下gdb的用法,以免下次吃亏.
参数:
f xxx 导入文件
b number 设断点
r 运行
n 执行一行
s 进入函数内部执行一小行
l 显示代码
si ni:汇编层用的调试命令,用法和上面的n和s一样
info break 显示断点
info threads 显示当前所有的线程信息
thread number 切换线程
d number 删除number号断点
c 继续运行到下一个断点
bt 打印函数调用栈(可以用于查看死锁)
thread apply all bt 打印所有线程的栈
i registers 打印所有寄存器
disassemble 反编译
查看内存里面的内容:
格式:x/<n/f/u> <addr>
n、f、u、i是可选的参数,<addr>表示一个内存地址
1) n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
2) f 表示显示的格式
3) u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
4)i 把内存中的指令翻译成汇编,汇编级别的调试才能用上。
参数 f 的可选值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串格式显示变量。
参数 u 可以用下面的字符来代替:
b 表示单字节
h 表示双字节
w 表示四字 节
g 表示八字节
特殊用法:
1.条件断点。b line if xxx == yyy //当xxx == yyy时候触发第line行的断点。
例如:
(gdb) p record
$10 = {12, 76, 48, 62, 94, 17, 32, 37, 52, 69}
(gdb) p &record
$11 = (int (*)[10]) 0x8049740
(gdb) x/4uw 0x8049740
0x8049740 <record>: 12 76 48 62
(gdb) x/6ow 0x8049740
0x8049740 <record>: 014 0114 060 076
0x8049750 <record+16>: 0136 021
设置条件断点:
(gdb) b 13 if i == 8
Breakpoint 1 at 0x80483fa: filegdb_condition.c, line 13.