3.6、linux调试器:gdb

个人主页:Lei宝啊 

愿所有美好如期而遇


背景

程序员在做项目写代码时,每完成一个功能,需要自己先测试·一下,看看能不能跑之类的,然后交给测试人员,但是测试人员就代表着用户,用户不需要调试,他们只需要最好的体验,所以程序员给测开人员的代码版本应该是release,而不是debug,但是程序员需要调试,所以程序的发布方式就有了两种,debug和release。·

Linux中,gcc和g++出来的二进制程序默认是release版本,我们需要使用gdb,那么就需要在源代码生成二进制程序时,加上-g选项。

使用

先导准备

3.6、linux调试器:gdb_第1张图片

3.6、linux调试器:gdb_第2张图片


 接下来开始使用gdb进行调试

3.6、linux调试器:gdb_第3张图片

我们进入调试后是看不见任何代码的,这对于我们来说是不可忍受的。

list 打印代码,我们实际使用时可以简写为l,后面加上空格和0时表示从头开始打印

3.6、linux调试器:gdb_第4张图片

 直接l就可能会像上图,可能与上次进入光标有关

3.6、linux调试器:gdb_第5张图片

 而且gdb自动记录最近的一条指令,我们输入l后,下一次直接回车,就相当于输入了list

代码是有了,我们可以开始调试,对应在

Visual Studio中,是F5

gdb中,我们输入run,简写为r

3.6、linux调试器:gdb_第6张图片

 由于我门并没有打断点,就直接执行完了。

那么如何打断点呢?

break 行号,简写为b 行号

info b查看断点 (info breakpoints),简写为i b

3.6、linux调试器:gdb_第7张图片

我们可以打断点了,那么如何执行语句往下走呢?

在Visual Studio中,我们有F10和F11,分别是逐语句和逐过程

gdb中,我们使用next和step,简写为n和s 

 我们先只使用next3.6、linux调试器:gdb_第8张图片

 接下来使用step

3.6、linux调试器:gdb_第9张图片

直接r,然后y,就可以不退出重新调试

进入函数后,发现循环很长,如何跳过?

 until 行号 ,执行到行号所在行

3.6、linux调试器:gdb_第10张图片

或者干脆想退出函数

那就这样做

finish,执行到当前函数结束

3.6、linux调试器:gdb_第11张图片

我们的思路再重头来过介绍其他指令

打断点打在某个函数上

break 函数名,简写为b 函数名

3.6、linux调试器:gdb_第12张图片 breakpoint already hit 1 time表示断点被命中。

我们能不能从一个断点执行到下一个断点呢?

continue 简写为c

3.6、linux调试器:gdb_第13张图片

我们发现断点的执行顺序不是按照序号的,而是按照代码的执行顺序。

那么接下来如何删除断点呢?

delete breakpoints删除所有断点,简写为d

delete breakpoints 断点序号 简写为d 序号

3.6、linux调试器:gdb_第14张图片3.6、linux调试器:gdb_第15张图片

 如何禁用断点,如何启用断点?

disable breakpoints 断点序号,简写为disable b 序号,不可写成d b 序号(踩过坑了)

3.6、linux调试器:gdb_第16张图片

我们发现Enb那一栏由y变成了n,yes-->no

enable breakpoints 断点序号,启用断点 ,简写为enable b 序号,不可写成 e b 序号

接下来我们想到Visual Studio可是有监控窗口的,并且可以查看变量的值,gdb呢?

print,我们可以简写为p,意思是打印值,变量或者表达式的值。

3.6、linux调试器:gdb_第17张图片

3.6、linux调试器:gdb_第18张图片

 但是监视窗口一般是常显示,我们如何进行常显示?

display变量名,跟踪查看变量,并常显示。

undisplay变量名,取消对变量的跟踪。

3.6、linux调试器:gdb_第19张图片

 现在我们还有一个需求,在不退出调试的情况下修改变量的值

这里写错了,修改一下。

3.6、linux调试器:gdb_第20张图片

set var 变量,设置变量的值

3.6、linux调试器:gdb_第21张图片

bt,查看调用堆栈 

3.6、linux调试器:gdb_第22张图片 

quit,退出gdb调试

 

你可能感兴趣的:(Linux,Linux)