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

GDB 调试实战:从基础命令到高级汇编调试技巧

前言

GDB(GNU Debugger)是 Linux/Unix 系统下功能最强大的命令行调试工具,尤其适合 C/C++ 程序的调试。本文将从编译调试程序开始,逐步介绍 GDB 的常用命令、TUI 图形界面、汇编级调试、变量操作以及自动化脚本编写等实战技巧,帮助开发者提升调试效率。

一、编译可调试程序

使用-g选项编译程序,生成包含调试信息的可执行文件:

gcc-gtest.c-otest

-g选项会在可执行文件中嵌入源代码行号、变量类型、函数名等调试信息,这是 GDB 能够进行源码级调试的前提。

二、TUI 模式与焦点切换

1. 进入 TUI 模式

GDB 的 TUI(Text User Interface)模式提供了分屏显示,可以同时查看源代码、汇编代码和寄存器状态。

gdb-tui./test

或启动后进入:

(gdb)tuienable

2. 焦点切换快捷键

  • Ctrl+X+A:退出 TUI 模式或焦点模式
  • 进入 focus 模式
    (gdb)focus
    在 TUI 模式下,focus命令可以让焦点在不同窗口(源码、汇编、寄存器等)间切换。

3. 重新加载程序

调试过程中重新加载可执行文件:

(gdb)load

三、汇编级调试

1. 显示汇编窗口

(gdb)layout asm

该命令会在 TUI 模式下打开汇编代码窗口,实时显示当前执行的汇编指令。

2. 显示寄存器窗口

(gdb)layout regs

同时显示汇编代码和寄存器状态,适合底层调试。

3. 查看程序入口地址

(gdb)info files

显示可执行文件的段信息,包括文本段(代码)的起始地址和大小。

4. 查看函数信息

(gdb)info functions

列出程序中所有函数名及其地址。

四、执行控制

1. 单步执行(不进入函数)

(gdb)n

next命令的简写,执行下一行源代码,但不会进入被调用的函数内部。

2. 单步执行(进入函数)

(gdb)s

step命令的简写,执行下一行源代码,如果该行是函数调用,则进入该函数内部。

3. 汇编级跳转

在汇编调试时,可以强制修改程序计数器(PC)实现跳转:

(gdb)setvar$pc=0x60000ec8(gdb)n

第一行将 PC 寄存器设置为指定地址,第二行执行该地址的指令。

五、断点管理

1. 删除断点

(gdb)delete1

删除编号为 1 的断点。使用info breakpoints可以查看所有断点及其编号。

图示:GDB TUI 模式下的分屏调试界面,同时显示源代码、汇编和寄存器状态。

六、变量操作

1. 自定义变量

GDB 允许创建临时变量用于计算或存储中间结果:

(gdb)setvar$huang=1(gdb)p$huang$4=0x1

$huang是用户自定义变量,p(print)命令显示其值。

2. 显示变量值

  • 一次性查看

    (gdb)p dtop_ana->fs_pmu_reg_cfg52._b.force_aon_ldo_bias_ctrl_s2a $6=0x0
  • 自动显示

    (gdb)display dtop_ana->fs_pmu_reg_cfg52._b.force_aon_ldo_bias_ctrl_s2a5:dtop_ana->fs_pmu_reg_cfg52._b.force_aon_ldo_bias_ctrl_s2a=0x0

    display命令会在每次程序暂停时自动显示指定表达式的值。

3. 管理 display 列表

(gdb)info display

查看所有通过display设置的自动显示表达式及其编号。

七、GDB 脚本自动化

GDB 支持脚本自动化,可以批量执行调试命令,特别适合重复性调试任务。

1. 创建脚本文件

创建test.gdbtest.sh(文件名随意),添加 GDB 命令:

printf"========================\n"printf"dtop_ana->fs_pmu_reg_cfg34._b.meter_atb_p_sel: 0x%x\n",dtop_ana->fs_pmu_reg_cfg34._b.meter_atb_p_sel printf"dtop_ana->fs_pmu_reg_cfg34._b.meter_atb_n_sel: 0x%x\n",dtop_ana->fs_pmu_reg_cfg34._b.meter_atb_n_sel printf"\n"

2. 执行脚本

在 GDB 中加载并执行脚本:

(gdb)sourcetest.sh

3. 脚本应用场景

  • 批量检查寄存器或内存值
  • 自动化测试用例执行
  • 复杂断点条件设置
  • 性能分析数据收集

八、调试技巧总结

  1. 编译必加-g:没有调试信息,GDB 只能进行汇编级调试。
  2. 善用 TUIlayout asmlayout regs大幅提升汇编调试效率。
  3. 变量跟踪display自动显示关键变量,info display管理显示列表。
  4. 脚本化调试:重复性任务用脚本自动化,减少手动操作。
  5. 灵活跳转set var $pc可以在汇编级实现指令跳转,用于绕过某些代码段。
http://www.jsqmd.com/news/1301799/

相关文章:

  • 如何在Linux系统上完美支持100+打印机:foo2zjs开源驱动完整指南
  • 三分钟唤醒你的智能伙伴:让小爱音箱拥有ChatGPT的灵魂
  • 终极中文POB指南:3分钟掌握PoeCharm流放之路角色构建
  • OpenClaw便携式2026,笔记本与U盘双模式使用
  • untrunc终极指南:快速修复损坏MP4视频的免费开源神器
  • 从0到月入3万:AI接单者不愿公开的定价阶梯模型,含成本锚点计算表
  • 如何在嵌入式设备上实现高性能AI推理:RKNPU2神经网络处理单元深度解析
  • 认知虫洞构造手册:基于黎曼-彭罗斯条件的对话拓扑隧道及其在创造性突破中的实证检测(手稿)
  • 如何在3分钟内免安装使用微信网页版:终极指南
  • 终极KMS激活指南:3分钟免费激活Windows和Office全系列
  • 30KG重载机器人对比:柔性力控与恒力打磨工艺,越疆行业智能升级
  • 终极QMC音频解密指南:免费快速转换QQ音乐加密文件
  • YimMenu终极指南:如何用这款GTA5防崩溃菜单保护你的游戏体验
  • Loop for macOS:5分钟掌握视觉化窗口管理终极解决方案
  • 692.前k个高频单词(堆优先队列)
  • Box64终极指南:如何在ARM64设备上流畅运行x86_64 Linux程序
  • 瑞芯微RK3588S Android12 REE 指纹代码移植(1)--Kernel移植
  • 3个理由告诉你为什么BiliBili-UWP是Windows上最优秀的B站第三方客户端
  • 7 月总结:独立开发者从 0 到 1 的完整回顾——技术、产品与市场的三角平衡
  • VOC2028 安全帽佩戴检测数据集介绍、下载及YOLO/VOC/COCO训练格式转换
  • Python+Pyecharts实现动态销售数据可视化实战
  • 治愈系生活工具的设计系统:从颜色语义到组件规范
  • 第二阶段 15 · prefix / wildcard / fuzzy 模糊匹配
  • 从几个开源项目浅谈IOS视频流输出方案
  • 专科生论文写作工具对比:千笔与文途AI深度评测
  • 工具型PM发现Axure再熟练也画不出Agent的产品体验,开始重新学设计AI产品
  • RK平台SENSOR框架分析
  • 终极免费AI视频增强神器:3步将模糊视频无损升级到4K超高清
  • 内蕴时空正则化纲领:分形时间重构消解Navier–Stokes有限时间奇点
  • git多人开发流程