Linux开发工具gdb篇

Linux开发工具gdb篇_第1张图片

文章目录

  • 0.前言
    • debug版本
    • release版本
  • 1. gcc/g++的默认版本
  • 2. gdb使用
    • 进入 & 退出
    • 查看代码
    • 断点 & 跳断点
    • 逐过程 & 逐语句
    • 监视
    • 跳出循环 & 结束函数
  • 3. 常见指令

0.前言

debug版本

在我们平时写代码的时候,通常都是使用的debug版本,debug版本是可以进行调试的,它在形成可执行程序的时候,带有调试信息,能够方便我们更好地理解程序运行的情况和找出潜在的问题。

同时也因为带有调试功能,所以版本通常较大。

release版本

release版本是最终发给用户的版本,这个版本会精简和优化代码,提高程序的性能。

因为这所面对的是用户层面,用户只需要使用就行,调试信息对于多数用户来说都是无用的,所以release版本也不包含调试信息。

本篇将讲解Linux环境下的调试,之前有篇文字讲解过Windows环境下的调试:C语言——调试技巧,有兴趣可以点击查看。

1. gcc/g++的默认版本

在Windows的VS2022中,默认的是debug版本Linux开发工具gdb篇_第2张图片

而Linux中因为是纯指令,看不到是什么版本,这时候可以用gdb [可执行程序],查看当前程序是什么版本

Linux开发工具gdb篇_第3张图片

显式没有调试信息,我们可以可以readelf -S [可执行程序] | grep -i debug查看是否有调试信息

image-20230712123408417

这里也没有看到有调试信息,这就说明,gcc/g++默认编译是以release版本发布的

如果需要已debug方式发布,编译时需要加上-g选项:

Linux开发工具gdb篇_第4张图片

2. gdb使用

进入 & 退出

debug方式编译之后,就可以进入调试了。

进入gdb选项:gdb [可执行程序]

退出gdb选项:q

Linux开发工具gdb篇_第5张图片

查看代码

当进入gdb调试器之后,可以使用l [行号]查看代码

Linux开发工具gdb篇_第6张图片

gdb会自动记录上一次的指令,我们用了l选项之后,如果还想继续查看,直接回车即可

断点 & 跳断点

打断点可在调试时跳到断点处,进一步所需调试范围。

指令b [行号],就可以在指定的行号打上断点

Linux开发工具gdb篇_第7张图片

这里也不像在VS中,打一个断点就会有小红点,这里打完断点,我们需要用指令info b来查看当前我们所打的断点

Linux开发工具gdb篇_第8张图片

从一个断点跳到另一个断点,指令c即可,如果某处有问题,则跳不过来,就说明这个期间有问题,这样就能缩小调试范围

Linux开发工具gdb篇_第9张图片

我们打的断点会按顺序从1开始编号,如果要删除断点,则删除他们对于编号即可d [编号]

Linux开发工具gdb篇_第10张图片

同时,如果不想这个断点发货作用,同时也不想将这个断点删掉,就可以使用指令disable [编号]使其失效,要打开就是enable [编号]

Linux开发工具gdb篇_第11张图片

逐过程 & 逐语句

r指令开始执行程序,如果有断点,就会运行的接触的第一个断点处停下,然后我们可以选择是逐过程n还是逐语句s往下执行

Linux开发工具gdb篇_第12张图片

监视

如果要在调试的过程中查看变量的变化或者是递增,使用指令p [目标]display [目标]就能将监视的目标常显示

Linux开发工具gdb篇_第13张图片

如果这里常显示,前面也是有编号的,如果不想常显示,undisplay [编号]即可取消常显示

Linux开发工具gdb篇_第14张图片

跳出循环 & 结束函数

在调试时,如果进入了循环,发现问题并不在循环里面,可使用until [行数],跳出当前循环到达我们指定的地方

Linux开发工具gdb篇_第15张图片

如果进入了函数,并且也发现当前函数没有问题,可使用until [行数]跳出,也可以使用finish跑完该函数

Linux开发工具gdb篇_第16张图片

3. 常见指令

run(或 r):开始执行程序。

break(或 b):设置断点。可以指定断点的行号或函数名。

continue(或 c):继续执行程序直到下一个断点或程序结束。

next(或 n):执行下一行代码,但是不会进入函数调用。

step(或 s):执行下一行代码,并进入函数调用。

finish:执行当前函数的剩余部分,并返回到函数的调用点。

print(或 p):打印变量的值。可以使用表达式。

backtrace(或 bt):打印函数调用的堆栈跟踪。

info breakpoints(或 info b):列出当前设置的断点。

delete:删除指定的断点。

watch:设置观察点,当变量的值发生变化时暂停程序。

quit(或 q):退出GDB。

以上就是gdb的基本使用方法的,如果条件允许,我还是选择换在Windows环境调试。

那本期的分享就到这里咯,我们下期再见,如果还有下期的话。

你可能感兴趣的:(原创,Linux,linux,运维,服务器)