• 【Linux】GDB调试器学起来!指令全解,建议收藏


    在这里插入图片描述

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
    📃个人主页 阿然成长日记 👈点击可跳转
    📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
    🚩 不能则学,不知则问,耻于问人,决无长进
    🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

    一、GDB引入

    我们在vs2019中进行调试,可以使用基本调试键F5、F9、F10、F11等对代码进行调试,它是一种可视化的操作,使用起来很方便易懂。但是在linux中,,想对一段代码去进行调试呢,此时就要使用到Linux下的调试器gdb。

    二、gdb指令大全汇总

    l(list) 行号/函数名显示对应的code,每次10行
    r(run)F5【无断点直接运行、有断点从第一个断点处开始运行】
    b(breakpoint) + 行号在那一行打断点
    b 源文件:函数名在该函数的第一行打上断点
    b 源文件:行号在该源文件中的这行加上一个断点吧
    info b查看断点的信息breakpoint already hit 1 time【此断点被命中一次】
    d(delete) + 当前要删除断点的编号删除一个断点【不可以d + 行号】若当前没有跳出过gdb,则断点的编号会持续累加
    d + breakpoints删除所有的断点
    disable b(breakpoints)使所有断点无效【默认缺省】
    enable b(breakpoints)使所有断点有效【默认缺省】
    disable b(breakpoint) + 编号使一个断点无效【禁用断点】
    enable b(breakpoint) + 编号使一个断点有效【开启断点】相当于VS中的空断点
    enable breakpount使一个断点有效【开启断电】
    n(next)逐过程【相当于F10,为了查找是哪个函数出错了】
    s(step)逐语句【相当于F11,】
    bt看到底层函数调用的过程【函数压栈】
    set var修改变量的值
    p(print) 变量名打印变量值
    display跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
    undisplay + 变量名编号取消对先前设置的那些变量的跟踪
    排查问题三剑客如下
    until + 行号进行指定位置跳转,执行完区间代码
    finish在一个函数内部,执行到当前函数返回,然后停下来等待命令
    c(continue)从一个断点处,直接运行至下一个断点处【VS下不断按F5】

    三、make/makefile知识回顾

    为了更好的演示指令,我们需要先创建一个test.c文件,以供调试。
    使用vim编辑如下代码。

      1 #include<stdio.h>
      2 
      3 int Sum(int n)                                                                                                                               
      4 {
      5   int i=1;
      6   int sum =0;
      7   for(;i<=n;i++)
      8   {
      9     sum+=i;
     10   }
     11   return sum;
     12 }
     13 
     14 int main()
     15 {
     16   printf("hello world\n");
     17   int result = Sum(100);
     18   printf("result = %d\n",result);
     19   return 0;
     20 }
    ~
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    并创建Makefile文件配置。
    在这里插入图片描述
    make一下,发现成功打印出来结果。
    在这里插入图片描述

    四、指令演示

    1.进入gdb

    使用格式:

    gdb 可执行程序
    
    • 1

    前提是在【Debug】环境下运行。

    在这里插入图片描述

    问题排查

    出现下面问题,通常是没有处于调式模式环境下,所以我们需要在gcc指令后加 【-g】。
    因为,我么的gcc编辑器默认是动态链接,而且是realese发布版本。

    在这里插入图片描述

    在这里插入图片描述

    2.行号显示

    l(list) 行号/函数名 —— 显示对应的code,每次10行

    • 单单使用【l】,随机显示10行
      在这里插入图片描述
    • 【l+数字】,从该数字开始打印10行
      在这里插入图片描述
    • 【enter】继续打印10行
      在这里插入图片描述

    3.断点设置

    b + 行号在那一行打断点
    b 源文件:函数名在该函数的第一行打上断点
    b 源文件:行号在该源文件中的这行加上一个断点

    第一种:b + 行号
    在这里插入图片描述
    第二种:b 源文件:函数名
    在这里插入图片描述
    第三种:b 源文件:行号

    在这里插入图片描述

    4.查看断点信息

    info】:查看所有调式信息
    info b】:显示所打的断点的信息
    在这里插入图片描述

    对上述产看信息的字段解释:
    1️⃣ Num —— 编号
    2️⃣ Type —— 类型
    3️⃣ Disp —— 状态
    4️⃣ Enb —— 是否可用
    5️⃣ Address —— 地址
    6️⃣ What —— 在此文件的哪个函数的第几行

    5.删除断点

    d + 当前要删除断点的编号】——删除一个断点
    注意:不是d + 行号,而是编号
    d + breakpoints】 —— 删除所有的断点

    在这里插入图片描述

    6. 运行 / 调试

    r(run)】 —— F5(无断点直接运行、有断点从第一个断点处开始运行)
    在这里插入图片描述

    • 如果加上断点去运行的话就会在打的断点处停下来。

    7.逐过程和逐语句

    n(next)】 —— 逐过程(相当于F10,为了查找是哪个函数出错了)
    在这里插入图片描述

    s(step) 】—— 逐语句相当于F11,一次走一条代码,可进入函数,同样的库函数也会进入】
    在这里插入图片描述

    8.跟踪打印

    display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
    在这里插入图片描述
    undisplay + 变量名编号】 —— 取消对先前设置的那些变量的跟踪

    9.查看函数调用

    bt】 —— 看到底层函数调用的过程【函数压栈】
    在这里插入图片描述

    10.指定行号跳转

    until + 行号】 —— 进行指定位置跳转,执行完区间代码

    11.强制执行函数

    finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令

    13.跳转到下一断点

    c —— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】

  • 相关阅读:
    腾讯云年终选购云服务器攻略!
    CF120F Spiders
    哪个品牌的触控笔质量好?触控笔排行榜
    AIGC ChatGPT 4 将数据接口文件使用Python进行入库Mysql
    file_get_contents 与curl 的对比
    Nvidia Tensor Core-WMMA API编程入门
    删除单链表偶数节点
    【数据结构与算法】时间复杂度和空间复杂度
    网络原理---拿捏网络层:IP协议
    FastAPI获年度第一新兴框架,2021年最受欢迎的TOP 100开发工具出炉
  • 原文地址:https://blog.csdn.net/luhaoran814/article/details/138190345