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

【项目管理】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调试代码

执行调试

进入 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查看当前堆栈帧的信息。

以下是示例代码的调试界面(仅截部分作为参考):
gdb调试演示
run
断点调试
逐行调试

高级功能

条件断点

为断点设置触发条件,只有条件满足时程序才会暂停:

break 42 if x > 10# 示例:在第 42 行设置断点,当变量 x > 10 时触发。
观察点(Watchpoint)

观察某个变量的值是否发生变化:

watch x
  • 程序运行时,如果 x 的值发生改变,程序会暂停。
打印调用栈

当程序崩溃时(如发生 Segmentation Fault),可以使用以下命令打印调用栈,定位问题代码:

bt
调试核心转储文件

如果程序崩溃并生成了核心转储文件(core dump),可以使用 gdb 查看崩溃时的状态:

  1. 启用 core dump
ulimit -c unlimited
  1. 调试 core 文件:
gdb ./my_program core
  1. 使用 bt 命令查看崩溃时的调用栈。
远程调试(gdbserver)

远程调试用于嵌入式开发,调试运行在目标设备上的程序。
步骤:

  1. 目标设备 上安装并启动 gdbserver
gdbserver :1234 ./my_program
  • 目标设备上的程序将在 1234 端口 等待调试器连接。
  1. 主机 上启动 gdb 并连接到目标设备:
gdb ./my_program
target remote <目标设备IP>:1234
  1. 调试流程与普通 gdb 调试相同。

常见调试场景

1. 程序崩溃的调试

触发崩溃后,使用 bt 查看调用栈,定位崩溃的代码位置。
检查变量值是否异常:

p x
2. 内存越界问题

使用 watch 命令观察数组边界或指针的值:

watch array[index]
3. 性能问题

设置断点查看某个函数是否被频繁调用:

break function_name
  • 使用 info localsx 命令检查不必要的内存分配或操作。

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 检查寄存器和内存状态。
  • 调试 RTOS 应用
    • 设置断点到任务切换点,观察任务调度是否正常。
  • 调试内核模块
    • 使用 kgdb 调试 Linux 内核模块。

综上。gdb 是非常强大的调试工具,通过熟练掌握其命令和技巧,可以快速定位和解决程序中的问题。无论是调试普通 C/C++ 程序还是嵌入式设备中的驱动程序,gdb 都是不可或缺的工具。建议从常用命令入手,逐步学习高级功能,并结合实际项目练习,提升调试效率。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关文章:

【项目管理】GDB调试

gdb&#xff08;GNU Debugger&#xff09; 是 Linux 和嵌入式开发中最常用的调试工具之一&#xff0c;可以用来调试 C/C 程序、排查崩溃、分析程序流程等。在嵌入式开发中&#xff0c;gdb 还可以通过远程调试&#xff08;gdbserver&#xff09;调试目标设备上的程序。 这篇文章…...

ChatGPT生成接口测试用例(一)

用ChatGPT做软件测试 接口测试在软件开发生命周期中扮演着至关重要的角色&#xff0c;有助于验证不同模块之间的交互是否正确。若协议消息被恶意修改&#xff0c;系统是否能够恰当处理&#xff0c;以确保系统的功能正常运行&#xff0c;不会出现宕机或者安全问题。 5.1 ChatGP…...

2024 年 IA 技术大爆发深度解析

摘要&#xff1a; 本文旨在深入剖析 2024 年 IA 技术大爆发所引发的多方面反响。通过对产业变革、经济影响、就业市场、社会影响、政策与监管以及未来展望等维度的探讨&#xff0c;揭示 IA 技术在这一关键时期对全球各个层面带来的深刻变革与挑战&#xff0c;并提出相应的思考与…...

如何进行js后台框架搭建(树形菜单,面包屑,全屏功能,刷新功能,监听页面刷新功能)

框架功能是后台高亮不可缺少的功能&#xff0c;基本上所有的后台都需要框架功能&#xff0c;下面是我制作好的一个效果图 下面是我的框架里面功能的具体讲解&#xff0c;还有完整的代码示例 1.声明的变量 // 声明一个用于判断个人信息显示变量 let myes 0; // 声明一个用于切…...

