前言
GDB 文本用户界面(Text User Interface, TUI)是一个基于 curses 库的终端界面,用于在独立的文本窗口中显示源代码文件、汇编输出、程序寄存器和 GDB 命令。它让命令行调试拥有了更直观的可视化体验。要使用 TUI 功能,你的系统必须安装 curses 库。本文将详细介绍 TUI 的使用,教你如何打造适合自己的高效调试界面。
官方文档参考:https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.html#TUI
基本操作
2.1 窗口
TUI 支持以下几类窗口:
- 命令窗口 (command): 用于输入命令和打印输出。
- 源码窗口 (source): 用于显示源码,
> 标记并高亮的行表示当前执行位置。
- 汇编窗口 (assembly): 用于显示汇编代码,
> 标记并高亮的行表示当前执行位置。
- 寄存器窗口 (register): 用于显示寄存器值,值改变时会高亮。
此外,还有一行状态栏 (status),位于命令窗口的上方。状态栏显示以下信息:target(目标), process(进程), focus(焦点), function(函数), line(行号), pc(程序计数器)。
命令窗口和状态栏总是存在的。其他窗口支持以下布局组合:
- 仅源码 (source)
- 仅汇编 (assembly)
- 源码和汇编 (source + assembly)
- 源码和寄存器 (source + registers)
- 汇编和寄存器 (assembly + registers)
断点标记
在 TUI 的源码或汇编窗口中,断点用两个字符标记:[B|b|H|h] [+|-]。
B 表示软件断点至少触发了一次。
b 表示软件断点还未触发过。
H 表示硬件断点至少触发了一次。
h 表示硬件断点还未触发过。
+ 表示断点是使能的。
- 表示断点是未使能的。
例如,标记 H+ 表示这是一个使能且已至少触发过一次的硬件断点。

以下是一个使用 tui new-layout 命令创建的自定义布局的完整显示界面示例。

2.2 按键操作
TUI 的快捷键设计类似于 Emacs。下文中,C 表示 Ctrl 键,- 表示同时按下,空格表示先后按键。
例如:
C-x a 表示先同时按住 Ctrl 和 x 键,然后松开,再按 a 键。
C-x C-a 表示先同时按住 Ctrl 和 x 键,然后松开,再同时按住 Ctrl 和 a 键。
所有以 C-x 开始的快捷键(相当于一个转义前缀),在 GDB 标准模式和 TUI 模式下均可使用,为高效调试提供了统一的操作入口。
以下是支持的按键操作:


2.3 TUI Single Key Mode
TUI Single Key 模式旨在提升常见调试命令的操作效率。在该模式下,许多常用命令只需按一个单键即可执行,无需按回车键确认。使用快捷键 C-x s 可以进入或退出该模式(在该模式下按 q 键也可以退出)。
在该模式下,不是下表中列出的按键输入将默认进入 GDB 标准命令提示符。

2.4 鼠标操作
鼠标操作需要 curses 库的支持。
- 滚动: 可以滚动活动窗口。
- 复制: 选中文本后,右键点击,再左键点击即可粘贴。
2.5 TUI命令
2.5.1 进入/退出TUI模式
启动 GDB 时带上 -tui 参数可以直接进入 TUI 模式。
riscv64-unknown-elf-gdb -f xxx.elf -tui
也可以在进入 GDB 后,输入 tui enable 命令进入 TUI 模式,使用 tui disable 命令退出。当然,也可以使用 2.2 节介绍的快捷键。
2.5.2 查看当前显示窗口的信息
使用 info win 命令。后面显示的数字表示该窗口的高度或宽度权重。
(gdb) info win
Name Lines Focus
regs 7 (has focus)
src 9
status 1
cmd 15
(gdb)
2.5.3 显示TUI布局
使用 tui layout name 或 layout name 命令。其中 name 可以是:
asm: 汇编布局。
src: 源码布局。
split: 源码和汇编分割布局。
regs: 寄存器布局。
next: 切换到下一个布局。
prev: 切换到上一个布局。
也可以使用 tui new-layout 创建的自定义布局的名字。
2.5.4 切换活动窗口
使用 tui focus name 或 focus name 命令。name 可以是 next, prev, src, asm, regs, cmd。
2.5.5 刷新窗口
使用 tui refresh 或 refresh 命令,效果与快捷键 C-L 相同。
2.5.6 显示寄存器组
使用 tui reg group 命令。group 可以是 next, prev, general, float, system, vector, all。
2.5.7 刷新源码和程序指针
使用 update 命令。
2.5.8 调整窗口大小
使用以下命令调整窗口高度或宽度,+count 为增加,-count 为减少。可以使用 info win 查看当前窗口设置。
tui window height name +count
tui window height name -count
winheight name +count
winheight name -count
tui window width name +count
tui window width name -count
winwidth name +count
winwidth name -count
2.5.9 创建TUI布局
默认支持的布局有以下几种:
layout asm -- Apply the "asm" layout.
layout next -- Apply the next TUI layout.
layout prev -- Apply the previous TUI layout.
layout regs -- Apply the TUI register layout.
layout split -- Apply the "split" layout.
layout src -- Apply the "src" layout.
使用 tui new-layout 命令可以创建新的自定义布局,创建后即可通过 layout name 切换到该布局。
命令格式:tui new-layout name window weight [window weight…]
name: 新建布局的名称。
window: 窗口类型,如 src, asm, status, cmd, regs。
weight: 代表该窗口比例权重的整数数组。默认是垂直布局。
- 使用
{-horizontal window weight [window weight…]} weight 可以创建水平布局。
实例:
tui new-layout mylayout {-horizontal src 1 asm 1} 2 regs 1 status 0 cmd 1
layout mylayout
这个布局定义了5个窗口:
- 源码窗口 (src)
- 汇编窗口 (asm),1和2为水平布局,宽度比为1:1,两者作为一个整体占用2份高度。
- 寄存器窗口 (regs),占用1份高度。
- 状态窗口 (status),始终为0,表示只有一行。
- 命令窗口 (cmd),占用1份高度。
因此,整体为垂直布局,高度比例为 2:1:0:1。0 表示仅占一行。

