4、GDB TUI模式入门:TUI模式启动、TUI窗口布局、TUI快捷键、TUI模式配置

说实话,很多嵌入式工程师调试代码时,还在用最原始的方式——print大法满天飞。要么就是GDB命令行下一顿敲,list、break、next来回切,眼睛都快看花了。

我个人习惯用GDB的TUI模式。说白了,就是把GDB变成带界面的调试器。你想想看,左边看源码,右边敲命令,下面还能实时看汇编——这不比纯命令行舒服多了?

今天我们就来聊聊GDB TUI模式怎么玩。嗯,内容不多,但都是干货。

核心知识点速览

  • TUI模式启动:三种方式,总有一种适合你
  • 窗口布局:源码、汇编、寄存器、命令,想怎么摆就怎么摆
  • 快捷键:不用鼠标也能飞
  • 配置技巧:让TUI记住你的习惯
GDB TUI模式 启动方式 -tui / gdbtui / 运行时切换 窗口布局 src/asm/regs/cmd 快捷键 C-x C-a / C-x 1/2/s 配置技巧 .gdbinit / layout命令 调试效率提升 50%+

4.1 启动TUI模式

启动TUI模式有三种方式,我挨个说。

方式一:启动时直接进入TUI

最直接的方法,加个 -tui 参数就行:

gdb -tui ./my_program

我个人最常用这个。调试嵌入式程序时,我习惯先编译好,然后一条命令直接进TUI界面。

方式二:使用 gdbtui 命令

有些系统上,你可以直接用 gdbtui 替代 gdb:

gdbtui ./my_program

效果和上面一样。不过说实话,我很少这么用,因为不是所有平台都支持这个命令。

方式三:运行时切换

这个最实用。你已经在GDB命令行里了,突然想切到TUI模式?

(gdb) tui enable

或者用快捷键 C-x C-a(按住Ctrl再按x,然后按a)。想退出TUI?tui disable 或者再按一次 C-x C-a。

我的小技巧: 调试嵌入式裸机程序时,我经常先用命令行设好断点,再用 C-x C-a 切到TUI模式。这样能避免TUI模式下输入命令时的手忙脚乱。

4.2 TUI窗口布局

进入TUI模式后,你会看到几个窗口。默认情况下,上面是源码窗口,下面是命令窗口。

但GDB的TUI远不止这么简单。你可以用 layout 命令切换布局:

命令 布局说明 适用场景
layout src 源码窗口 + 命令窗口 日常调试,看代码逻辑
layout asm 汇编窗口 + 命令窗口 分析底层执行,看指令流水
layout split 源码 + 汇编 + 命令(三窗口) 需要对照源码和汇编时
layout regs 寄存器窗口 + 当前布局 跟踪寄存器变化,调试中断/异常
layout next 切换到下一个可用布局 懒得记命令时循环切换

举个例子,我在调试一个ARM Cortex-M的启动代码时,经常用 layout split。上面看C源码,中间看汇编,下面敲命令。这样能一眼看出编译器把C代码优化成了什么样子。

注意: 寄存器窗口(regs)会占用不少屏幕空间。如果你的终端窗口不够大,建议用 layout regs 之前先调大窗口,或者用 winheight 命令调整各窗口的高度。

4.3 TUI快捷键

嗯,快捷键这块,我刚开始用的时候也记不住。但用多了就发现,其实常用的就几个。

快捷键 功能 我的使用频率
C-x C-a 切换TUI模式(开/关) ⭐⭐⭐⭐⭐
C-x 1 只显示一个窗口(去掉源码/汇编) ⭐⭐⭐
C-x 2 显示两个窗口(恢复默认) ⭐⭐⭐
C-x s 切换到单步执行模式(Step mode) ⭐⭐⭐⭐
C-x o 切换活动窗口 ⭐⭐⭐⭐⭐
PgUp / PgDn 源码窗口翻页 ⭐⭐⭐⭐
上下箭头 在命令窗口浏览历史命令 ⭐⭐⭐⭐⭐

我最常用的其实是 C-x o。为什么?因为有时候我想在源码窗口里上下翻看代码,但默认焦点在命令窗口。按一下 C-x o 把焦点切到源码窗口,就能用上下键翻页了。看完再切回来继续敲命令。

避坑指南: 我曾经在TUI模式下不小心按了 C-x C-a 退出了TUI,结果一脸懵。后来我养成了习惯:在 .gdbinit 里加上 set tui enable on,这样每次启动GDB都自动进TUI模式,省得手忙脚乱。

4.4 TUI模式配置

每次进TUI都要重新调布局?太麻烦了。我们可以把配置写进 .gdbinit 文件里。

这是我的个人配置,你可以参考:

# ~/.gdbinit 配置示例
# 自动启用TUI模式
set tui enable on

# 设置默认布局为 split(源码+汇编)
layout split

# 调整窗口高度:源码窗口15行,汇编窗口10行
winheight src 15
winheight asm 10

# 显示寄存器窗口
layout regs

# 设置反汇编风格为 Intel(如果你用x86)
set disassembly-flavor intel

# 开启TUI模式下鼠标支持(某些终端支持)
set tui mouse-events on

把这些写进 ~/.gdbinit 后,每次启动GDB,TUI模式就会自动按你的喜好布局。

重要提醒: .gdbinit 文件里的命令是按顺序执行的。所以如果你先 layout split 再 layout regs,最终效果是 split 布局加上寄存器窗口。如果你先 layout regs 再 layout split,寄存器窗口会被覆盖掉。顺序很重要!

另外,TUI模式下还有一些有用的设置:

  • set tui border-kind ascii — 用ASCII字符画边框,兼容性更好
  • set tui border-kind space — 用空格画边框,更简洁
  • set tui active-border-mode standout — 高亮当前活动窗口的边框
  • show tui — 查看当前所有TUI相关的设置

我个人喜欢用 set tui border-kind space,因为有些终端对Unicode边框字符支持不好,显示出来是乱码。用空格虽然丑了点,但至少不会出错。

好了,TUI模式的基础就这些。说白了,启动、布局、快捷键、配置,四步走完,你就能在GDB里拥有一个半图形化的调试界面了。下次调试的时候试试看,你会发现回不去的——至少我是这样。

最后一个小建议: 刚开始用TUI时,别急着配一堆花里胡哨的东西。先学会 C-x C-a 切换、layout split 分屏、C-x o 切焦点,这三个用熟了,效率就已经起飞了。

可可精品资料库