GDB调试工具

news2024/9/20 17:00:13

GDB(GNU Debugger)是一个功能强大的命令行调试工具,用于调试 C、C++ 程序以及其他编程语言的程序。它是 GNU 项目的一部分,可在多个操作系统上使用,包括 Linux、macOS 和 Windows(通过 MinGW 或 Cygwin)。

GDB 提供了一系列的命令和功能,用于在程序执行过程中跟踪、检查和修改程序的状态,以帮助开发者诊断和解决问题。

以下是 GDB 常用的一些功能和命令:

  1. 设置断点:使用 break 命令在代码中设置断点,以指定程序执行到某一行或某个函数时暂停执行。

  2. 运行程序:使用 run 命令来运行程序,并在遇到断点或程序终止时暂停。

  3. 单步执行:使用 step 命令逐行执行代码,进入函数或跳过函数调用。

  4. 继续执行:使用 continue 命令继续执行程序,直到下一个断点或程序结束。

  5. 查看变量:使用 printp 命令查看变量的值。

  6. 修改变量:使用 set 命令修改变量的值,以便在调试过程中测试不同的场景。

  7. 查看堆栈:使用 backtracebt 命令查看当前的函数调用堆栈。

  8. 查看源代码:使用 list 命令查看当前位置周围的源代码。

  9. 观察表达式:使用 watch 命令设置观察点,以监视特定表达式的值变化。

  10. 处理信号:使用 handle 命令处理程序接收到的信号。

  11. 记录和回放:使用 record 命令记录程序执行过程,并使用 replay 命令回放记录的执行。

  12. 调试多线程程序:GDB 支持调试多线程程序,可以切换线程、设置线程断点等。

这只是 GDB 的一小部分功能和命令,GDB 还提供了许多其他功能,如条件断点、触发断点、动态加载符号表等。

要使用 GDB 调试程序,通常需要编译时包含调试信息(使用 -g 编译选项),以便 GDB 能够准确地对程序进行调试。

在命令行中,可以通过运行 gdb 命令并指定可执行文件来启动 GDB 调试器。例如:

gdb my_program

这将启动 GDB 调试器,并加载名为 my_program 的可执行文件。

一旦进入 GDB

调试器,您可以使用各种命令和功能来跟踪、检查和修改程序的状态,以诊断和解决问题。

请注意,GDB 是一个功能强大而复杂的调试工具,掌握其使用需要一定的学习和实践。您可以参考 GDB 的文档和教程,以深入了解其更多功能和用法。

在这里插入图片描述

在这里插入图片描述

当然,下面我将会用一个具体的例子,尽可能的演示GDB的各项功能。我们假设你有以下C++代码(保存在main.cpp中):

#include <iostream>
#include <vector>

int sum(const std::vector<int>& nums) {
    int total = 0;
    for (int num : nums) {
        total += num;
    }
    return total;
}

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    int total = sum(nums);
    std::cout << "The sum is: " << total << std::endl;
    return 0;
}

首先,你需要使用-g选项来编译你的代码,这样你才能在GDB中进行调试:

g++ -g main.cpp -o main

然后,你可以使用GDB启动你的程序:

gdb main

在GDB中,我们可以使用break命令来设置断点。让我们在main函数和sum函数处设置断点:

(gdb) break main
(gdb) break sum

现在,我们可以开始运行程序。当程序达到一个断点时,它会暂停执行:

(gdb) run

当程序在main函数处暂停时,我们可以使用step命令来单步执行。这将进入sum函数:

(gdb) step

在函数内部,我们可以查看当前的源代码和局部变量的值:

(gdb) list
(gdb) print total
(gdb) print num

我们也可以修改局部变量的值:

(gdb) set var total=10

我们可以使用continue命令让程序继续运行,直到遇到下一个断点:

(gdb) continue

此外,我们也可以查看堆栈信息:

(gdb) backtrace

当我们完成调试后,我们可以使用quit命令退出GDB:

(gdb) quit

以上只是GDB基本功能的一个简单示例。GDB提供了许多更高级的功能,例如条件断点、线程调试、内存检查、反汇编查看等。如果你想深入了解GDB,我建议你阅读GDB的官方文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

针对KF状态估计的电力系统虚假数据注入攻击研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何用ChatGPT学Python

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT的能力大家肯定都听说过&#xff0c;很多学生应该都亲身体验过。它在自然语言处理方面的出色表现绝对颠覆了之前公众对人…

一文详解Java自定义注解

目录 简介 JDK注解 Target Retention Documented Inherited 第三方注解 自定义注解 举例 默认字符串注解 实现指定包名称扫描注解 简介 注解&#xff08;Annotation&#xff09;是Java SE 5.0 版本开始引入的概念&#xff0c;它是对 Java 源代码的说明&#xff0c;…

FreeRTOS中断配置和临界值

Cortx-M 中断 优先级分组 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级&#xff0c;因此STM32把指定中断优先级的寄存器位减少到4位。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。高的抢占式优先级可以打断低的抢占式优先级&am…

mysql加强小结 203446

数据库三范式: 什么是范式 规则:想要设计一个好的关系,必须要满足一定的约束条件,有几个等级,一级比一级高 ​ 解决什么问题:让数据库设计更加简洁,结构更加清晰,否则容易造成数据冗余 数据库有哪些范式? ​ 数据库有七大范式,常用的只有三个范式 **第一范式:**业务上属…

电磁兼容(EMC)基础(二)

