找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4668

积分

0

好友

641

主题
发表于 5 天前 | 查看: 19| 回复: 0

前言

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+ 表示这是一个使能且已至少触发过一次的硬件断点。
代码中断点标记 H+

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

2.2 按键操作

TUI 的快捷键设计类似于 Emacs。下文中,C 表示 Ctrl 键,- 表示同时按下,空格表示先后按键。

例如:

  • C-x a 表示先同时按住 Ctrlx 键,然后松开,再按 a 键。
  • C-x C-a 表示先同时按住 Ctrlx 键,然后松开,再同时按住 Ctrla 键。

所有以 C-x 开始的快捷键(相当于一个转义前缀),在 GDB 标准模式和 TUI 模式下均可使用,为高效调试提供了统一的操作入口。

以下是支持的按键操作:
TUI基本模式切换快捷键
TUI窗口操作与导航快捷键

2.3 TUI Single Key Mode

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

在该模式下,不是下表中列出的按键输入将默认进入 GDB 标准命令提示符。
TUI Single Key Mode 快捷键对照表

2.4 鼠标操作

鼠标操作需要 curses 库的支持。

  1. 滚动: 可以滚动活动窗口。
  2. 复制: 选中文本后,右键点击,再左键点击即可粘贴。

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 namelayout name 命令。其中 name 可以是:

  • asm: 汇编布局。
  • src: 源码布局。
  • split: 源码和汇编分割布局。
  • regs: 寄存器布局。
  • next: 切换到下一个布局。
  • prev: 切换到上一个布局。
    也可以使用 tui new-layout 创建的自定义布局的名字。

2.5.4 切换活动窗口

使用 tui focus namefocus name 命令。name 可以是 next, prev, src, asm, regs, cmd

2.5.5 刷新窗口

使用 tui refreshrefresh 命令,效果与快捷键 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个窗口:

  1. 源码窗口 (src)
  2. 汇编窗口 (asm),1和2为水平布局,宽度比为1:1,两者作为一个整体占用2份高度。
  3. 寄存器窗口 (regs),占用1份高度。
  4. 状态窗口 (status),始终为0,表示只有一行。
  5. 命令窗口 (cmd),占用1份高度。

因此,整体为垂直布局,高度比例为 2:1:0:10 表示仅占一行。
TUI自定义布局效果图

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 界面显示效果如下:
应用自定义脚本后的TUI效果

四. 总结

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

如果你有更酷的 GDB 配置或调试技巧,欢迎在云栈社区分享交流。




上一篇:Claude Code高效编程:精选10个核心Skill助力开发者提效
下一篇:Claude Code 完全指南:面向工程师与产品经理的75页对话式AI编程橙皮书
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 20:20 , Processed in 0.885950 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表