【项目管理】GDB调试
gdb(GNU Debugger) 是 Linux 和嵌入式开发中最常用的调试工具之一,可以用来调试 C/C++ 程序、排查崩溃、分析程序流程等。在嵌入式开发中,gdb 还可以通过远程调试(gdbserver)调试目标设备上的程序。
这篇文章是 gdb 调试的入门指南,包括常见命令、使用场景和一些高级技巧。
安装 gdb:
sudo apt-get update
sudo apt-get install gdb
基本使用流程
编译时开启调试信息
在使用 gdb 调试程序之前,必须在编译时启用调试信息。确保编译时加上 -g 参数:
gcc -g -o my_program my_program.c
启动 gdb
启动 gdb 并加载可执行文件:
gdb ./my_program
gdb a.out
gdb app#调试完毕后退出
q: qiut

执行调试
进入 gdb 后,可以通过命令控制程序执行和调试流程:
- 设置断点。
- 单步调试。
- 查看变量值、堆栈信息等。
常用命令
程序控制
| 命令 | 功能 |
|---|---|
| run 或 r | 启动程序并在 main() 函数处暂停。 |
| start | $12 |
| continue 或 c | 继续运行程序直到下一个断点或程序结束。 |
| quit 或 q | 退出 gdb 调试器。 |
| kill | 终止当前调试的程序。 |
断点管理
| 命令 | 功能 |
|---|---|
| break [行号/函数名] | 在指定行号或函数入口处设置断点。 |
| info breakpoints | 查看所有断点。 |
| delete [断点编号] | 删除指定断点(不加编号则删除所有断点)。 |
| disable [编号] | 禁用某个断点(不删除)。 |
| enable [编号] | 启用某个断点。 |
| condition [编号] 条件 | 为断点设置条件(满足条件时才会触发)。 |
单步调试
| 命令 | 功能 |
|---|---|
| step 或 s | 单步执行代码(进入函数内部)。 |
| next 或 n | 单步执行代码(跳过函数调用)。 |
| finish 或 fi | 执行完当前函数,返回调用函数处。 |
| until [行号] | 执行到指定行号处。 |
| jump [行号] | 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。 |
变量和内存查看
| 命令 | 功能 |
|---|---|
| print [变量名] 或 p [变量名] | 打印变量值(支持表达式)。 |
| set variable [变量名]=值 | 修改变量值。 |
| info locals | 查看当前函数中的所有局部变量。 |
| info variables | 查看程序中定义的变量。 |
| x/[格式][单位] 地址 | 查看内存内容(如 x/4xw 查看 4 个字)。 |
格式说明:
- 格式:x(十六进制)、d(十进制)、c(字符)、s(字符串)。
- 单位:
- b:字节(1 byte)。
- h:半字(2 bytes)。
- w:字(4 bytes)。
- g:双字(8 bytes)。
查看代码和堆栈
| 命令 | 功能 |
|---|---|
| list 或 l | 查看当前代码(默认显示 10 行)。 |
| list [行号/函数名] | 查看指定行号或函数的代码。 |
| backtrace 或 bt | 显示函数调用堆栈。 |
| frame [编号] | 切换到指定堆栈帧。 |
| info frame | 查看当前堆栈帧的信息。 |
以下是示例代码的调试界面(仅截部分作为参考):




