当前位置:   article > 正文

Linux开发工具(6)——gdb_linux gdb

linux gdb


gdb是Linux系统上的一个命令行式的调试工具

关于调试的思路是和Windows下一样的,先通过隔离来判断代码出错的大致范围,然后通过调试逐渐缩小排查区域最后找到bug进行修正。

gdb工具安装

如果没有安装gdb可以通过下面的指令一键安装gdb

sudo yum install -y gdb
  • 1

gdb指令

image.png
这段代码是我们即将进行调试的代码。
用该代码编译出来的可执行程序是process。
image.png

gdb process(可执行程序名称)

使用该指令可以使gdb打开可执行程序
image.png
这时候在下面输入指令是没有用的,因为此时的可执行程序中没有包含调试信息
可执行程序的版本有debug和release,Linux下的g++和gcc编译出来的可执行程序默认都是release版本的。

gcc test.cpp -o process_g -g 
//只需要在编译指令后加 -g 就可以使编译器以debug的方式进行编译
  • 1
  • 2

debug版本比release版本多包含了调试信息从哪可以看出?
1.文件大小
image.png
2.可执行程序的二进制内部结构
通过指令readelf -S process 就可以查看可执行程序的二进制信息。
image.png
当然是一堆我们看不懂的东西,但是通过grep进行行过滤之后我们可以找到关于debug有关的信息。
image.png
process_g包含了debug信息,process,release版本则没有。

为什么程序要有debug和release版本呢,首先debug包含调试信息,程序员可以对程序进行调试,但是用户不需要进行调试,因为我们不能给用户他不需要的东西,所以release版本呢就是去掉了调试信息并优化了可执行程序的速度。

查看代码 l 0

l是list的缩写,0就是开始显示的行号,也可以是其他数字。
image.png
这时候已经显示了一部分代码,如果想要继续显示下面的代码只需要按回车就行,gdb会记住你上次使用的指令,再次按回车就会重复执行。

添加断点 b 27

b是break的缩写,就是breakpoints断点的意思,27就是要添加断点的行号
image.png
这里就是在27行和29行添加了断点

查看断点 info b

image.png
通过info b可查看现在已经存在的断点,Num这一列是断点的编号。

删除断点 d 1

d是delete的缩写 , 1就是断点的编号(注意不是断点所在的行号)
image.png
通过d指令加断点的编号就能删除这个断点。

启动调试 r

r就是run的简写,作用就是启动调试跳转到第一个断点处。
如果程序中没有断点会直接跑完整个程序。
image.png
run之后程序执行了断点之前的代码并将结果输出到屏幕上,然后在第一个断点处27行停下。

如果在r之后再r一次
image.png
这时会提示程序debug已经开始了是否要重新开始。输入y就重头开始了。n就无效

逐过程 n

n是next的简写,就是类似vs中的F10
image.png
再函数内部使用n就是逐过程,一条一条的执行程序语句。

如果在函数入口处用n逐过程那么就不会进入函数内部,直接执行下一条语句。
image.png

逐语句 s

s是step的简写,就是类似vs中的F11
image.png
当断点处于27行,函数Add(10,100)这里的时候,使用s指令逐语句就可以直接进入函数,同时gdb会显示函数参数的值以及当前函数第一行的行号。

断点间跳转 c

c是continue的简写,就是从一个断点跳转到下一个断点。
image.png
当我们在最后一个断点处再次c的时候gdb会直接执行完剩下的所有指令

查看调用堆栈 bt

使用bt查看调用堆栈可以看到当前我们所处的函数是第几层,可以查看调用深度。
image.png
当前我处于Add函数内,所以调用堆栈上在main函数上压了Add函数

结束当前函数调用 finish

可以直接跑完当前所处的函数,并带回一个返回值。
image.png
当我进入Add函数中的时候,使用finish就可以直接跑完Add函数的逻辑,并且显示函数的参数,所在文件中的行号,函数地址,以及该函数在主函数中调用的位置,还有返回值是多少。

如果我们在main函数中使用finish,gdb不会直接跑完main函数而是会报错。
image.png
意思是,finish指令在最外层的栈帧中没有意义,也就是finish在main函数中使用没有意义。

监视 p num(变量名)

image.png
p除了可以用来显示上下文中变量的值之外,还可以显示变量的地址。当然使用p指令显示的变量只会显示一次,下次要看还需要再次输入p指令

常显示 display expr(变量或表达式)

image.png
当我们使用display将i变量常显示之后,随着代码的执行,i变量的值也会跟着变化。
对于已经常显示的变量会被记录在一个自动显示列表,使用info display可以查看。
image.png
每次单步运行显示在变量前面的数字就是变量的编号。

display还可以进行格式化显示
display/fmt expr
expr是变量或者表达式
image.png

取消常显示 undisplay

image.png
undisplay + 变量编号,就可以取消这个变量的常显示,如果直接用undisplay就是直接将所有的常显示的变量都取消常显示。

跳转到指定行 until x (行号)

image.png
使用until进行,行跳转的时候不能进入其他函数,且中间遇到断点会在断点处停止

例如现在代码的23行和27行各有一个断点,我现在在23行,想要使用until跳转到29行。
image.png
当第一次跳转的时候中间遇到27行断点停下来了。第二次跳转中间没有断点才跳转成功

修改变量值 set var i(变量名)

image.png
循环本来循环到i = 7,但是我们使用set var直接将i值修改成了5,下次显示变量i的值可以看到,i确实变成5了。

显示一个区域内的临时变量 info locals

功能类似与VS中的自动窗口。
image.png
作用都是显示一个局部范围内变量的值。
image.png
第一次的时候因为sum初始化还没有完成所以是随机值。
可以看出info locals打印出来的局部范围内的变量不是常显示。

使能断点 disable 2 (断点编号)

disable 2 使能断点,使之无效
enable 2 使能断点,使之有效
当我们执行代码的时候想要这个断点失效,但是不想删除这个断点的时候就可disable +断点编号使之不能。也就是失效了。
在info b显示的断点列表里面
image.png
Enb这一列就是Enable的缩写,y就是yes代表断点有效。
image.png
当我们将2号断点失效后,Enb就变成了n此时2号断点就失效了。
使用指令enable 2可以令断点2重新生效。
image.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/742374
推荐阅读
相关标签
  

闽ICP备14008679号