• [Linux入门]---gdb调试


    0.前言

    平时我们在Windows操作系统下写代码的时候经常会写出bug,此时必不可少地会使用我们VS编译器的调试工具,而我们在Linux操作系统使用gcc编译器时,出现了bug又应该怎么进行调试呢?接下来让我们一起学习一下Linux调试器—gdb吧!

    1.gdb调试

    课前需知

    ① 程序的发布方式有两种,debug模式和release模式, Linux gcc/g++编译出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g 选项②一般情况下,可执行程序文件是交给测试人员在release模式进行测试或发布给用户使用的产品,是不需要包含调试信息,所以需要我们使用-g选项加上调试信息。

    我们在test.c文件中写的代码如下:

    #include    
    int AddNum(int num)    
    {    
        int sum=0;    
        
        for(int i=0;i<=num;i++)    
        {    
            sum+=i;    
        }    
        
        return sum;    
    }    
    int main()    
    {    
        printf("debug begin\n");    
        
        int ret=AddNum(100);    
        
        printf("%d\n",ret);    
        
        printf("debug end\n");    
        
        return 0;                                                                                                                                                        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    我们使用的gcc编译编译指令如下:

     gcc -o test_debug test.c -std=c99 -g
    
    • 1

    或者我们创建一个Makefile文件定义如下指令:

    test:test.c    
        gcc -o $@ $^ -std=c99 -g    
    .PHONY:clean    
    clean:    
        rm -rf test_debug   
    
    • 1
    • 2
    • 3
    • 4
    • 5

    gcc编译指令中,因为我们在代码中使用了for循环,需要C99标准库的支持,所以需要加上-std=c99-g 选项编译生成调试信息,gdb工具才可以使用该信息进行调试
    在这里插入图片描述
    从上面可以看出,含调试信息的test_debug可执行文件比不含调试信息test可执行程序文件大。

    LInux指令:

    readelf -S 可执行文件名 | grep -i debug
    //查询可执行文件是否包含调试信息
    
    • 1
    • 2

    在这里插入图片描述

    gdb指令

    使用yum安装:

    yum install gdb -y
    
    • 1

    gdb使用语法:

    gdb 可执行文件名
    
    • 1

    在这里插入图片描述
    此时表明我们已经进入了调试状态,请看如下指令:

    1.按住ctrl+d键或quit(q):可以退出gdb调试
    在这里插入图片描述

    2.list/l 行号:显示binFile源代码,一直按l键接着上次的位置往下列,每次列10行,直到末尾!(使用回车键可以自动调用最近的历史指令)
    list/l+源文件名:行号,多文件的时候科使用
    在这里插入图片描述

    3.list/l 函数名:列出某个函数的源代码。
    在这里插入图片描述
    4.run(或r):从开始连续而非单步执行程序
    在这里插入图片描述
    5.break(b) 行号:在某一行设置断点
    在这里插入图片描述

    6.info(或i) break(breakpoints或b):查看端点信息。
    在这里插入图片描述
    7.break(或b) 函数名:在某个函数开头设置断点
    在这里插入图片描述

    8.delete(或d) breakpoints(或b):删除所有断点
    delete breakpoints n:删除断点编号为n的断点
    在这里插入图片描述
    9.n 或 next:单条执行,不进入函数(逐过程执行)
    在这里插入图片描述

    10.step(或s):进入函数调用,逐语句执行
    在这里插入图片描述
    11.continue(或c):从当前位置开始连续而非单步执行程序,可以从一个端点处运行到下一个端点处。
    在这里插入图片描述
    12.print(或p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
    p +变量/地址:打印变量值/地址值。
    在这里插入图片描述
    13,finish:执行到当前函数返回,然后挺下来等待命令。
    在这里插入图片描述
    14.info(i) locals:查看当前栈帧局部变量的值
    在这里插入图片描述
    15.set var+修改的值:修改变量的值
    在这里插入图片描述
    16.display 变量名:跟踪查看一个变量,每次停下来都显示它的值
    在这里插入图片描述
    17.undisplay:取消对先前设置的那些变量的跟踪
    在这里插入图片描述
    18.until X行号:跳至X行,如果X行为空行,会跳到下一个有效行的位置!
    在这里插入图片描述

    19.disable breakpoints(端点编号):禁用断点,断点还存在但是端点不起作用了
    在这里插入图片描述

    20.enable breakpoints:启用断点
    在这里插入图片描述

    21.breaktrace(或bt):查看各级函数调用及参数,即函数调用堆栈的信息。
    在这里插入图片描述

    2.总结

    通过上面的学习,我们可以发现Linux系统gcc编译器gdb调试与windows系统VS编译器调试有相似的地方:

    指令1:run---ctrl+F5执行程序
    指令2:break---F9打断点
    指令3:delete+断点编号---F9+光标指定行数,取消指定行数断点
    指令4:delete+break(breakpoints)---ctrl+shift+F9,取消所有断点
    指令5:finish---shfit+F11跳出执行当前执行点所处函数的剩余行
    指令6:quit---shift+F5取消调试
    指令7:next---F10逐过程调试
    指令8:step---F11逐语句调试
    指令9:display+变量---监视窗口

  • 相关阅读:
    STC单片机15——MPU6050六轴数据融合,互补滤波,时间常数可调,可稳定运行,串口显示角度值
    【深度学习实验】循环神经网络(一):循环神经网络(RNN)模型的实现与梯度裁剪
    matlab实现MCMC的马尔可夫转换MS- ARMA - GARCH模型估计
    HR应用在线人才测评,给企业招聘带来的好处
    力扣--找不同
    ajax 接口上传
    线性同余方程( 数学知识 + 同余 + 扩展欧几里得算法 )
    基于Svelte3.x桌面端UI组件库Svelte UI
    数据中台稳定性的“四高” | StartDT Tech Lab 18
    第3章:中文本文向量化——代码详解
  • 原文地址:https://blog.csdn.net/m0_74288306/article/details/133099600