所谓gdb,是Linux下一种常见的调试工具,在写一些简单的项目的时候还是很有益处的,但是如果项目较大,设计到很多进程之类的,不建议用gdb,而建议用printf函数来检测问题所在。使用gdb调试,需要在gcc编译时加上-g,例如gcc file.c -g -o app.下面是gdb的一些常用的快捷键,仅供大家参考。
(以下括号内均代表简称,若快捷键后面没有跟括号,则代表此快捷键暂无简称)
help(h), 按模块列出命令行。
list(l), 显示代码,查看当前代码。
start,开始运行。
run(r), 全速运行。
next(n),下一步,此下一步是指逐过程的下一步,相当于vs里面的F10快捷键,调试时把一个函数当成一步。
step(s), 下一步,此下一步是逐语句的下一步。相当于vs里面的F11快捷键,调试时进入函数一步一步调试,但是仅可以跳进自己写的函数里面,不能跳进c标准库函数 里面,例如fopen函数等等。
print(p),打印
break(b)+行号/函数名,在gdb里分配的行号里设置断点,此行号不是你自己写的函数所对应的行号。
info(i),查看gdb内部局部变量的数值。
info breakpoints, 显示断点。
enable breakpoints,启用断点。
disable breakpoints,禁用断点,一般都直接退出了,所以很少用。
continue(c),继续,在断点前停下来。
breaktrace(bt),显示函数调用的栈桢和层级关系,(回调函数里面观察的最为明显)。
frame(f)+栈桢号(此栈桢号通过breaktrace得来),切换函数的栈桢。虽然此时切换了栈桢,但若此时执行下一步,仍然是原来栈桢执行的下一步,而不是切换后的下 一步。
set var n=100.设置变量的值。
Ctrl+p,上翻命令。
quit,结束gdb。
finish,结束当前函数,返回到函数的调用点。
display,设置观察变量,此后每次下一步都会显示设置的变量的值。
watch,被设置观察点上的变量发生修改时,打印显示。
info(i) watch, 显示观察点。
undisplay+编号,取消观察变量。
x,查看内存。
core文件,可以看到程序断之前执行到哪儿了,进而找出出错的原因。但是Ubuntu里面默认的core文件大小为0,所以无法往里面写东西,如果想要打开它,只需要用
ulimit -c 1024(给文件设置大小)开启core文件即可,调试时用gdb app core.
在fork()中,既有父进程又有子进程时,用set follow_fork_mode child来跟踪子进程,用set follow_fork_mode parent来跟踪父进程,但是这种在多进程里面不是很好 用,如果程序里面是一个死循环的话,可能会导致无法结束,这时只能用kill来杀死进程号可以解决。