【Linux】调试器-gdb使用

大家好,我是苏貝,本篇博客带大家了解Linux的编译器-gcc/g++,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


1. 背景

程序的发布方式有两种,debug模式和release模式 。其中,debug模式可被调试(编译器形成可执行程序的时候会给可执行程序 添加调试信息, release模式不能被调试
Linux 中gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

如何证明由release变debug模式会添加调试信息呢?

(A) 看大小

先写出一个.c文件
在这里插入图片描述

再写出makefile的内容
在这里插入图片描述

Make生成mytest文件,它是可执行文件,是release模式的
在这里插入图片描述

修改makefile的内容

在这里插入图片描述

再生成mytest_debug文件,也是可执行文件,不过是debug模式的
在这里插入图片描述

我们发现,debug模式的文件大小大于release模式的

(B) 查看ELF格式的文件

readelf 命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库( * .so)或者静态库(*.a) 等包含ELF格式的文件。

在这里插入图片描述

Debug模式下比Release模式下多出了上图的可执行文件

以上2点可大体证明由release变debug模式会添加调试信息


2.使用

(A) 进入gdb

gdb +文件名,只有出现done才表示已经进入调试
在这里插入图片描述

(B) quit/q:退出gdb

在这里插入图片描述

© run/r:运行代码

(D) list/l:查看debug模式的可执行文件的依赖文件的内容

默认只显示10行
如果在进入调试并且操作后,在命令行直接按enter键,那么gdb执行的是上一条指令(例外:当上一条指令是list/l时,会打印出上一条指令下面的未打印的代码)

使用方式:

  1. list/l:将main函数作为中间,显示main函数的上下文
    在这里插入图片描述

  2. list/l 文件名:行号/函数名
    在这里插入图片描述
    在这里插入图片描述

  3. list/l 行号/函数名
    在这里插入图片描述

上面的3种方法都可以打印文件内容,可是我们发现代码大于10行,如何打印全部的代码呢?直接按enter键
在这里插入图片描述

当代码全部打印完后,再想打印就会跳出提示

(E) b:打断点

使用方法:

  1. b 行号/函数名
    在这里插入图片描述

  2. b 文件名:行号/函数名
    在这里插入图片描述

断点的作用:在run/r时,停在断点哪一行
在这里插入图片描述

注意:断点编号只会一直递增
如果我先删除编号为1的断点,即31行的断点,再在31行打断点,此时断电编号为5而非1

(F) info/i b:显示断点信息

在这里插入图片描述

断点信息:
Num:断点编号
Enb:使能,表示断电是否打开,y:打开,n:关闭

(G) disable 断点编号:使能关闭断点

未关闭断点2时,run/r停在第29行。关闭断点2,则停在31行
在这里插入图片描述

(H) enable 断点编号:使能打开断点

在这里插入图片描述

(I) d/d 断点编号:删除断点

d:删除所有的断点
d 断点编号:删除指定断点
在这里插入图片描述

(J) next/n:逐过程,F10

会一行一行的执行,如果遇到函数,则不进入函数,直接执行完函数

(K) step/s:逐语句,F11

会一行一行的执行,如果遇到函数,则进入函数

(L) print/p a/&a:查看变量a内容/地址

当我们用vs调试时,遇见循环时,能一边看着代码,一边看着变量的值/地址,Linux也可以实现
在这里插入图片描述
在这里插入图片描述

(M) display a/&a:一直查看变量a的值/地址

在上面的print/p命令中,想要知道每次循环时a/&a,就要在每次循环时print/p a/&a,很麻烦,且没有必要,所以出现了display,只要display a/&a,在每次循环时,自动出现a/&a

在这里插入图片描述

(N) undisplay 编号:取消对a/&a的一直查看

在这里插入图片描述

(O) continue/c:运行到下一个断点处

在这里插入图片描述

§ 运行结束所在函数后就停下来

在这里插入图片描述

(Q) until:跳转到指定行,中间的代码都已执行

在这里插入图片描述

(R)info/I locals:查看当前栈帧局部变量的值

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值