当前位置: 首页 > article >正文

GDB 使用心得

一、 入门篇

  1. 理解 GDB 的作用: GDB 是 GNU 调试器的缩写,用于调试 C、C++ 等编程语言的程序。它可以帮助你:

    • 跟踪程序执行流程
    • 设置断点,暂停程序执行
    • 查看和修改变量值
    • 分析程序崩溃原因
  2. 掌握基本命令:

    • 启动 GDB: gdb <可执行文件>
    • 运行程序: run
    • 设置断点: break <行号/函数名>
    • 查看变量: print <变量名>
    • 单步执行: next (不进入函数) / step (进入函数)
    • 继续执行: continue
    • 退出 GDB: quit
  3. 利用 GDB 帮助: 在 GDB 中输入 help 可以查看所有命令的帮助信息,输入 help <命令> 可以查看特定命令的详细用法。

二、 进阶篇

  1. 调试 core 文件: 当程序崩溃时,可以使用 gdb <可执行文件> <core文件> 来加载 core 文件,查看程序崩溃时的堆栈信息、变量值等,帮助定位问题。

  2. 使用 GDB 脚本: 可以将常用的 GDB 命令写入脚本文件,方便重复使用。例如,可以编写脚本自动设置断点、运行程序、打印变量等。

  3. 调试多线程程序: GDB 提供了 info threadsthread <线程号> 等命令,用于查看和切换线程,方便调试多线程程序。

  4. 远程调试: GDB 支持远程调试,可以在本地机器上调试运行在远程机器上的程序。

  5. 使用 GDB 插件: 可以使用一些 GDB 插件来增强 GDB 的功能,例如:

    • GDB Dashboard: 提供更直观的调试界面
    • GEF: 提供更强大的内存分析功能
    • PEDA: 专门用于 exploit 开发的插件

三、 经验分享

  1. 善用断点: 断点是调试程序最常用的工具之一。可以根据需要设置不同类型的断点,例如:

    • 行号断点: 在指定行暂停程序执行
    • 函数断点: 在进入指定函数时暂停程序执行
    • 条件断点: 当满足指定条件时暂停程序执行
  2. 关注堆栈信息: 当程序崩溃时,堆栈信息可以帮助你快速定位问题所在。可以使用 bt 命令查看堆栈信息。

  3. 利用调试信息: 在编译程序时,建议加上 -g 选项,生成调试信息。这样可以使 GDB 显示更详细的调试信息,例如变量名、函数名等。

  4. 保持耐心: 调试程序是一个需要耐心和细心的过程。不要急于求成,要仔细分析程序的执行流程和变量值,才能找到问题的根源。

四、 总结

GDB 是一个功能强大的调试工具,掌握 GDB 的使用技巧可以大大提高调试程序的效率。希望以上心得能够帮助你更好地使用 GDB,解决编程过程中遇到的问题。

好的!以下是一些具体的案例,帮助你更好地理解如何使用 GDB 进行调试:


案例 1:程序崩溃(Segmentation Fault)

问题描述:

程序运行时出现 Segmentation fault (core dumped),但不知道具体是哪一行代码导致的。

解决步骤:
  1. 编译程序时加上 -g 选项,生成调试信息:
    gcc -g -o my_program my_program.c
    
  2. 运行程序,生成 core 文件:
    ./my_program
    
  3. 使用 GDB 加载 core 文件:
    gdb ./my_program core
    
  4. 查看崩溃时的堆栈信息:
    (gdb) bt
    
    这会显示函数调用栈,帮助你定位崩溃的位置。
  5. 查看具体代码行:
    (gdb) list
    
    结合 bt 的输出,找到具体的代码行,分析问题原因。

案例 2:变量值异常

问题描述:

程序运行结果不符合预期,怀疑某个变量的值在运行过程中被错误修改。

解决步骤:
  1. 在怀疑的代码行设置断点:
    (gdb) break 42  # 在第 42 行设置断点
    
  2. 运行程序:
    (gdb) run
    
  3. 当程序暂停在断点时,查看变量值:
    (gdb) print my_variable
    
  4. 单步执行,观察变量值的变化:
    (gdb) next  # 单步执行(不进入函数)
    (gdb) step  # 单步执行(进入函数)
    
  5. 如果发现变量值异常,可以尝试修改它的值:
    (gdb) set my_variable = 100
    

