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可以在汇编级实现指令跳转,用于绕过某些代码段。