• Linux | gdb的基本使用


    目录

    前言

    一、调试文件的生成

    二、调试指令

    1、选择调试文件

    2、查看代码

    3、运行代码

    4、断点

    5、打印与常显示

    6、其他

    总结


    前言

            前面我们学习了如何使用gcc/g++来进行对代码进行编译,本章我们将使用gdb来对代码进行调试,学习本章的前提是有一定的调试基础,有在vs等软件上有调试经历的,若无这方面经历,建议先了解一下再来阅读本篇文章;

    一、调试文件的生成

            gdb是Linux下一款命令式调试工具,我们在VS等IDE进行代码编写时,我们编写完代码,若代码运行结果不如我们所料,我们通常会去进行调试,而这里有一个细节,我们点F5编译并运行程序时,实际上这里的编译有两种选择,一种的Debug版本,另一种就是Release版本,我们必须选择Debug版本才可以进行调试,而gcc中默认是Release版本进行编译的,我们必须带上 -g选项才可,如下图所示,我写了如下代码,并进行编译;

    1. #include
    2. // 从1加到100
    3. int AddToHun()
    4. {
    5. printf("Enter AddToHun\n");
    6. int ret = 0;
    7. int i = 0;
    8. for(i = 0; i <= 100; i++)
    9. {
    10. ret += i;
    11. }
    12. printf("Exit AddToHun\n");
    13. return ret;
    14. }
    15. int main()
    16. {
    17. printf("Enter Main\n");
    18. int n = AddToHun();
    19. printf("ret=%d\n", n);
    20. printf("Exit Main");
    21. return 0;
    22. }

            我们用下面指令分别编译出Release版本和Debug版本;

            我们不难看出我们的Debug版本比Release版本大一些,因为我们的Debug版本要保存调试信息,我们可以通过 readelf 来查看Debug版本是否真的保存了调试信息;

    readelf -S 文件名

            我们看到其中保存了很多关于debug的信息;

    二、调试指令

    1、选择调试文件

            我们分别用Release版本的可执行程序和Debug版本的可执行程序进行调试,看是否如我们所料,Release版本可执行程序不可调试,以下为选择调试文件的指令;

    gdb 要调试的文件

            我们选择Release版本可执行程序,我们发现gdb没有找到我们的调试信息,如上图所示,接着我们在试着选择Debug版本文件(输出q退出gdb);

            我们发现,刚才的提示消失了,证明了我们的Debug版本的可执行程序才可进行调试;

    2、查看代码

    l 行号:从指定行开始查看部分代码,我们需要继续输入 l ,才会显示后面的代码;

    注意:我们可以直接回车换行,因为我们的gdb有记录上一次执行命令的功能;

    3、运行代码

    这里运行代码我们介绍三个指令,分别对应VS中的F5,F10和F11

    r:运行代码直至遇到断电或程序结束(F5)

    n:逐过程运行代码,遇到函数不进去(F10)

    s:逐语句运行代码,遇得到函数进去(F11)

    4、断点

    b 行号:给指定行打上断点,此时gdb会给该断点分配编号

    info b:显示当前有那些断点

    d 断点编号:删除指定断点编号的断点

    disable 断点编号:使指定断点失效

    enable 断点编号:使指定断点有效

    c:执行到程序末尾或下一个断点处停下来

    5、打印与常显示

    p 变量名:显示指定变量的值

    display 变量名:常显示指定变量名(每次执行都会打印该变量值)

    6、其他

    bt:查看当前调用堆栈

    finish:完成当前函数后停下来

    until 行号:跳转至指定行

    总结

            对于新手来说,我们学会上述所有指令即可,上述指令已经可以满足大部分需求,若有其他需求查看文档即可;

  • 相关阅读:
    什么样的蓝牙耳机打电话好用?接电话清晰的蓝牙耳机推荐
    GO微服务实战第四节 DDD 领域场景分析的战略模式
    js——继承
    重庆自考本科报哪个学校都一样吗?
    分治算法- 递归的分析
    数据结构与算法之美学习笔记:16 | 二分查找(下):如何快速定位IP对应的省份地址?
    2023高教社杯全国大学生数学建模竞赛E题代码解析
    【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路
    连续信号与系统的频域分析之傅里叶级数
    MATLAB绘制堆叠填充图--巧用句柄
  • 原文地址:https://blog.csdn.net/Nice_W/article/details/133932077