目录 1.1 什么是电磁兼容&#xff08;EMC&#xff09; 1.2 各种各样的“干扰” 1.3 电磁兼容三要素 1.4 什么是分贝 1.5 天线 1.1 什么是电磁兼容&#xff08;EMC&#xff09; 电磁兼容(Electro Magnetic Compatibility&#xff0c;EMC)是电子、电气设备或系统的一种重要…

面试题基础篇

文章目录 1、二分查找2、冒泡排序3、选择排序4、插入排序5、希尔排序6、快速排序7、ArrayList8、Iterator9、LinkedList10、HashMap10.1、基本数据结构底层数据结构&#xff0c;1.7和1.8有什么不同&#xff1f; 10.2、树化与退化为何要用红黑树&#xff0c;为何一上来不树化&am…

【开放原子训练营(第三季)inBuilder低代码开发实验室学习心得】

今天要给大家介绍的项目是UBML 什么是UBML呢&#xff1f; UBML&#xff08;统一业务建模语言 Unified-Business-Modeling-Language&#xff09;是一种用于快速构建应用软件的低代码开发建模语言&#xff0c;是开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;…

数据结构与算法:树形查找

一.二叉排序树&#xff08;BST&#xff09; 1.个人理解 左子树结点值 < 根结点值 < 右子树结点值对二叉排序树进行中序遍历&#xff0c;可以得到一个递增的有序数列 2.二叉树查找 原理&#xff1a; 对于一个给定的二叉排序树&#xff0c;如果要查找一个节点&#xff0…

并发知识杂谈

在JAVA语言层面&#xff0c;怎么保证线程安全&#xff1f; 有序性&#xff1a;使用happens-before原则 可见性&#xff1a;可以使用 volatile 关键字来保证&#xff0c;不仅如此&#xff0c;volatile 还能起到禁止指令重排的作用&#xff1b;另外&#xff0c; synchronized 和…

进程和编码

一、python代码的运行方式 1.脚本式 2. 交互式 一般用于代码的测试 二、进制及相互之间的转换 1. 进制 2.进制之间相互转换 在python中&#xff0c;十进制是以整形的形式存在&#xff0c;其他进制是已字符串的形式存在。 二进制/八进制/十六进制都可与十进制相互转换。但…

走向编程大师之路的几个里程碑

走向编程大师之路的几个里程碑 1语言关 2算法关 3系统关 4 编译器关 如下的系统的核心代码都有一万行以上&#xff0c;是规模和复杂度足够 大&#xff0c;可以检验开发者的模块化编程能力&#xff0c;掌控复杂度的能力。 使用什么编程语言本身是不重要的&#xff0c;能够有能…

常用消息中间件简介

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种&#xff1a; 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式&#xff0c;同步的&#xff0c;跨语言跨平台&#xff0c;面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

一个命令搞定Linux大文件下载

问题 Linux下log日志太大了&#xff0c;下载太慢了&#xff0c;即使下载下来&#xff0c;打开也费劲&#xff0c;咋办&#xff1f;将某文件夹打包成xx.tar.gz包&#xff0c;但依然很大&#xff0c;公司无法下载这么大的压缩包&#xff0c;咋办&#xff1f; split 以上2个问题…

[golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

一.全文搜索引擎 ElasticSearch 的介绍&#xff0c;以 及安装配置前的准备工作 介绍 ElasticSearch 是一个基于 Lucene 的 搜索服务器,它提供了一个 分布式多用户能力的 全文搜索引擎&#xff0c;基于 RESTful web 接口,Elasticsearch 是用 Java 开发的&#xff0c;并作为 Apac…

PIC18F26单片机波特率配置

只需要配置以下三个寄存器&#xff1a; BRGCON1 BRGCON2 BRGCON3 BRGCON10x07; > 0000 0111 BRGCON20x90; > 1001 0000 BRGCON30x42; > 0101 0010 BRGCON1&#xff1a; Sync_Sog (bit7~bit6)1TQ,BRP(bit5~bit0)1 &#xff0c;则TQ((2*(BRP1))/Fosc16/32M&am…

Mysql存储时间,对应Api及对应的java属性

1.Mysql存储时间的类型 常用的储存时间/日期的类型&#xff1a; DATE&#xff1a;仅用于存储日期值&#xff08;年、月、日&#xff09;&#xff0c;格式为YYYY-MM-DD。TIME&#xff1a;仅用于存储时间值&#xff08;小时、分钟、秒&#xff09;&#xff0c;格式为HH:MM:SS。DA…

朴素贝叶斯算法实现英文文本分类

目录 1. 作者介绍2. 朴素贝叶斯算法简介及案例2.1朴素贝叶斯算法简介2.2文本分类器2.3对新闻文本进行文本分类 3. Python 代码实现3.1文本分类器3.2 新闻文本分类 参考&#xff08;可供参考的链接和引用文献&#xff09; 1. 作者介绍 梁有成&#xff0c;男&#xff0c;西安工程…

【UE】连续射击Niagara特效

效果 步骤 1. 新建一个粒子系统 选择“来自所选发射器的新系统” 添加“Fountain” 2. 打开这个新建的粒子系统 选中“Initialize Particle”模块&#xff0c;将颜色设置为&#xff08;100,0,0&#xff09; 再让生成的粒子大一些 选中“Spawn Rate”模块&#xff0c;将粒子的…

如何编写接口自动化框架系列之unittest测试框架的详解(二)

在编写自动化框架过程中 &#xff0c;我们首先想到的就是选择一个合适的测试框架 &#xff0c;目前常用的测试框架有unittest和pytest , unittest比较简单&#xff0c;适合入门着学习 &#xff1b;而pytest比较强大&#xff0c;适合后期进阶 。本文主要介绍的就是unittest框架 …