Linux下 GDB调试器的使用

文章目录

  • 1. 可执行程序的Debug版和Release版区别
    • 一、编译选项与目的
    • 二、性能与体积
    • 三、功能与特性
    • 四、查看可执行文件
  • 2. GDB 相关命令
    • GDB常用命令

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调试器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RN开发搬砖经验之—Layout Inspector看不到 DecorView

最近我发现自己已经很久没有使用Layout Inspector这个工具了。今天&#xff0c;为了深入分析React Native&#xff08;RN&#xff09;框架中的一个UI问题&#xff0c;我需要查看RN组件对应的Android原生组件视图层级&#xff08;View tree&#xff09;的实际情况。因此&#xf…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

uniapp实现开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案&#xff1a; 在manifest.json文件&#xff0c;找到开源码视图配置&#xff0c;添加如下&#xff1a; "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言&#xff1a;这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 &#xff08;一&#xff09;结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema&#xff0c;…

window的wsl(Ubuntu)安装kafka步骤

环境&#xff1a;Win11 WSL(Linux子系统Ubuntu) apache-zookeeper-3.9.3-bin kafka_2.12-3.8.1 思路&#xff1a;apache上分别下载zookeeper和kafka&#xff0c;在wsl环境安装。在kafka上创建消息的topic&#xff0c;发送消息&#xff0c;接受消息&#xff0c;验证是否安…

Notepad++--在开头快速添加行号

原文网址&#xff1a;Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键&#xff0c;从首行选中首列下拉&#xff0c;选中需要添加序号的所有行的首列&#xff…

机器学习基础06_梯度下降

目录 一、为什么使用梯度下降 二、什么是梯度下降 三、为什么要用梯度下降 四、怎么进行梯度下降 1、微分 1.单变量的微分 2.多变量的微分 2、梯度 3、步骤 (1)学习率α (2)梯度(导数)前的负号 4、实例实现 五、sklearn梯度下降 一、为什么使用梯度下降 前面利用正…

《Vue零基础入门教程》第二课:搭建开发环境

往期内容&#xff1a; 《Vue零基础入门教程》第一课&#xff1a;Vue简介 1 搭建开发环境 Vue环境分为两种 不使用构建工具使用构建丁具 首先&#xff0c;我们会介绍 不使用构建工具 的环境,在组件化章节中介绍 使用构建工具 的方式 1) 初始化 使用如下指令初始化 npm i…

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…

【Linux清空显存占用】Linux 系统中清理 GPU 显存

操作指令 # 查看NVIDIA GPU状态和进程 nvidia-smi # 查找所有包含"python"的进程 ps -ef grep python # 强制结束进程号为3023的进程 kill -9 3023截图演示 在 Linux 系统中清理 GPU 显存可以采用以下方法&#xff1a; 1. 终止特定进程&#xff08;常用方法&#x…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

IC脚本之perl

Perl 是一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上。IC flow 的 流传的古老版本大多是也是使用这种语言&#xff0c;这里会对Perl的常用知识点进行总结。 Note: 所有的语句必须以 “ &#xff1b;”结尾&#xff1b;所有的数据必须先定义才可以使…

MEMS硅麦克风应用电子烟雾化产业稳步爬升,耐高温、 防油、防酸、防腐蚀等性能优势和可实现自动化贴片及极高的一致性等特性使其必将成为主流

全球范围内&#xff0c;电子烟行业正处于快速发展的阶段。随着消费者健康意识的提升和对传统烟草制品替代品需求的增加&#xff0c;电子烟市场获得了显著的增长。然而&#xff0c;伴随而来的监管挑战和消费者期待的变化&#xff0c;也促使行业不断进行技术创新和产品优化。特别…

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证&#xff08;Two-Factor Authentication&#xff0c;简称2FA&#xff09;是一种身份验证机制&#xff0c;它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的&#xff08;如密码&#xff09;、用户所拥有的&#xff08;如…

快慢指针应用---环型链表的应用

1.题目--判断链表是否成环 已经了解了快慢指针的应用原理&#xff0c;引申&#xff1a;用快慢指针去判断链表是否成环。 题解 简而言之&#xff0c;在fast和slow指针遍历的这种情况下&#xff0c;如果链表是成环的&#xff0c;那么在循环遍历了两次后&#xff0c;fast指针就会…

三、计算机视觉_06YOLO基础知识

1、YOLO概述 1.1 定义 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的对象检测和图像分割模型&#xff0c;由华盛顿大学的 Joseph Redmon 和 Ali Farhadi 于 2015 年推出&#xff0c;因其高速和准确性而迅速受到欢迎 在目标检测领域&#xff0c;传统方法&…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析&#xff1a;选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具&#xff0c;涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…