首页 > 系统相关 >Linux下 GDB调试器的使用

Linux下 GDB调试器的使用

时间:2024-11-21 19:13:42浏览次数:3  
标签:查看 double GDB 调试信息 Linux Debug 断点 调试器

文章目录

1. 可执行程序的Debug版和Release版区别

一、编译选项与目的

  1. Debug版

    • 编译选项:通常使用包含调试信息的编译选项,如/MDd、/MLd或/MTd,并关闭优化。
    • 目的:主要用于开发和调试阶段,提供强大的调试功能,帮助开发者查找和修复程序中的错误。
  2. Release版

    • 编译选项:使用生成性能更优、体积更小的可执行文件的编译选项,如/MD、/ML或/MT,并开启优化(如/O1或/O2)。
    • 目的:用于最终用户使用,关注程序的性能和稳定性,不包含调试信息,无法进行调试。

二、性能与体积

  1. Debug版

    • 性能:由于关闭了优化,生成的可执行文件通常体积较大,运行速度较慢。
    • 体积:包含详细的调试信息,使得文件体积相对较大。
  2. Release版

    • 性能:进行了各种优化,生成的可执行文件体积小,运行速度快。
    • 体积:不包含调试信息,因此体积更小。

三、功能与特性

  1. Debug版

    • 功能:保留所有功能,包括开发过程中用来测试的功能。
    • 特性:包含额外的调试信息,如符号表、行号和代码的其他元数据,以帮助开发者在调试时更容易地追踪代码执行。此外,还支持编辑继续和内存错误捕获等功能。
  2. Release版

    • 功能:可能省略某些调试用的功能,以提升安全性和性能。
    • 特性:不包含调试信息,无法进行调试操作。但提供了经过优化的代码,以提高程序的运行效率。

四、查看可执行文件

readelf -S gdbtest-Debug (可执行程序名)

其中带有调试信息
debug

2. GDB 相关命令

您列出的是GDB(GNU Debugger)的一些常用命令和功能描述,但有一些小错误和不准确之处。下面我将对这些命令进行修正和补充,以便您更好地理解和使用GDB进行程序调试。
所使用案例的源代码如下

#include <iostream>

class Calculator {
public:
    // 加法
    double add(double a, double b) {
        return a + b;
    }

    // 减法
    double subtract(double a, double b) {
        return a - b;
    }

    // 乘法
    double multiply(double a, double b) {
        return a * b;
    }

    // 除法
    double divide(double a, double b) {
        if (b == 0) {
            std::cerr << "Error: Division by zero!" << std::endl;
            throw std::runtime_error("Division by zero");
        }
        return a / b;
    }
};

int main() {
    Calculator calc;
    double num1, num2;
    char operation;

    std::cout << "Enter first number: ";
    std::cin >> num1;
    std::cout << "Enter an operator (+, -, *, /): ";
    std::cin >> operation;
    std::cout << "Enter second number: ";
    std::cin >> num2;

    try {
        switch (operation) {
            case '+':
                std::cout << num1 << " + " << num2 << " = " << calc.add(num1, num2) << std::endl;
                break;
            case '-':
                std::cout << num1 << " - " << num2 << " = " << calc.subtract(num1, num2) << std::endl;
                break;
            case '*':
                std::cout << num1 << " * " << num2 << " = " << calc.multiply(num1, num2) << std::endl;
                break;
            case '/':
                std::cout << num1 << " / " << num2 << " = " << calc.divide(num1, num2) << std::endl;
                break;
            default:
                std::cerr << "Error: Unsupported operator!" << std::endl;
                break;
        }
    } catch (const std::runtime_error& e) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}
       

GDB常用命令

  1. 启动GDB
    • gdb + 可执行程序名

start

  1. 运行程序

    • runr [参数]:运行程序,可以传递可选的命令行参数。
      cal
  2. 显示源代码

    • listl [行号/函数名]:显示源代码。如果指定行号,则显示该行附近的代码;如果指定函数名,则显示该函数的源代码。
    • listl:如果之前已经使用过list命令,则继续显示接下来的代码,每次默认显示10行。
      print
  3. 单步执行

    • nextn:执行下一行代码,但不进入函数内部(即跳过函数调用)。
    • steps:执行下一行代码,如果遇到函数调用,则进入函数内部。
  4. 设置断点

    • breakb [行号/函数名]:在指定行或函数开头设置断点。
      break
  5. 查看断点信息

    • info breakpointsi b:查看当前设置的所有断点信息。
      info
  6. 删除断点

    • delete breakpoints:这个命令是不准确的,应该是delete [断点号] 或 d [断点号] 来删除指定的断点。
    • deleted:如果不跟断点号,则默认删除所有断点(但某些GDB版本可能不支持这种用法,通常需要明确指定断点号)。
      delte
  7. 执行到函数返回

    • finish:继续执行程序,直到当前函数返回,然后停下来等待命令。
  8. 打印表达式的值

    • printp [表达式]:打印表达式的值。通过表达式可以修改变量的值(但通常不推荐在调试过程中直接修改变量值,因为这可能会掩盖程序中的真实问题)。
    • printp [变量名]:打印变量的值。
  9. 修改变量的值

  • set var [变量名] = [新值]:修改变量的值。
  1. 连续执行
  • continue 或 c:从当前位置开始连续执行程序,直到遇到下一个断点或程序结束
  1. 禁用/启用断点

    • disable [断点号]:禁用指定的断点。
    • enable [断点号]:启用指定的断点。
  2. 跟踪查看变量

    • display [变量名]:每次程序停下来时都显示指定变量的值。
      display

    • undisplay [编号]:取消之前通过display设置的跟踪。

  3. 跳转到指定行

    • until [行号]:执行程序直到到达指定行(但通常不用于设置断点或改变执行流程,而是用于查看执行到某点时的状态)。
  4. 查看函数调用栈

    • backtracebt:查看当前函数的调用栈及参数。
  5. 查看局部变量

    • info localsi locals:查看当前栈帧中局部变量的值。
  6. 退出GDB

    • quit:退出GDB调试器。