2.6 TUI配置变量
TUI 配置变量用于控制 TUI 窗口的外观。
2.6.1 配置边框外观
此配置设置源码、汇编和寄存器窗口的边框样式。
set tui border-kind kind
kind 值可为:
space: 用空格字符画边框。
ascii: 使用 +、-、| 等 ASCII 字符绘制边框。
acs: 使用备用字符集绘制边框,如果终端支持,则使用字符线条图形。
2.6.2 设置边框属性
此配置选择非活动和活动窗口的边框显示属性。
set tui border-mode mode
set tui active-border-mode mode
mode 可以为:
normal: 普通属性。
standout: 突出模式。
reverse: 反向视频模式。
half: 半亮模式。
half-standout: 半亮和突出模式。
bold: 超亮或加粗模式。
bold-standout: 超亮加粗且突出模式。
2.6.3 设置边框颜色
使用 show style 查看当前样式。
set style tui-border background color
set style tui-active-border background color
set style active-border foreground color
set style tui-active-border foreground color
color 可以为:none、#RRGGBB、颜色名(如 ‘black’, ‘red’)或 0~255 的数字。
set style active-border intensity value
set style tui-active-border intensity value
value 可以为 normal(默认), bold, dim。
2.6.4 设置TAB的显示宽度
此配置设置源码和汇编窗口中 TAB 字符占用的显示宽度(字符数)。
set tui tab-width nchars
2.6.5 设置行号是否紧凑显示
默认显示会占用较多行号空间。此配置可设置为紧凑显示,仅占用最小必要空间。
set tui compact-source [on|off]
2.6.6 设置是否使能鼠标事件
此配置控制是否启用 TUI 的鼠标事件处理,默认为 on。
set tui mouse-events [on|off]
如果设置为 off,鼠标点击由终端原生处理,通常用于文本选择。
2.6.7 配置是否显示GDB调试信息到TUI
此配置控制 GDB 自身的 DEBUG 信息是否在 TUI 中显示。
set debug tui [on|off]
使用 show debug tui 查看当前设置。
三. 样例
这里分享一个 GDB 脚本示例,它定义了一个自定义 TUI 配置函数。新建一个名为 tui.gdb 的文件,输入以下内容:
set confirm off
define my_tui
set tui border-kind acs
set tui border-mode bold-standout
set tui tab-width 2
set style tui-active-border foreground red
set tui compact-source on
tui new-layout mylayout {-horizontal src 1 asm 1} 2 regs 1 status 0 cmd 1
layout mylayout
update
refresh
end
在 GDB 中导入此脚本:source tui.gdb,然后执行自定义命令:my_tui。应用此脚本后的 TUI 界面显示效果如下:

四. 总结
本文详细介绍了 GDB TUI 的各类窗口、基本操作、快捷键以及丰富的配置选项。通过学习如何自定义窗口布局和外观,你可以打造出完全符合个人习惯和工作流的高效C语言调试环境。文中提供的示例脚本可以直接使用或作为模板进行修改,帮助你快速上手。希望这些技巧能让你在终端环境下的调试工作更加得心应手。
如果你有更酷的 GDB 配置或调试技巧,欢迎在云栈社区分享交流。