👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++
和Linux
还有算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍
前言
程序的发布方式可以分为两种模式:
debug
模式和release
模式。
- 在
Linux
下,gcc/g++
编译的程序默认是release
模式,而release
模式下是没有调试信息。- 如果在
Linux
要调试代码(debug
模式),编译时加上-g
选项。而程序一旦被调试,注定会有各种的调试信息,因此debug
下的可执行文件的大小一定会比release
的大小要大。如何验证编译的程序是debug
还是release
?# 查看二进制 readelf -S 可执行文件 | grep -i 'debug'
目录
一、安装gdb指令
gdb --version
大家首先在自己的云服务器指向以上命令,如果出现以下情况,那么你就要安装gdb
指令
# 安装指令
sudo yum install -y gdb
二、打开调试与关闭调试
2.1 进入调试模式
注意:调试的对象是已经生成的可执行文件。
gdb [可执行文件]
2.2 退出调试模式
q 或 quit
三、常见的调试指令
3.1 查看代码
l 数字
l 函数
那如果想查看整个代码怎么办?很简单,只要第一次输入l 1
,那么按回车后可接着往下展示(因为gdb会记录你最近一次执行的命令)
3.2 运行程序
这条指令一般配合断点使用。假设没有断点,那么程序会直接运行出结果;如果有断点,它会执行第一个断点。
r
3.3 打断点
b 行号
b 函数
b 源文件:行号
b 源文件:函数
注意:退出调试后,第二次打开gdb
,之前打的所有断点都会被自动清理;只要本次gdb
不退出,断点依旧存在。
3.4 查看断点
info b
断点详细信息简介:
Num
:代表断点编号。Enb
:表示断点的使用状态。y
表示启用,n
表示禁用。Address
:表示断点的地址。What
:代表断点在哪个函数以及行号。
3.5 取消断点
d 断点编号
3.6 跳到下一个断点
这个指令就是针对断点的,前面说过
r
只能执行第一个断点,但无法实现两个断点间的跳转(注:依然需要先通过r
指令把程序跑起来)
c
3.7 禁用断点
不删断点,只是把断点设置为禁用状态。
disable [断点编号]
3.8 解禁断点
enable [断点编号]
3.9 逐过程
- 对应着VS中的
F10
,即不会进入函数
n
3.10 逐语句
- 对应着VS中的
F11
,即会进入函数
s
3.11 监视窗口之查看变量
p [变量] # 临时显示变量信息
display [变量] # 常显示
undisplay + 编号 # 取消常显示
3.12 监视窗口之修改变量
set var 变量=你要修改的值
3.13 快速跳转
3.13.1 指定行
程序运行后,我们可以直接通过
until + 指定行
的方式跳转至指定行,这个指令通常用来跳过循环。
until + [指定行]
3.13.2 跳过整个函数
这个指令主要是针对函数的,直接
finish
就可以在不打断点的情况下,跑完当前函数
finish
3.14 查看当前栈帧
按照我的理解的话,这个指令就是查看调试到哪个函数的栈帧,并且还可以知道是哪个函数调用了哪个函数。
bt
3.15 显示当前栈帧里的所有变量
info locals