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)tuienable2. 焦点切换快捷键
- Ctrl+X+A:退出 TUI 模式或焦点模式
- 进入 focus 模式:
在 TUI 模式下,(gdb)focusfocus命令可以让焦点在不同窗口(源码、汇编、寄存器等)间切换。
3. 重新加载程序
调试过程中重新加载可执行文件:
(gdb)load三、汇编级调试
1. 显示汇编窗口
(gdb)layout asm该命令会在 TUI 模式下打开汇编代码窗口,实时显示当前执行的汇编指令。
2. 显示寄存器窗口
(gdb)layout regs同时显示汇编代码和寄存器状态,适合底层调试。
3. 查看程序入口地址
(gdb)info files显示可执行文件的段信息,包括文本段(代码)的起始地址和大小。
4. 查看函数信息
(gdb)info functions列出程序中所有函数名及其地址。
四、执行控制
1. 单步执行(不进入函数)
(gdb)nnext命令的简写,执行下一行源代码,但不会进入被调用的函数内部。
2. 单步执行(进入函数)
(gdb)sstep命令的简写,执行下一行源代码,如果该行是函数调用,则进入该函数内部。
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=0x0display命令会在每次程序暂停时自动显示指定表达式的值。
3. 管理 display 列表
(gdb)info display查看所有通过display设置的自动显示表达式及其编号。
七、GDB 脚本自动化
GDB 支持脚本自动化,可以批量执行调试命令,特别适合重复性调试任务。
1. 创建脚本文件
创建test.gdb或test.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.sh3. 脚本应用场景
- 批量检查寄存器或内存值
- 自动化测试用例执行
- 复杂断点条件设置
- 性能分析数据收集
八、调试技巧总结
- 编译必加
-g:没有调试信息,GDB 只能进行汇编级调试。 - 善用 TUI:
layout asm和layout regs大幅提升汇编调试效率。 - 变量跟踪:
display自动显示关键变量,info display管理显示列表。 - 脚本化调试:重复性任务用脚本自动化,减少手动操作。
- 灵活跳转:
set var $pc可以在汇编级实现指令跳转,用于绕过某些代码段。