案例 3:多线程程序调试

问题描述:

多线程程序中,某个线程卡住或行为异常,需要定位问题。

解决步骤:
  1. 运行程序并暂停:
    (gdb) run
    
  2. 查看所有线程:
    (gdb) info threads
    
    这会列出所有线程及其状态。
  3. 切换到目标线程:
    (gdb) thread 2  # 切换到线程 2
    
  4. 查看该线程的堆栈信息:
    (gdb) bt
    
  5. 设置线程特定的断点:
    (gdb) break my_function thread 2  # 在线程 2 的 my_function 处设置断点
    

案例 4:条件断点

问题描述:

程序在某个循环中运行,但只有在特定条件下才需要暂停。

解决步骤:
  1. 设置条件断点:
    (gdb) break 30 if i == 100  # 当变量 i 等于 100 时,在第 30 行暂停
    
  2. 运行程序:
    (gdb) run
    
  3. 当条件满足时,程序会自动暂停,可以查看变量值或单步调试。

案例 5:远程调试

问题描述:

程序运行在远程服务器上,需要在本地调试。

解决步骤:
  1. 在远程服务器上启动 GDB 服务:
    gdbserver :1234 ./my_program
    
  2. 在本地机器上连接远程 GDB 服务:
    gdb
    (gdb) target remote <远程服务器IP>:1234
    
  3. 像调试本地程序一样使用 GDB。

案例 6:使用 GDB 脚本自动化调试

问题描述:

每次调试都需要重复输入相同的命令,希望自动化这个过程。

解决步骤:
  1. 创建一个 GDB 脚本文件(例如 debug_script.gdb):
    break main
    run
    print my_variable
    next
    print my_variable
    
  2. 使用 GDB 加载脚本并运行:
    gdb -x debug_script.gdb ./my_program
    

总结:

这些案例展示了 GDB 在不同场景下的应用。通过灵活使用断点、堆栈分析、变量查看等功能,可以高效地定位和解决程序中的问题。希望这些例子能帮助你更好地理解 GDB 的使用!

相关文章:

GDB 使用心得

一、 入门篇 理解 GDB 的作用: GDB 是 GNU 调试器的缩写&#xff0c;用于调试 C、C 等编程语言的程序。它可以帮助你&#xff1a; 跟踪程序执行流程设置断点&#xff0c;暂停程序执行查看和修改变量值分析程序崩溃原因 掌握基本命令: 启动 GDB: gdb <可执行文件>运行程序…...

电脑端调用摄像头拍照:从基础到实现

文章目录 1. 了解navigator.mediaDevices.getUserMedia API2. 创建 HTML 结构3. 编写 JavaScript 代码3.1 打开摄像头3.2 拍照 4. 完整代码5. 测试6. 注意事项及部署 在现代 Web 开发中&#xff0c;调用摄像头进行拍照是一个常见的功能&#xff0c;尤其是在需要用户上传头像、进…...

部署 DeepSeek R1各个版本所需硬件配置清单

DeepSeek-R1 通过其卓越的推理性能和灵活的训练机制&#xff0c;在 2025 年的春节期间受到了广泛关注。 DeepSeek-R1 是一款高性能的 AI 推理模型&#xff0c;主要通过强化学习技术来增强模型在复杂任务场景下的推理能力。 在本地部署 DeepSeek-R1 时&#xff0c;尤其是完整的…...

Java面试题——事务

65. Spring事务的实现方式和实现原理 Spring事务的本质其实就是数据库对事务的支持&#xff0c;没有数据库的事务支持&#xff0c;Spring是无法提供事务功能的。Spring事务实现主要有两种方法:编程式:beginTransaction()、commit()、rollback()等事务管理相关的方法&#xff0…...

算法18(力扣136)只出现一次的数字

1、问题 给你一个 非空 整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 2、示例 &#xff08;1&…...

SiliconCloud 支持deepseek,送2000w token

