如何在Linux环境下调试代码(类比VS2022学习简单易懂 快来鸭!)

目录

1. 前言

2. 准备工作

3. 使用gdb调试代码

3.1 显示代码

3.2 VS2022的调试

3.3 gdb基础操作

3.4操作演示

3.5 实际操作技巧

3.6 补充指令

 4. 稍作总结


1. 前言

不同于VS2022等大部分编译器是一个集成开发环境 , 即编写 编译 运行 调试 发布等一条龙服务 , 纯Linux下这些功能模块是分开的。在Linux操作系统中我们编写代码主要使用的是vim工具 , 编译代码使用的是gcc/g++ , 而调试代码我们主要使用的则是gdb工具

2. 准备工作

在介绍gdb工具之前 , 需要我们先生成一个可Debug的可执行文件 , 因为我们gdb调试的对象是编译好的可执行文件。[gdb + 编译好的可执行文件]

Linux中gcc/g++直接编译后生成的可执行文件是不可以用gdb调试的。原因我们可以类比VS2022中的编译出的两大版本 -Debug/Release 来探究 , Release是发行版本 , 不包含任何调试信息 , 也就是说 , 只有包含调试信息的可执行文件 , 即Debug版本下 , 我们才能对之调试。 

gcc/g++ 编译文件 , 默认是编译出的是Release版本 , 所以需要我们gcc/g++加 -g 选项 , 生成的可执行文件才会带调试信息(Debug版本) , gdb才可以对之调试。

3. 使用gdb调试代码

我们在命令行中输入 gdb + 可执行文件 , 即可进入gdb调试。

3.1 显示代码

我们要调试代码 , 首先要看到原来的代码 , 所以我们首先要学习的是 l 指令 (l  -list的缩写) , 即以列表的形式打印文件中的10行代码

如果 l 后面加行号数字 , 如 l 7 , 则是显示第7行代码以及前4行与后5行代码 , 再继续输入 l 指令 , 则可以继续向下显示10行代码。 

如果 l 后面加函数名 , 则可以打印出该函数体的代码

3.2 VS2022的调试

熟练在VS系列中写代码调试的我们知道 , 在VS2022中 , F9是打断点 , F5是调试 , F10是逐过程 , F11是逐语句 , 同时我们也可以在VS界面中调出 监视窗口 , 实时观察各个变量的值

3.3 gdb基础操作

下面我们以类比VS的方法来看gdb中的调试基础操作:

F5调试  :   r(run) 开始调试           continue  继续调试运行直至到下一个断点处 。

(前者r(run)是VS2022中一开始按F5开始调试 , continue是后续F5到下一个断点的作用)

例如  :  在调试运行的时候在某行打断点后 ,  输入continue再运行至断点处。 

F9打断点  :  b(breakpint) + n(欲打断点的行号数)        

例如  :  b 6 在第六行打个断点

F10逐过程 :  n(next)调试运行到下一句 (遇到函数体接口不会进入该函数体内部代码 , 直接跳过)

F11逐语句 : s(step)调试运行到下一句 (遇到函数体接口会进入该函数体内部代码进行调试)

监视窗口 , 设置追踪的变量 :

例  :  display  a    [设置对变量a值的窗口监视]

例  :  display  &a  [设置对变量a地址值的监视]

取消对某个变量的追踪监视 :

例  :  undisplay  a    [取消对变量a值的窗口监视]

例  :  undisplay  &a  [取消对变量a地址值的监视]

暂时一次性查看某变量现在的值 :

例  :  p a       [查看现在变量a的值]

例  :  p sum  [查看现在变量sum的值] 

继续调试直至结束当前函数体 : 

调试时 , 如果我们不小心进入某个函数体内部 , 但是我们又不想继续在该函数体内调试 , 可以finish结束该函数体的调试。

调试运行直至到某行 : 

until + n (从当前行一直调试运行到第n行再停下)

3.4操作演示

首先我们 l -list 展示一下欲调试的代码 : 

3.5 实际操作技巧

调试举例一 : 

VS调试过程中我们进入了一个函数后 , 如果我们后悔进入调试这个函数了, 我们当然可以连续F10 F11逐步调试走出去。不过主要省力的方法 , VS中我们可以先在外面打一个断点F9, 然后再F5跑到下一个外部的断点, 就可以跑出去了。

仿照VS中这种方法 , 在Linux gdb中 , 我们可以在外面的行中 b (breakpoint) 打一个断点 , 然后c (continue)直接调试跑到该行 , 从而跑出该函数体。

或者在Linux gdb中 , 我们也可以直接finish跑出我们现在调试所处的函数体

调试举例二 :

我们要快速定位到一个BUG报错出现的位置 , 在VS中 , 我们只能通过F9打断点 , 然后F5调试到断点处来逐模块查找(或者F10 F11一行一行寻找报错)

在Linux gdb中, 我们也可以仿照VS , 来 b (breakpoint) 打断点 , 然后c (continue)直接调试至断点 , 从而分模块排查。在找到该模块后 , 在Linux gdb环境下我们还可以继续使用until + n直接调试至第n行来精准的定位。

调试举例三 :

你进入了一个循环 又是很后悔进入这个大循环模块 , VS中我们可以先在外面打一个断点F9, 然后再F5跑到下一个外部的断点, 就可以跑出去了。

在Linux gdb中 , 我们也可以仿效VS , b (breakpoint) 打断点 , 然后c (continue)直接调试至断点处 , 从而逃离循环 。

Linux gdb中 , 我们的对策也可以是until+n 直接调试运行到第n行 。

3.6 补充指令

在gdb调试中 , 输入bt指令 , 就可以查找现在的函数栈帧展开情况

gdb调试中 , 也可以像VS中直接在调试中改变一个变量的值

VS : 在监视窗口非常外挂的将变量值改变。

gdb : 输入 set var a=10 ,即可在调试过程中直接把a变量的值变为10 , 再往后调试则变量a的值是10。

 4. 稍作总结

这就是Linux环境下gdb调试工具的使用方法 , 以及gdb调试在实战中的演示。

博主最想告诉大家的只有一点 : 多练才能掌握gdb调试 !!!

  • 15
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值