• 基础gdb操作【Linux】


    一.gdb

    1.1 什么是gdb

    想必大家应该都在Linux中写过代码,没写过的应该也不会点进这篇博客了。
    (毕竟没写过也用不上gdb)
    gdb是linux中的一种调试工具,可以帮我们进行断点,逐语句,逐过程的调试。
    让我们在Linux中也能体会到在WIN中码代码的感觉。

    1.2 安装gdb

    了解了gdb后,那想要使用gdb第一件事肯定是安装gdb了。
    先进行检查是否系统是否自带gdb

    gdb --version
    
    • 1

    在这里插入图片描述
    如果显示了版本号就代表自带gdb了。

    但是如果没有的话也没事

    sudo yum install gdb
    
    • 1

    直接安装即可
    在这里插入图片描述

    我因为自带所以就不用安装了。

    1.3 如何进入gdb模式

    1.3.1 release/debug

    现在既然装好了gdb,那就是如何使用了。

    还记得我们之前码代码的时候,代码有两种模式:
    debug/release
    release是发行版本
    debug是调试版本
    我们想用gdb对代码进行调试,那首先的要求就是代码可以被进行调试
    所以我们要将代码设置成debug模式。

    • 但是Linux中代码默认模式是release版本

    1.3.2 进入debug

    所以这个时候就要在编译代码的时候将其设置为debug模式

    gcc test.c -o test -g
    
    • 1

    这里的-g就代表以debug模式编译代码。
    在这里插入图片描述

    这里发现-g加不加没有啥变化,但是如果用

    readelf -S 文件名 | grep -i debug
    
    • 1

    来查看调试信息
    在这里插入图片描述

    就会发现多出了很多debug的文件

    我们来看看不加-g的结果是怎么样的
    在这里插入图片描述
    这里会发现grep没有在test中查找出具有debug的文件。

    1.3.3 进入gdb调试模式

    这里在确保自己的可执行文件是debug版本
    就可以进入gdb的调试模式了

    gdb 文件名
    
    • 1

    即可在这里插入图片描述

    二.基础操作

    这里为了方便进行操作,所以在test.c中特地写了一段简单的循环
    在这里插入图片描述

    2.0 list 行号和 r

    2.0.1 list 行号

    在这里插入图片描述
    进入gdb后第一个疑问就是没有代码。
    调试肯定是要看到源代码的啊
    所以我们便来了第一个指令
    list/l 行号
    在这里插入图片描述
    l后跟了一个1,代表显示从第一行开始的十行
    但是这里我们发现程序没有显示完全。

    但是我们只要再按一次回车即可
    因为gdb记住了上个指令,l 1执行完以后显示到10行,所以接下来直接按回车,
    linux程序会自动执行l 11的指令
    .

    在这里插入图片描述
    所以这里只需要按一次回车即可

    在这里插入图片描述
    不带 数字的l,第一次默认从零开始
    但是如果不是第一次,那就默认从上次记忆的l位置处执行

    所以:想要最快显示全部代码,打个l,不停按回车即可

    2.0.1 r/run

    r算是即显示代码之后最基础的指令了

    r是run的缩写,所以毫无疑问就是执行代码的意思

    2.1 断点操作

    b/break
    b是break的缩写。

    2.1.0 打断点

    b 行号
    
    • 1

    很明显,代表的意思是在行号上打个断点

    b 函数名称
    
    • 1

    代表的在函数上打断点

    b test.c:行数/函数名称   
      文件名   文件名中的行数或者函数名称
    
    • 1
    • 2

    这个可以在另一个文件上进行添加断点的操作。
    在这里插入图片描述

    2.1.1 查看断点信息

    这里打了断点后,我们发现这边代码上并没有进行标注哪里有断点。
    在这里插入图片描述
    所以想要查看断电信息

    
    info b
    
    • 1
    • 2

    在这里插入图片描述
    这里我们能看到打的断点信息

    num是断点序号
    type就是类型
    enb就是断点是否开启
    address就是断点地址
    what就是断点位于程序的位置

    2.1.2 删除断点

    这里我们通过上面的info b,能发现多了一个相同行号的断点

    我们可以通过

    d 断点序号
    
    • 1

    来进行删除,断点序号就是info b中的num属性
    在这里插入图片描述
    这里就能看见完成了对断点的删除

    2.1.2 断点开关闭

    disable 断点序号 设置断点关闭
    enable 断点序号 设置断点开启

    断点开关闭,就是控制断点是否有效。
    就是info b中的enb属性

    在这里插入图片描述
    这里我们关闭了断点,可以发现2号断点enb变成了no

    2.2 程序执行操作

    打了断点以后我们就可以进行程序的运行测试了。

    我们打了断点后,不能直接用以下指令
    我们首先需要用r将代码跑起来,才能使用下列指令

    2.2.1 n 逐过程

    2.2.2 s 逐语句

    在这里插入图片描述
    这里能发现程序左边的数字,代表的是程序运行到了哪一行,并且会显示当前运行的代码

    2.2.3 finish:直接跑完函数

    2.2.4 c:从一个断点处运行到下一个断点

    这里就不进行演示了,因为效果大差不差。

    2.3 其他指令

    我们能打断点了,能进行一步一步运行代码了。
    现在差的就是显示当前行的变量值了。

    2.3.1 display 变量名:展示变量

    在这里插入图片描述
    这里我们能用display让程序恒显示对应的变量
    在这里插入图片描述

    2.3.3 info locals:本地变量

    在这里插入图片描述
    这个指令可以用来显示当前本文件中的所有本地变量的当前值

    2.3.4 bt:查看从开始到现在的调用堆栈

    在这里插入图片描述
    bt是用来显示调用堆栈的,在递归中有明显的表现。
    在这里插入图片描述
    这里随便写了个递归来测试。
    在这里插入图片描述
    这里还是十分明显的

    2.3.5 ctrl+d/q退出gdb

    用当前快捷键可以直接推出gdb模式。

  • 相关阅读:
    阿里二面:SpringBoot如何优雅地进行响应数据封装、异常处理?
    通用BIOS自动化修改脚本
    解决:用mybatis写select语句根据属性查询出主键为null,其他数据正常显示
    MobaXterm 远程linux服务器图像界面打不开
    优雅的使用String字符串处理各种类型转换
    05. DataTemplate
    vacuum full table释放表占用的空间
    yaml语法
    npm run serve启动报错npm ERR! Missing script: “serve“
    申报绿色工厂的流程、费用和资料大全。
  • 原文地址:https://blog.csdn.net/Ruaaa_iiiiiiiii/article/details/133922924