• 【Linux】开始使用gdb吧!


    在这里插入图片描述


    这篇文章我们来学习 gdb 的使用方法。我们在Windows端编写代码时有宇宙最强编译器VS2022帮助我们调试,那Linux端有没有一款强大的调试工具呢???
    当然有了 它就是 gdb :
    Linux下的gdb(GNU Debugger)是一款强大的调试工具,对于程序员来说,掌握gdb的使用技巧是开发过程中必不可少的技能。根据Statista的数据,截至2023,Linux在全球服务器操作系统市场占据近37%的份额,这使得gdb成为了许多专业人士必备的工具。
    本文将介绍如何使用gdb。

    1 下载安装

    首先我们要确保已经安装gdb,可以通过 gdb -version来进行间接查看。
    未安装使用sudo yum -y install gdb 下载安装即可。
    在这里插入图片描述

    2 开始使用

    首先进入gdb直接使用:gdb 文件名
    接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用):

    1. list /l 行号:显示指定行号附近的源代码,每次显示10行,从当前光标位置向下滚动
    2. list /l 函数名:显示指定函数的完整源代码
    3. r 或 run:开始执行程序
    4. n 或 next:执行下一条语句,不会进入函数内部相当于 F10
    5. s 或 step:执行下一条语句,如果下一条语句是函数调用,则进入该函数内部相当于 F11
    6. break(b) 行号:在指定的行号设置断点。相当于 F9
    7. break 函数名:在指定函数的开头设置断点。
    8. info break:显示所有断点的信息
    9. finish:执行当前函数的剩余部分,直到函数返回,然后暂停程序。
    10. print ( p ) 表达式:计算并打印表达式的值。
    11. p 变量:打印变量的值
    12. set var:修改变量的值
    13. continue(或c):继续执行程序,直到下一个断点或程序结束相当于 F5
    14. run(或r):从程序的开始处执行程序,直到程序结束或遇到断点。

    断点相关操作

    1. delete breakpoints:删除所有断点。
    2. delete breakpoints n:删除指定编号的断点。
    3. disable breakpoints:禁用所有断点。
    4. enable breakpoints:启用所有断点。
    5. ignore:忽略特定的断点。例如,ignore 1 main 会让断点1在主函数上失效
    6. info(或i) breakpoints:显示当前设置的所有断点。

    监视相关操作

    1. display 变量名:跟踪指定变量的值,并在每次程序暂停时显示它。

    2. undisplay:取消对先前设置的变量的跟踪。

    3. until X行号:继续执行程序,直到达到指定的行号。

    4. breaktrace(或bt):显示程序的调用栈,包括所有函数的调用和参数。

    5. info(i) locals:显示当前函数栈帧中局部变量的值。

    6. quit:退出GDB。

    3 实践运用

    接下来我们在实践中加深对gdb的熟悉:
    首先我们编写一段简单程序:

     1 #include<iostream>
        2 using namespace std;
        3 
        4 int main(){
        5   int i = 0;
        6   int j = 100;
        7 
        8   while(i < 100){
        9     int sum = i + j;
       10     i++;
       11     j -= 2;
       12   }
       13                                                                                                                                                                             
       14   for(int k = 0;k<10;k++){
       15     cout<<"hello bit"<<endl;
       16   }
       17 
       18 
       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

    然后我们直接进入gdb
    在这里插入图片描述
    出乎意料的是 再使用list出现了报错(No symbol table is loaded. Use the “file” command.)!!!

    这是因为 gdb操作的应该是编译后的文件
    当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded. Use the “file” command.提示;
    一定要进行gcc/g++ -g test.c -o test操作哦。
    在这里插入图片描述
    这样就好了:成功显示出我们代码
    在这里插入图片描述
    接下来我们打开监视,来看看每个变量的变化。我们先打上断点来进入主函数:
    在这里插入图片描述在这里插入图片描述
    然后逐个 display 展示即可:
    在这里插入图片描述
    然后调试(continue、step、next)就好,可以清楚看到每个变量的值
    在这里插入图片描述
    我们来试试断点的快速移动:
    在这里插入图片描述
    我们直接就跳出了正在进行的while循环,来到14行了。
    其他指令就不进行探索了,熟悉使用就可以了。

    补充一下 print 的 功能 (类似监视窗口的作用)和显示堆栈的功能

    1. print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
    2. print a:将显示整数 a 的值
    3. print ++a:将把 a 中的值加1,并显示出来
    4. print name:将显示字符串 name 的值
    5. print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
    6. print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
    7. watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
    8. whatis :查询变量或函数
    9. info function: 查询函数,扩展info locals: 显示当前堆栈页的所有变量

    堆栈:

    1. where/bt :当前运行的堆栈列表;
    2. bt backtrace 显示当前调用堆栈
    3. up/down 改变堆栈显示的深度
    4. set args 参数:指定运行时的参数
    5. show args:查看设置好的参数
    6. info program: 来查看程序的是否在运行,进程号,被暂停的原因。

    Thanks♪(・ω・)ノ谢谢阅读!!!

    下一篇文章见!!!

  • 相关阅读:
    冒泡排序与选择排序(最low的两兄弟)
    springboot异步操作之Async
    Elasticsearch基础操作演示总结
    js 中 Map 和 Set 的用法及区别
    K邻近算法(KNN,K-nearest Neighbors Algorithm)
    xml引配置文件
    Unity 获取对象的方法
    DRM全解析 —— CRTC详解(4)
    VirtualBox VMs 扩展磁盘空间
    个人博客项目中遇到的 mongodb 操作
  • 原文地址:https://blog.csdn.net/JLX_1/article/details/136544133