gdb 

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(进程号)

 <Enter>回车, 执行输入的命令, 当没有输入命令时按<Enter>会执行上一条命令

指令集

命令缩写说明
quitq

退出gbd调试

list

l

                                    显示程序源代码, 默认显示10行

l

从源代码开头往下显示, 再次输入l 接着上次往下显示

l [N]

N为数字, 以第N行为中心, 显示10行(向上显示5行, 向下显示4行)
l 函数名以函数定义出为中心, 显示10行(向上显示5行, 向下显示4行)
l -显示刚才打印过的源代码之前的代码
运行相关  
runr运行程序(相当于第一次按VS中的开始调试F5), 运行到第一个断点"暂停"
startsta运行程序,在main函数的第一条语句前面停下来
continuec

继续运行, 运行到到下一个断点"暂停"(需要先执行run命令), (相当于VS中第1次按F5之后按的F5的作用)

nextn执行下一条语句,  碰到函数不会进入函数体, (相当于VS中的逐过程F10)
steps执行下一条语句,  碰到函数进入函数体, (相当于VS中的逐语句F11)
killk终止正在调试的程序
断点相关  
break b设置断点, b [num] , 第num行设置断点

info breakpoints

或info break

i b查看断点信息
delete  breakpointsd (或d break)删除断点, d 为删除全部, d [num] 删除指定的断点
disable breakpointsdis b禁用断点 dis b 禁用所有, dis d [num]  禁用指定的断点
enable breakpointsen b启用断点 en b 启用所有, en d [num]  启用指定的断点

变量相关

  
printp打印局部变量的值
displaydisp监视一个变量,每次停下来(到断点处停下)都显示它的值

watch

wat

监视变量值的变化, 与display区别是, 所监视变量每次变化都会打印出来

 info watchpoints       i wat查看设置的监视
undisplayund取消对监视变量的监视, undisplay [num], 取消指定的监视, undisplay 取消全部
set var在调试过程中修改变量的值, set var 变量 = 指定的值
whatis wha显示变量的类型 .  whatis 变量
info localsi lo查看当前栈中变量的值(当前函数作用域中的局部变量)
info registers i r显示所有寄存器的当前值
函数相关  
finishfin运行到当前函数结束, 到下一条语句"暂停"等待命令
breaktrace

bt

查看各级函数调用及参数
堆栈相关  
framefra查看调用堆栈
wherewhe查看调用堆栈
disassemble disas反汇编当前函数或指定函数

TUI模式

TUI(TextUser Interface)为GDB调试的文本用户界面,可以方便地显示源代码、汇编和寄存器文本窗口,TUI使用效果如

下图所示。

想想自己再VS中写个代码不能说是多爽吧, 但好歹界面好看, 好用, 有界面啊. 来怀念一下, VS

想想gdb中看个代码都要list, 别扭的不行, 不过好在gdb还有个TUI模式

在我们用gdb调试程序时, 按Ctrl+x+a就可以进入TUI模式, 再按Ctrl+x+a就可以退出TUI模式

在TUI模式中,可以显示以下几个窗口:

  • 命令窗口  : 用于GDB调试时的命令输入和命令结果输出显示,与普通GDB窗口无异。不管在哪个模式下, 都会显示在下面
     
  • 源代码窗口 : 用于显示程序源代码,包括当前运行行、中断以中断标识等。
     
  • 汇编窗口  : 显示当前程序的汇编代码。
     
  • 寄存器窗口 : 显示处理器的寄存器内容,当寄存器内容发生改变时会高亮显示

当进入TUI模式时, 默认是源代码窗口, 我们可以输入gdb命令, 如下设置断点, 每设置一个断点, 就会在左边对应行数显示b+, 当禁

用断点时会在对应行显示b-, 当这个断点处运行过一次后, 就显示为B+

  • B表示断点处代码已经运行至少一次
  • b表示断点处代码还没有运行到
  • +表示该断点处于启用状态
  • -表示该断点处于禁用状态

按r运行, TUI中用 > 标识程序运行到哪一行, 并高亮这一行

 再按s(step), 单步执行, 可以看到, 运行到

 TUI有时可能会出现显示重叠的bug, 按下Ctrl+l 刷新一下就好了

查看源代码, 可以用键盘上的PgUp 和 PgDn, 和上下左右. 

当需要显示其他窗口时, Ctrl+x+2显示两个窗口,   Ctrl+x+1, 显示一个窗口.

Logo

更多推荐