高级功能
条件断点
为断点设置触发条件,只有条件满足时程序才会暂停:
break 42 if x > 10# 示例:在第 42 行设置断点,当变量 x > 10 时触发。
观察点(Watchpoint)
观察某个变量的值是否发生变化:
watch x
- 程序运行时,如果 x 的值发生改变,程序会暂停。
打印调用栈
当程序崩溃时(如发生 Segmentation Fault),可以使用以下命令打印调用栈,定位问题代码:
bt
调试核心转储文件
如果程序崩溃并生成了核心转储文件(core dump),可以使用 gdb 查看崩溃时的状态:
- 启用
core dump:
ulimit -c unlimited
- 调试
core文件:
gdb ./my_program core
- 使用
bt命令查看崩溃时的调用栈。
远程调试(gdbserver)
远程调试用于嵌入式开发,调试运行在目标设备上的程序。
步骤:
- 目标设备 上安装并启动
gdbserver:
gdbserver :1234 ./my_program
- 目标设备上的程序将在
1234 端口等待调试器连接。
- 主机 上启动
gdb并连接到目标设备:
gdb ./my_program
target remote <目标设备IP>:1234
- 调试流程与普通
gdb调试相同。
常见调试场景
1. 程序崩溃的调试
触发崩溃后,使用 bt 查看调用栈,定位崩溃的代码位置。
检查变量值是否异常:
p x
2. 内存越界问题
使用 watch 命令观察数组边界或指针的值:
watch array[index]
3. 性能问题
设置断点查看某个函数是否被频繁调用:
break function_name
- 使用
info locals和x命令检查不必要的内存分配或操作。
gdb 调试技巧
1. 使用 .gdbinit 文件
在项目目录下创建 .gdbinit 文件,可以预先配置常用命令。例如:
set pagination off
set print pretty on
2. 命令别名
为常用命令创建别名。例如:
define bmainbreak main
end
- 输入
bmain时会自动设置断点到main()。
3. 保存调试会话
将调试命令保存到脚本文件中,以便快速重现调试流程:
gdb -x commands.gdb
其中 commands.gdb 文件内容示例:
break main
run
bt
嵌入式开发中的 gdb 应用
在嵌入式开发中,gdb 通常用于调试运行在目标硬件上的程序,以下是常见场景:
- 调试裸机程序:
- 使用硬件调试器(如 JTAG)连接目标设备,通过
gdb检查寄存器和内存状态。
- 使用硬件调试器(如 JTAG)连接目标设备,通过
- 调试 RTOS 应用:
- 设置断点到任务切换点,观察任务调度是否正常。
- 调试内核模块:
- 使用
kgdb调试 Linux 内核模块。
- 使用
综上。gdb 是非常强大的调试工具,通过熟练掌握其命令和技巧,可以快速定位和解决程序中的问题。无论是调试普通 C/C++ 程序还是嵌入式设备中的驱动程序,gdb 都是不可或缺的工具。建议从常用命令入手,逐步学习高级功能,并结合实际项目练习,提升调试效率。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【项目管理】GDB调试
gdb(GNU Debugger) 是 Linux 和嵌入式开发中最常用的调试工具之一,可以用来调试 C/C 程序、排查崩溃、分析程序流程等。在嵌入式开发中,gdb 还可以通过远程调试(gdbserver)调试目标设备上的程序。 这篇文章…...
ChatGPT生成接口测试用例(一)
用ChatGPT做软件测试 接口测试在软件开发生命周期中扮演着至关重要的角色,有助于验证不同模块之间的交互是否正确。若协议消息被恶意修改,系统是否能够恰当处理,以确保系统的功能正常运行,不会出现宕机或者安全问题。 5.1 ChatGP…...
2024 年 IA 技术大爆发深度解析
摘要: 本文旨在深入剖析 2024 年 IA 技术大爆发所引发的多方面反响。通过对产业变革、经济影响、就业市场、社会影响、政策与监管以及未来展望等维度的探讨,揭示 IA 技术在这一关键时期对全球各个层面带来的深刻变革与挑战,并提出相应的思考与…...
如何进行js后台框架搭建(树形菜单,面包屑,全屏功能,刷新功能,监听页面刷新功能)
框架功能是后台高亮不可缺少的功能,基本上所有的后台都需要框架功能,下面是我制作好的一个效果图 下面是我的框架里面功能的具体讲解,还有完整的代码示例 1.声明的变量 // 声明一个用于判断个人信息显示变量 let myes 0; // 声明一个用于切…...
多目标优化常用方法:pareto最优解
生产实际中的许多优化问题大都是多目标问题,举个例子:我们想换一份工资高、压力小、离家近的新工作,这里工资高、压力小、离家近就是我们的目标,显然这是一个多目标问题,那我们肯定想找到这三个目标同时最优的工作&…...
Vue.js实例开发-如何通过Props传递数据
props 是父组件用来传递数据给子组件的一种机制。通过 props,你可以将数据从父组件“传递”到子组件,并在子组件的模板和逻辑中使用这些数据。 1. 定义子组件并接收 props 首先,定义一个子组件,并在该组件中声明它期望接收的 pr…...
由popover框一起的操作demo问题
场景: 当popover框弹出的时候,又有MessageBox 提示,此时关闭MessageBox 提示,popover就关闭了。将popover改为手动激活,可以解决这个问题,但是会引起另外一个问题,之前(click触发的时…...
人工智能ACA(四)--机器学习基础
零、参考资料 一篇文章完全搞懂正则化(Regularization)-CSDN博客 一、 机器学习概述 0. 机器学习的层次结构 学习范式(最高层) 怎么学 监督学习 无监督学习 半监督学习 强化学习 学习任务(中间层࿰…...
uniapp图片数据流���� JFIF ��C 转化base64
1,后端返回的是图片数据流,格式如下 ���� JFIF ��C 如何把这样的文件流转化为base64, btoa 是浏览器提供的函数,但在 小程序 环境中(如微信小程序…...
django中cookie与session的使用
一、cookie cookie由服务器生成 ,存储在浏览器中的键值对数据,具有不安全性,对应敏感数据应该加密储存在服务端每个域名的cookie相互独立浏览器访问域名为A的url地址,会把A域名下的cookie一起传递到服务器cookie可以设置过期时间 django中设…...
<项目代码>YOLO Visdrone航拍目标识别<目标检测>
项目代码下载链接 <项目代码>YOLO Visdrone航拍目标识别<目标检测>https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一…...
GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录
文章目录 论文背景Spectre-PHT(Transient Execution )Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…...
OPPO 数据分析面试题及参考答案
如何设计共享单车数据库的各个字段? 对于共享单车的数据库设计,首先考虑用户相关的字段。用户表可以包含用户 ID,这是一个唯一标识符,用于区分不同用户;姓名,记录用户的真实姓名;联系方式,比如手机号码,方便在出现问题时联系用户;注册时间,记录用户何时开始使用共享…...
腾讯云云开发 Copilot 深度探索与实战分享
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代,…...
Mac M1使用pip3安装报错
1. Mac系统使用pip3安装组件的时候报”外部管理环境”错误: error: externally-managed-environment 2.解决办法 去掉这个提示 1、先查看当前python版本: python3 --version 2、查找EXTERNALLY-MANAGED 文件的位置(根据自己当前使用的pytho…...
flask-admin的modelview 实现list列表视图中扩展修改状态按钮
背景: 在flask-admin的模型视图(modelview 及其子类)中如果不想重构UI视图,那么就不可避免的出现默认视图无法很好满足需求的情况,如默认视图中只有“新增”,“编辑”,“选中的”三个按钮。 材…...
算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II
93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...
imu相机EKF
ethzasl_sensor_fusion/Tutorials/Introductory Tutorial for Multi-Sensor Fusion Framework - ROS Wiki https://github.com/ethz-asl/ethzasl_msf/wiki...
【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化
场景 公司用的是EasyConnect,这个软件非常好用,也非常稳定,但是有个缺点,就是会无条件拦截本机所有流量,而且会加入所有运行的exe程序,实现流量全部走代理。 准备材料 一个windows/Linux 桌面版虚拟机Ea…...
【AI系列】Paddle Speech安装指南
文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误:libssl.so.1.1解决方法: 5.2 错误࿱…...
扁平化AI绘图黄金公式:sref 1280+--stylize 600+--v 6.2,为什么92%用户漏掉关键权重锚点?
更多请点击: https://codechina.net 第一章:扁平化AI绘图黄金公式的认知革命 传统AI绘图依赖复杂提示工程与多层参数调优,而“扁平化AI绘图黄金公式”颠覆了这一范式——它将生成逻辑压缩为三个可解释、可复用、可验证的核心要素:…...
提升3倍效率的Windows桌面端酷安社区解决方案:基于UWP平台的高性能第三方客户端
提升3倍效率的Windows桌面端酷安社区解决方案:基于UWP平台的高性能第三方客户端 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP Coolapk-UWP是一款基于UWP平台的第三方酷安客户…...
Wand-Enhancer终极指南:一键解锁WeMod完整功能
Wand-Enhancer终极指南:一键解锁WeMod完整功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod免费版的诸多限制而烦恼吗&#x…...
智慧养殖与猪行为实例分割数据集 动物行为分析数据集 生猪进食数据集 生猪睡觉站立姿态识别数据集 yolo格式数据集
猪行为实例分割数据集核心信息 类别 Tags 标签 Instance Segmentation 实例分割 Model 模型Classes (4) 类别(4) Eating 进食 Lying 躺着 Sitting 坐着 Standing 站立数据集关键信息表信息类别具体内容数据集类别猪行为实例分割数据集,聚焦猪…...
告别明文传输!手把手教你用JS+国密SM2加密登录密码(附C#/Java后端解密代码)
国密SM2算法实战:从JS前端加密到C#/Java后端解密的完整指南 在当今数字化时代,Web应用安全已成为开发者不可忽视的重要课题。每次登录、每次数据传输都可能成为潜在的安全漏洞,特别是当敏感信息如用户密码以明文形式在网络中传输时。作为开发…...
金属3D打印光束整形:两大路线正面PK
作为金属3D打印技术的最新发展,开展光束整形技术研究的企业越来越多,研发的进程也越来越深。3D打印技术参考注意到,国外由EOS引领该技术发展,同时还有Aconity3D和DMG Mori等行业领导者;在国内,铂力特、华曙…...
Blender新手必看:别再乱点右上角那个“漏斗”了,详解大纲视图的4个隐藏开关
Blender新手避坑指南:揭秘大纲视图四大开关的实战应用 刚接触Blender时,界面右上角那个不起眼的漏斗图标就像潘多拉魔盒——点开后出现的四个神秘开关(禁用选中、视图隐藏、视图禁用、渲染禁用)让无数新手陷入选择困难。这些看似简…...
FalkorDB 的边存储原理:为什么查邻居是 O(degree)?
很多人第一次看到 FalkorDB 的架构时,会有一个疑问:它不用传统 adjacency list(邻接链表),而是用 sparse matrix(稀疏矩阵)维护边,那它到底怎么高效找到某个节点的所有边?…...
Best Practice for AI Agents Project _ Chapter 1
很高兴he大家分享,《AI智能体项目最佳实践》内容,系统覆盖从单智能体工程基础,到私有知识注入、能力扩展、安全设计,再到多智能体协同的完整企业AI落地路径。本次分享第一章:从模型调用到可靠的单智能体(Fr…...
别再死记硬背了!用Python+DEAP库5分钟搞定NSGA-II多目标优化(附完整代码)
用PythonDEAP库5分钟实现NSGA-II多目标优化实战 当我们需要同时优化多个相互冲突的目标时,比如在机器学习中既要模型精度高又要推理速度快,传统单目标优化方法就捉襟见肘了。NSGA-II(非支配排序遗传算法II)作为多目标优化领域的标…...