标签:查看,double,GDB,调试信息,Linux,Debug,断点,调试器
From: https://blog.csdn.net/qq_46538985/article/details/143950634

相关文章

  • 使用再生龙CloneZilla进行Linux系统的镜像完全封装和还原
    写文章  使用再生龙CloneZilla进行Linux系统的镜像完全封装和还原巴布改不掉晚睡的咸鱼​关注 71人赞同了该文章CloneZilla可以将Linux完整移植到另一台机器中,保证数据,分区,挂载,启动项。。所有的一切完全一致注意:进行还原的机器需要......
  • Linux基础——yum downgrade和yum localinstall降级安装
    一、问题描述需求:租户需要从openssl-1.1.1t-11降级安装openssl-1.1.1f-36,安装包相关依赖问题;报错:rpm安装提示依赖问题 报错:yumlocalinstall本地rpm包无法安装; 二、解决办法1、方法一:yumdowngrade降级#通过本地rpm包或在线yum源安装,加上参数“--allowerasing”允许......
  • 从0开始学习Linux——Shell编程详解【04】
     期目录:从0开始学习Linux——简介&安装从0开始学习Linux——搭建属于自己的Linux虚拟机从0开始学习Linux——文本编辑器从0开始学习Linux——Yum工具从0开始学习Linux——远程连接工具从0开始学习Linux——文件目录从0开始学习Linux——网络配置从0开始学习Linux——......
  • linux之磁盘管理
    磁盘管理1.磁盘分类机械硬盘:盘片主轴传动手臂做机械运动类似DVD固态硬盘:内部是主板和U盘类似2.硬盘大小3.5英寸:台式机2.5英寸:笔记本服务器3.硬盘接口IDE接口过时scsi接口过时sata接口台式机3.0nvme接口固态硬盘SAS接口企业级4.硬盘存储......
  • Linux中如何批量删除系统中所有的自建用户
    一、需求分析在Linux系统中,一般情况下,系统用户(如root、bin、daemon等)的用户ID(UID)通常是小于1000的。对于自建用户(非系统用户),UID一般从1000开始分配。不过,这不是绝对的规则,具体的UID范围可以由系统管理员在创建用户时指定,或者根据系统的用户管理配置文件(如/etc/login.de......
  • 【linux之clickhouse的问题记录】记由于clickhouse服务内存打满导致cpu/mem都飙升然后
    在记录相关文档的过程中发现监控中关于该节点的clickhouse数据异常,随后在node节点监控中也不见该节点信息于是找到相关机器进行检查,堡垒机发现无法连接clickhouse的节点,随后找同网段的机器尝试ping一下测试连通性,随后发现无法ping通错误信息:From172.21.0.1icmp_seq=1Destin......
  • Metasploit Pro 4.22.5-2024111901 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.5-2024111901(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,releasedNov19,2024请访问原文链接:https://sysin.org/blog/metasploit-pro-4/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框......
  • Metasploit Framework 6.4.37 (macOS, Linux, Windows) - 开源渗透测试框架
    MetasploitFramework6.4.37(macOS,Linux,Windows)-开源渗透测试框架Rapid7Penetrationtesting,2024-11-20请访问原文链接:https://sysin.org/blog/metasploit-framework-6/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框架......
  • Linux之sar命令
    介绍Sar命令从内核计算器收集指标,并有一个代理,它按预定时间执行以记录系统活动。这个命令还可以收集系统状态的瞬时数据。使用Sar命令常用的选项-B:报告内存分页统计信息-b:报告所有设备的I/O和传输信息,-d:报告每个块设备的I/O和传输信息-n:报告网络统计信息-r:报告内存......
  • 我与Linux的爱恋:进程间通信 匿名管道以及命名管道的实现与应用
    ​​......