[Linux]Linux调试器-gdb

文章介绍了Linux中使用GDB调试器进行程序调试的方法,包括安装GDB、使用readelf检查程序是否包含调试信息、设置断点、运行及控制程序、查看变量值等基本操作。同时,解释了debug和release两种版本的区别,debug模式包含调试信息,适合开发阶段,而release模式优化了代码并去除了调试信息,适用于最终用户。

🥁作者 华丞臧.
📕​​​​专栏【LINUX】
各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注)。如果有错误的地方,欢迎在评论区指出。
推荐一款刷题网站 👉 LeetCode刷题网站



前言

  • 在vs当中,我们知道可执行程序的发布方式有两种:debug和release模式;
  • Linux gcc/g++出来的二进制程序,默认是release模式;
  • 要使用gdb调试,必须要在源代码生成可执行程序的时候,加上-g选项。

gdb调试器

在Linux中,虽然和windows的调试器思路上是一样,但是其各自的操作方式却大不相同,gdb就是Linux上的调试器。

//安装gdb
sudo yum install -y gdb

//调试程序
gdb [文件名]

在这里插入图片描述
当我们安装好gdb准备调试程序时,gdb会告诉我们无法调试,这是因为默认情况下Linux中用gcc/g++生成程序是release模式,是无法直接被调试的。

为什么有debug和release两种版本?
首先我们要了解什么是debug和release:

  • debug:通常称为 调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。
  • release:通常称为 发布版本,是给用户使用的,一般客户不需要在发布版本上进行调试;所以不保存调试信息,同时,进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。
  • 程序员经常需要进行代码编写以及调试程序,那么就需要以debug版本发布以保证程序是可以被调试的;用户不需要关心软件是否可以debug用户也不需要,用户的需求就是软件怎么用以及好不好用。

debug版本发布选项如下:

  • -g生成以debug模式生成二进制程序

加上-g选项后,我们就能使用gdb开始调试了,并且我们可以发现release版程序要比debug版程序体积小
在这里插入图片描述
在这里插入图片描述

readelf指令(了解)

功能:读取程序内部相关符号表。
其命令格式如下:

readelf -S [文件名] 

//筛选出debug
readelf -S [文件名] | grep debug

可以看到debug版的程序中添加了很多调试信息,而release版的程序当中并没有添加。
在这里插入图片描述

gdb操作

调试代码如下:

//test.c文件中的代码如下:
#include <stdio.h>    
#include <time.h>    
    
void Print(int val)    
{    
    long long timetmp = time(NULL);    
    printf("val = %d, timetmp: %lld\n", val, timetmp);    
}    
    
int GetSum(int begin, int end)    
{    
    int ret = 0;    
    
    for (int i = begin; i <= end; ++i)                                                                                           
    {    
        ret += i;    
    }    
    
    return ret;    
}    
    
int main()    
{    
    int val = GetSum(0, 100);    
    Print(val);    
    return 0;    
} 

查看代码

查看代码:list 简称 l

在这里插入图片描述

从第n行开始显示:l + n 

在这里插入图片描述

l 从上一次的结尾处开始显示,
gdb默认会记住历史上曾经的指令

代码在gdb调试器中的行数如下图:
在这里插入图片描述

退出gdb

退出调试:quit 简称 q

在这里插入图片描述

断点

打断点:break 简称 b   格式:b + n(行号)

在这里插入图片描述

查看断点:info break || info b 

在这里插入图片描述

删除断点:delete 简称 d  格式:d + n(编号)

在这里插入图片描述

禁用断点:disable  n(断点编号)
启用断点:enable n(断点编号)

在这里插入图片描述

断点被禁用时,程序直接运行到结束:
在这里插入图片描述

运行程序

运行程序:run 简称 r

在这里插入图片描述

逐过程调试:next 简称 n

逐过程就是不进入当前行的函数内部,直接把函数跑完。(vs上的F10
在这里插入图片描述

逐语句:step 简称 s

逐语句就是进入当前行的函数内部,逐语句执行。
(vs上的F11)

在这里插入图片描述

逐断点:continue 简称 c

在这里插入图片描述

跳转到指定行:until + n(行号)

注意:使用until跳转时中间不能有断点,否则会停在断点处,并且跳转到空行处会被执行到下一行。
在这里插入图片描述

查看调用堆栈

查看堆栈:bt

在这里插入图片描述

执行整个函数

finish:执行到当前函数返回,然后停下来等待命令

在这里插入图片描述

查看变量的值

查看变量的值:p + 变量名

在这里插入图片描述

常显示变量的值:display

在这里插入图片描述

取消常显示:undisplay + n (n表示编号)

在这里插入图片描述

其它

  • set var:修改变量的值;(格式:set var [变量名]=N)
  • info locals:查看当前栈帧局部变量的值。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华丞臧.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值