• 【Linux】gdb的简单使用



    一、gdb是什么?

    gdb 是在 Linux 系统中的一款调试工具.

    二、使用说明

    1. 安装

    首先先检测是否安装有 gdb:

    gdb -v
    
    • 1

    没有安装应该会提示: command not found. 此时输入指令进行安装:

    yum -y install gdb
    
    • 1

    而已经装有了, 则会显示类似信息:
    在这里插入图片描述

    2. 注意事项

    在 Linux 下编译 C/C++ 代码时, 默认是 Release 版本的, 而 Release 版本是不携带调试信息的, 所以直接调试会失败:
    在这里插入图片描述
    因此在编译时要加上 -g 选项:

    g++ -o gdbTest gdbTest.cpp -g
    
    • 1

    此时就可以正常调试了:
    在这里插入图片描述

    3. 常用调试指令

    用于当作例子使用 gdb 调试的代码, 其功能就是根据给定的 n, 从 1 累加到 n:

    #include 
    using namespace std;
    
    int func(int n) 
    {
        cout << "enter func" << endl;
        int sum = 0;
        for (int i = 1; i <= n; ++i)
        {
            sum += i;
        }
        cout << "quit func" << endl;
        return sum;
    }
    
    int main()
    {
        int n = 100;
        int res = func(n);
        cout << "res: " << res << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.1 gdb

    gdb + 可执行文件名: 进入调试界面
    在这里插入图片描述

    3.2 l

    l + 行号: 以那一行为开头显示 10 行的代码, 往后可以直接按回车, 则接着上次的位置往后显示代码, 一次显示10 行.
    在这里插入图片描述
    l + 函数名: 以函数名所在的那一行为中心显示 10 行的代码, 往后可以直接按回车, 则接着上次的位置往后显示代码, 一次显示10 行.
    在这里插入图片描述

    3.3 r

    在调试的状态下, 直接运行完整个程序, 类似于 vs 中的 ctrl + F5, 打了断点之后, 按 r 会直接运行到断点位置.
    在这里插入图片描述

    3.4 n

    单条执行, 相当于 vs 中的 F10, 遇到函数不会进入其内部, 需要配合打断点使用, 先通过 r 运行到断电处, 此时再输入 n 即可实现单步调试.
    在这里插入图片描述

    3.5 s

    相当于 vs 中的 F10, 遇到函数会进入其内部, 需要配合打断点使用, 先通过 r 运行到断电处, 此时再输入 s 即可实现调试.
    在这里插入图片描述

    3.6 b

    b + 行号: 给该行打上断点.
    在这里插入图片描述

    b + 函数名: 给某个函数名的第一行执行语句打上断点.
    在这里插入图片描述
    虽然函数名在第 4 行, 但是该函数会执行的第一句语句在第 6 行, 所以断点打在了第 6 行.
    在这里插入图片描述

    3.7 info b

    查看本次调试中打过的所有断点.
    在这里插入图片描述

    3.8 finish

    进入函数后, 执行完整个函数, 并返回.
    在这里插入图片描述

    3.9 p

    打印变量的值.
    在这里插入图片描述
    在这里插入图片描述
    但它不是一直显示的, 在执行其他语句时会把它冲掉.

    3.10 set var

    设置变量的值, 可用于在循环中跳转到某一值.
    在这里插入图片描述

    3.11 c

    从当前语句开始连续执行到离其最近的断点处, 可在循环外打上断点, 让其直接执行完循环, 直接获得循环结果.
    在这里插入图片描述

    3.12 d breakpoints

    删除所有断点, 直接输入 d 也会达到同样的效果
    在这里插入图片描述

    在删除时会提示 Delete all breakpoints? (y or n), 选择 yes(y) 即可.

    3.13 d n

    删除断点 n, n 为断点的 Num, 每次调试的断点 Num 都是连续的, 在演示 delete breakpoints 时, 打了两个断点在 18, 19 行, 而它们的 Num 按顺序就是 1, 2, 当将它们都删除后, 再次打断点时, 断点的 Num 不会因为目前没有任何断点而重新从 1 开始编号, 而是会接着往下编号, 当退出此次调试, 重新开始另一次调试时, Num 会刷新, 从 1 开始编号.
    在这里插入图片描述

    3.14 disable/enable breakpoints

    停用/启用所有断点.
    在这里插入图片描述
    Enb 表示断点的使能状态, y(yes) 表示启用, n(no) 表示停用, 默认都是 y, 关于断点的停用就相当于它不起作用, 即当它不存在, 通过其他指令也跳不到它.

    停用所有断点:
    在这里插入图片描述
    启用所有断点:
    在这里插入图片描述

    3.15 disable/enable n

    停用/启用断点 n.
    在这里插入图片描述

    3.16 info b

    查看目前所打的所有断点的信息.
    在这里插入图片描述

    3.17 display 变量名/undisplay 编号

    display 变量名: 常显示变量的值, 弥补了 p 变量名只显示一次的缺陷, 每次执行新的语句, 都会显示跟踪显示变量的值.
    在这里插入图片描述

    undisplay 编号: 取消变量的跟踪常显示, 需要注意的是, 和 display 不同, 取消变量的跟踪不是输入其变量名, 而是输入其 display 后获得的编号.
    在这里插入图片描述

    3.18 until n

    执行完当前行和 n 行之间的内容, 跳到 n 行.
    在这里插入图片描述

    3.19 bt

    查看函数调用栈.
    在这里插入图片描述

    3.20 ctrl + d/quit

    退出调试.
    在这里插入图片描述
    输入 y 退出.

  • 相关阅读:
    基于UDP的服务器端和客户端
    大数据运维实战第二课 大话 Hadoop 发行版选型和伪分布式平台的构建
    正则表达式高阶(二)
    R语言实现样本量的估算(2)
    受害者被锤 法官遭殃 背后的它公关赢了?
    UE4游戏客户端开发进阶学习指南
    论文阅读 Forecasting at Scale (一)
    LR学习笔记——基本面板
    到底什么才是真正的商业智能(BI)
    「 程序员的理财与风险控制」意外险:花几十块就能让你不用担心明天和意外哪个先来
  • 原文地址:https://blog.csdn.net/m0_62714628/article/details/138144287