SiliconCloud SiliconCloud 邀请奖励持续进行&#xff0c;2000 万 Tokens 送不停&#xff01; 邀请好友赚 2000 万 Tokens&#xff1a;每成功邀请一位新用户通过手机号码注册&#xff0c;您将获得 2000 万 Tokens&#xff1b;注册即送 2000 万 Tokens&#xff1a;受邀好友作为…...

在nodejs中使用RabbitMQ(六)sharding消息分片

RabbitMQ 的分片插件&#xff08;rabbitmq_sharding&#xff09;允许将消息分布到多个队列中&#xff0c;这在消息量很大或处理速度要求高的情况下非常有用。分片功能通过将消息拆分到多个队列中来平衡负载&#xff0c;从而提升消息处理的吞吐量和可靠性。它能够在多个队列之间…...

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况&#xff1a; 异常情况&#xff1a; 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…...

git bash在github的库中上传或更新本地文件

一、将本地文件上传到 GitHub 仓库 1. 创建 GitHub 仓库 如果你还没有在 GitHub 上创建仓库&#xff0c;首先需要创建一个新的仓库&#xff1a; 登录到 GitHub。点击右上角的 按钮&#xff0c;选择 New repository。给你的仓库起个名字&#xff0c;并选择 Public 或 Privat…...

Keysight E5071C (Agilent) 网络分析仪的特性和规格

安捷伦E5071C网络分析仪 Keysight E5071C网络分析仪 Keysight E5071C (Agilent) 网络分析仪的其他特性和规格包括&#xff1a; 宽动态范围&#xff1a;测试端口动态范围 > 123 dB&#xff08;典型值&#xff09; 快速测量速度&#xff1a;41 ms 全 2 端口校准&#xff0c;…...

总结:如何在SpringBoot中使用https协议以及自签证书?

总结&#xff1a;如何在SpringBoot中使用https协议以及自签证书&#xff1f; 前提一&#xff1a;什么是http协议&#xff1f;前提二&#xff1a;什么是https协议&#xff1f;一生成自签证书二 将证书转换为PKCS12格式三 配置SpringBoot&#xff08;1&#xff09;修改配置文件&a…...

Golang学习历程【第七篇 闭包type defer panic recover了解time包】

Golang学习历程【第七篇 闭包&type defer panic recover了解】 1. 闭包1.1 闭包的定义1.2 闭包的特点1.3 闭包的示例 2. 类型(type)2.1 自定义类型2.2 类型示例 3. 延迟执行&#xff08;Defer&#xff09;3.1 defer 的用法3.2 defer 示例 4. 恐慌&#xff08;Panic&#xf…...

基于SSM+uniapp的数学辅导小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;用户管理、学习中心、知识分类管理、学习周报管理、口算练习管理、试题管理、考试管理、错题本等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试环…...

利用AI智能体创建云端文档知识库并集成第三方数据源(上)

许多开发者在管理和集成多种云端的数据源时经常面对各种各样的困难&#xff0c;所以希望能够构建一个聊天机器人来协调这些数据源&#xff0c;针对业务问题并提供全面的答案。本文介绍了一种解决方案&#xff0c;帮助大家开发一个能够从文档和数据库中回答查询的聊天机器人&…...

聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单

近日&#xff0c;2025年度江苏省党政机关、事业单位及团体组织信息安全设备框架协议采购项目入围结果公布。聚铭网络凭借自身专业实力和技术优势脱颖而出&#xff0c;成功入围22个分包。 此次采购项目是江苏省政府采购领域级别最高、覆盖面最广的项目之一。从资格评选到后期材料…...

vue+springboot+webtrc+websocket实现双人音视频通话会议

前言 最近一些时间我有研究&#xff0c;如何实现一个视频会议功能&#xff0c;但是找了好多资料都不太理想&#xff0c;最终参考了一个文章 WebRTC实现双端音视频聊天&#xff08;Vue3 SpringBoot&#xff09; 只不过&#xff0c;它的实现效果里面只会播放本地的mp4视频文件&…...

2025年单片机毕业设计选题物联网计算机电气电子通信类

