Linux调试工具GDB使用简易教程

Linux调试工具GDB使用简易教程,第1张

Linux调试工具GDB使用简易教程 目录

    本文所述主要是Linux调试工具GDB的使用教程,具体如下。

    声明:本博客内容是由本人经过实验楼教程整理得来。

    GDB的相关概念

    GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。

    GDB的相关 *** 作

    下面给出一个具有buging.c的程序:

    [yqtao@localhost linux]$ cat buging.c 
    #include <stdio.h>
    int getSum(int n) {
        int sum=0,i;
        for (i=1;i<=n;i++)
            sum+=i;
        return sum;
    }
    int main(){
        int res=getSum(100);
        printf("1+2+...+100=%d\n",res);
    }

    如果要调试程序,则在进行gcc编译的时候要加上-g参数

    gcc -g -o bugging bugging.c

    进入gdb:

    gdb buging

    部分gdb命令:

    // 查看源码
    // 查看第几行附近
    // 可简写成l 2
    (gdb) list 2   
    1    #include <stdio.h>
    2    int getSum(int n) {
    3        int sum=0,i;
    4        for (i=1;i<=n;i++)
    5            sum+=i;
    6        return sum;
    7    }
    
    // 查看main函数附近的源码
    (gdb) list main
    3        int sum=0,i;
    4        for (i=1;i<=n;i++)
    5            sum+=i;
    6        return sum;
    7    }
    8    int main(){
    9        int res=getSum(100);
    10       printf("1+2+...+100=%d\n",res);
    11   }
    
    
    // 设置断点
    // break +n在第几行设断点
    (gdb) break 8
    Breakpoint 1 at 0x4004fa: file buging.c, line 8.
    // break +函数名 ,在函数名处设断点
    (gdb) break getSum
    Breakpoint 2 at 0x4004cb: file buging.c, line 3.
    
    //查看断点信息
    (gdb) info breakpoints 
    Num   Type      Disp Enb Address      What
    1    breakpoint   keep y  0x00000000004004fa in main at buging.c:8
    2    breakpoint   keep y  0x00000000004004cb in getSum at buging.c:3

    断点信息中每一项的信息:

    1.Num 列代表断点编号,该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
    2.Type 列代表断点类型,一般为 breakpoint
    3.Disp 列代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis)
    4.Enb 列代表该断点是 enable(y) 还是 disable(n)
    5.Address 列代表该断点处虚拟内存的地址
    6.What 列代表该断点在源文件中的信息

    // 删除断点
    // delete +n 或 d +n
    // 如果不加数字则删除全部的断点
    (gdb) d 2
    (gdb) info breakpoints 
    Num   Type      Disp Enb Address      What
    1    breakpoint   keep y  0x00000000004004fa in main at buging.c:8

    关闭和启用断点:

    有时候,我们会遇到这种情况:有些断点可能暂时不用但又不想删除,那么可以disable.

    disable +n //关闭断点
    enable +n  //启动断点
    GDB单步调试

    以本文开头的buging.c文件为例,进行单步调试。

    // 进入gdb
    [yqtao@localhost linux]$ gdb buging
    // 在main()函数处设断点
    (gdb) info breakpoints 
    // 运行程序
    (gdb) run
    Breakpoint 1, main () at buging.c:9
    9        int res=getSum(100);

    注意:我们要进入函数要是用step(s),而单步执行next(n),next是不进入函数内部的,要区分两者的关系。

    (gdb) step
    getSum (n=100) at buging.c:4
    4        for (i=1;i<=n;i++)
    // 查看代码
    (gdb) l
    1    #include <stdio.h>
    2    int getSum(int n) {
    3        int sum=0,i;
    4        for (i=1;i<=n;i++)
    5            sum+=i;
    6        return sum;
    7    }
    8    int main(){
    9        int res=getSum(100);
    10       printf("1+2+...+100=%d\n",res);
    // 下一步
    (gdb) s
    5            sum+=i;
    // 打印sum的值
    // 看到sum是为赋初值的
    (gdb) p sum
     = 4195633
    // info locals
    //打印当前断点处所在函数的所有局部变量的值,不包括函数参数。
    (gdb) info locals
    sum = 4195635
    i = 3

    其余的一些命令:

    finish

    执行程序到当前函数结束

    continue

    执行程序到下个断点

    until

    until N,执行程序到源代码的某一行

    总结

    以上就是本文关于Linux调试工具GDB使用简易教程的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/yw/904226.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-15
    下一篇 2022-05-15

    发表评论

    登录后才能评论

    评论列表(0条)

    保存