多目标优化常用方法:pareto最优解

生产实际中的许多优化问题大都是多目标问题&#xff0c;举个例子&#xff1a;我们想换一份工资高、压力小、离家近的新工作&#xff0c;这里工资高、压力小、离家近就是我们的目标&#xff0c;显然这是一个多目标问题&#xff0c;那我们肯定想找到这三个目标同时最优的工作&…...

Vue.js实例开发-如何通过Props传递数据

props 是父组件用来传递数据给子组件的一种机制。通过 props&#xff0c;你可以将数据从父组件“传递”到子组件&#xff0c;并在子组件的模板和逻辑中使用这些数据。 1. 定义子组件并接收 props 首先&#xff0c;定义一个子组件&#xff0c;并在该组件中声明它期望接收的 pr…...

由popover框一起的操作demo问题

场景&#xff1a; 当popover框弹出的时候&#xff0c;又有MessageBox 提示&#xff0c;此时关闭MessageBox 提示&#xff0c;popover就关闭了。将popover改为手动激活&#xff0c;可以解决这个问题&#xff0c;但是会引起另外一个问题&#xff0c;之前&#xff08;click触发的时…...

人工智能ACA(四)--机器学习基础

零、参考资料 一篇文章完全搞懂正则化&#xff08;Regularization&#xff09;-CSDN博客 一、 机器学习概述 0. 机器学习的层次结构 学习范式&#xff08;最高层&#xff09; 怎么学 监督学习 无监督学习 半监督学习 强化学习 学习任务&#xff08;中间层&#xff0…...

uniapp图片数据流���� JFIF ��C 转化base64

1&#xff0c;后端返回的是图片数据流&#xff0c;格式如下 &#xfffd;&#xfffd;&#xfffd;&#xfffd; JFIF &#xfffd;&#xfffd;C 如何把这样的文件流转化为base64&#xff0c; btoa 是浏览器提供的函数&#xff0c;但在 小程序 环境中&#xff08;如微信小程序…...

django中cookie与session的使用

一、cookie cookie由服务器生成 &#xff0c;存储在浏览器中的键值对数据,具有不安全性&#xff0c;对应敏感数据应该加密储存在服务端每个域名的cookie相互独立浏览器访问域名为A的url地址&#xff0c;会把A域名下的cookie一起传递到服务器cookie可以设置过期时间 django中设…...

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLO Visdrone航拍目标识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一…...

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT&#xff08;Transient Execution &#xff09;Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…...

OPPO 数据分析面试题及参考答案

如何设计共享单车数据库的各个字段? 对于共享单车的数据库设计,首先考虑用户相关的字段。用户表可以包含用户 ID,这是一个唯一标识符,用于区分不同用户;姓名,记录用户的真实姓名;联系方式,比如手机号码,方便在出现问题时联系用户;注册时间,记录用户何时开始使用共享…...

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…...

Mac M1使用pip3安装报错

1. Mac系统使用pip3安装组件的时候报”外部管理环境”错误&#xff1a; error: externally-managed-environment 2.解决办法 去掉这个提示 1、先查看当前python版本&#xff1a; python3 --version 2、查找EXTERNALLY-MANAGED 文件的位置&#xff08;根据自己当前使用的pytho…...

flask-admin的modelview 实现list列表视图中扩展修改状态按钮

背景&#xff1a; 在flask-admin的模型视图&#xff08;modelview 及其子类&#xff09;中如果不想重构UI视图&#xff0c;那么就不可避免的出现默认视图无法很好满足需求的情况&#xff0c;如默认视图中只有“新增”&#xff0c;“编辑”&#xff0c;“选中的”三个按钮。 材…...

算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II

93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"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&#xff0c;这个软件非常好用&#xff0c;也非常稳定&#xff0c;但是有个缺点&#xff0c;就是会无条件拦截本机所有流量&#xff0c;而且会加入所有运行的exe程序&#xff0c;实现流量全部走代理。 准备材料 一个windows/Linux 桌面版虚拟机Ea…...

【AI系列】Paddle Speech安装指南

文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误&#xff1a;libssl.so.1.1解决方法&#xff1a; 5.2 错误&#xff1…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...