当然&#xff0c;以下是基于物联网技术设计的20个单片机类题目&#xff0c;旨在考察学生在物联网环境下单片机应用、系统设计、数据传输与处理等方面的能力&#xff1a; 基于物联网的智能家居温度湿度控制系统设计&#xff1a;利用单片机和传感器实现室内环境的温湿度监测&…...

堡垒机调用xshell 无反应

安装sso_client 确认db_path.ini xhsell路径 如图调整为本机安装的路径即可。 实战问题&#xff1a; 操作完成之后 Chrome还是无法调用&#xff0c;使用360浏览器没问题。...

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程&#xff1a; Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你&#xff1a;deepseek R1基于 AnythingLLM API 调用本地…...

Easy系列PLC 线性变换功能块(模拟量相关功能块汇总)

线性转换函数S_RTR 线性转换函数S_RTR(SCL和ST代码)_线性函数的scl语言如何编写-CSDN博客文章浏览阅读440次。博客介绍了线性转换函数S_RTR,包括其在PLC中的应用,如何与工艺PID组合使用,以及在张力开环控制中的具体实践。还提到了函数的C99兼容性,并提供了S_RTR的功能块源…...

【VB语言】EXCEL中VB宏的应用

【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、EXCEL-VB 1.实验过…...

【人工智能】如何选择合适的大语言模型,是能否提高工作效率的关键!!!

DeepSeek R1入门指南 导读一、提示语差异1.1 指令侧重点不同1.2 语言风格差异1.3 知识运用引导不同 二、挑选原则2.1 模型选择2.2 提示语设计2.3 避免误区 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在前面的内容中&#xff0c…...

Unity使用反射进行Protobuf(CS/SC)协议,json格式

protobuf生成的协议,有挺多协议的.利用反射生成dto进行伪协议的响应 和 发送请求 应用场景: 请求(CS)_后端先写完了,前端还搞完时,可使用此请求,可自测 响应(SC)_可自行构建一个响应,对数据进行测试 // 请求 使用物品 CS message ReqUseItem{optional Opcodes MessageID1[def…...

初学 mybatis

前言 回顾之前 不使用 mybatis 框架&#xff0c;我们是怎么通过Java 操作数据库的 "jdbc" 前提&#xff1a;使用maven 构建的项目 1 添加 关于jdbc 的依赖&#xff0c;以及辅助操作数据库的 commons-dubli jar包 截取 前后端项目 2 添加配置文件里面内容有&…...

java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

Tomcat 屏蔽错误信息。java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p&…...

C语言进阶习题(4结构体)【1】通讯录的实现

目录 1.使用结构体实现通讯录功能2.思路3. 代码实现3.1 test.c3.2 contact.c3.3 contact.h 1.使用结构体实现通讯录功能 主要功能有&#xff1a;显示通讯录信息&#xff0c;增加通讯录中人的信息&#xff0c;删除通讯录中人的信息&#xff0c;查找通信录中信息&#xff0c;修改…...

释放你的元数据:使用 Elasticsearch 的自查询检索器

作者&#xff1a;来自 Elastic Josh Asres 了解如何使用 Elasticsearch 的 “self-quering” 检索器来通过结构化过滤器提高语义搜索的相关性。 在人工智能搜索的世界中&#xff0c;在海量的数据集中高效地找到正确的数据至关重要。传统的基于关键词的搜索在处理涉及自然语言的…...

【Python】如何在 Linux/Windows 系统中设置 PYTHONPATH 环境变量

什么是 PYTHONPATH&#xff1f; PYTHONPATH 是一个环境变量&#xff0c;它告诉 Python 解释器在哪些目录中查找要导入的模块。这对于包含不在标准目录中的自定义模块非常有用。 Linux 系统中设置 PYTHONPATH 环境变量 在 Python 开发环境中&#xff0c;正确设置 PYTHONPATH …...

1.14学习总结

日常刷题单 刷了题目后&#xff0c;对于排序方法更加熟练&#xff0c;手搓代码的速度也得到了提高。 感觉字符串还不熟练&#xff0c;高精度更是云里雾里&#xff0c;上升空间极大。 同时看见今晚有个入门难度的测试&#xff0c;去练了练手&#xff0c;想看看自己是什么成分&…...

【Prometheus】prometheus黑盒监控balckbox全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...