【项目管理】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 错误࿱…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...