使用gdb调试时,编译程序时应该加上 -g 选项。
一些常用的gdb 命令:
b 6 | 在第6行打断点 |
b a.c:5 | 在a.c文件的第5行打断点 |
b funa | 在函数funa处打断点 |
b 7 if i=10 | 当第7行的i=10时,程序停止 |
b funa if i=10 | 当funa中的i=10时,程序停止 |
info b | 打印所有的断点信息 |
clear | 清除所有的断点 |
clear 6 | 清除第6行的断点 |
clear funa | 清除函数funa的断点 |
delete 2 | 清除第2个断点(断点有编号) |
c | 执行到下一个断点处 |
n | 单步执行,执行下一行语句 |
s | 当调试当前行是个函数时,可以进入函数内部 |
finish | 立刻执行完当前函数 |
until | 结束当前循环,一般是进入for循环次数过多,用until可以直接运行完循环 |
whatis var | 查看var的数据类型 |
ptype var | 查看var的数据类型,能够显示具体的结构体内容,比whatis 好用。如果是嵌套结构,可以使用ptype var.member查看齐结构 |
where | 查看当前执行到哪一行 |
p var | 打印var 的值 |
p/x var | 以16进制打印var 的值,如果是字符串 |
p *var | 打印指针var指向的内存值,如果是个结构体,也是可以全部打出来的,按照key=value的结构显示 |
p *a@14 | 打印从a地址开始的14个字节 |
info | 查看以info开头的命令集 |
info type | 查看当前程序涉及的所有数据类型 |
gdb 加载core 文件,gdb 应用程序 core文件,然后用where 查看栈信息,就能定位到是哪个文件的第几行程序挂了。