gdb是Unix及类Unix下的调试工具。在Windows下, 我们习惯用了有图形界面的,像VC, VS, BCB等IDE的调试,但如果是
在Unix或类Unix平台下开发, gdb是我们的首选 .
我们编写的程序可以有两种版本, Debug版本和Release版本, Linux中gcc/g++编译器默认是Release版本, Debug版本要
在编译时后面加上-g选项
Debug : 通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。
Release: 通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它
往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利
dgb调试的程序是Debug版本的, Release版本中没有调试信息
进入调试模式
gdb 需要调试的程序
//或者先直接进入gdb, 再用file选项装载需要调试的程序, 如下
gdb
file 需要调试的程序
调试进程
gdb attach pid(进程号)
命令 | 缩写 | 说明 | ||||||||
quit | q | 退出gbd调试 |
||||||||
list | l |
显示程序源代码, 默认显示10行
|
||||||||
运行相关 | ||||||||||
run | r | 运行程序(相当于第一次按VS中的开始调试F5), 运行到第一个断点"暂停" | ||||||||
start | sta | 运行程序,在main函数的第一条语句前面停下来 | ||||||||
continue | c | 继续运行, 运行到到下一个断点"暂停"(需要先执行run命令), (相当于VS中第1次按F5之后按的F5的作用) |
||||||||
next | n | 执行下一条语句, 碰到函数不会进入函数体, (相当于VS中的逐过程F10) | ||||||||
step | s | 执行下一条语句, 碰到函数会进入函数体, (相当于VS中的逐语句F11) | ||||||||
kill | k | 终止正在调试的程序 | ||||||||
断点相关 | ||||||||||
break | b | 设置断点, b [num] , 第num行设置断点 | ||||||||
info breakpoints 或info break |
i b | 查看断点信息 | ||||||||
delete breakpoints | d (或d break) | 删除断点, d 为删除全部, d [num] 删除指定的断点 | ||||||||
disable breakpoints | dis b | 禁用断点 dis b 禁用所有, dis d [num] 禁用指定的断点 | ||||||||
enable breakpoints | en b | 启用断点 en b 启用所有, en d [num] 启用指定的断点 | ||||||||
变量相关 |
||||||||||
p | 打印局部变量的值 | |||||||||
display | disp | 监视一个变量,每次停下来(到断点处停下)都显示它的值 | ||||||||
watch |
wat |
监视变量值的变化, 与display区别是, 所监视变量每次变化都会打印出来 |
||||||||
info watchpoints | i wat | 查看设置的监视 | ||||||||
undisplay | und | 取消对监视变量的监视, undisplay [num], 取消指定的监视, undisplay 取消全部 | ||||||||
set var | 无 | 在调试过程中修改变量的值, set var 变量 = 指定的值 | ||||||||
whatis | wha | 显示变量的类型 . whatis 变量 | ||||||||
info locals | i lo | 查看当前栈中变量的值(当前函数作用域中的局部变量) | ||||||||
info registers | i r | 显示所有寄存器的当前值 | ||||||||
函数相关 | ||||||||||
finish | fin | 运行到当前函数结束, 到下一条语句"暂停"等待命令 | ||||||||
breaktrace | bt |
查看各级函数调用及参数 | ||||||||
堆栈相关 | ||||||||||
frame | fra | 查看调用堆栈 | ||||||||
where | whe | 查看调用堆栈 | ||||||||
disassemble | disas | 反汇编当前函数或指定函数 |
TUI(TextUser Interface)为GDB调试的文本用户界面,可以方便地显示源代码、汇编和寄存器文本窗口,TUI使用效果如
下图所示。
想想自己再VS中写个代码不能说是多爽吧, 但好歹界面好看, 好用, 有界面啊. 来怀念一下, VS
想想gdb中看个代码都要list, 别扭的不行, 不过好在gdb还有个TUI模式
在我们用gdb调试程序时, 按Ctrl+x+a就可以进入TUI模式, 再按Ctrl+x+a就可以退出TUI模式
在TUI模式中,可以显示以下几个窗口:
当进入TUI模式时, 默认是源代码窗口, 我们可以输入gdb命令, 如下设置断点, 每设置一个断点, 就会在左边对应行数显示b+, 当禁
用断点时会在对应行显示b-, 当这个断点处运行过一次后, 就显示为B+
+
表示该断点处于启用状态-
表示该断点处于禁用状态按r运行, TUI中用 > 标识程序运行到哪一行, 并高亮这一行
再按s(step), 单步执行, 可以看到, 运行到
TUI有时可能会出现显示重叠的bug, 按下Ctrl+l 刷新一下就好了
查看源代码, 可以用键盘上的PgUp 和 PgDn, 和上下左右.
当需要显示其他窗口时, Ctrl+x+2显示两个窗口, Ctrl+x+1, 显示一个窗口.