在使用GDB命令行调试程序时,命令输入、命令输出以及源码显示通常会混杂在同一个终端窗口中。尤其是使用list查看源码时,源码内容会和调试命令、打印结果交织在一起,阅读起来不够直观。
为了解决这个问题,GDB提供了TUI 功能。TUI全称为Text User Interface,即文本用户界面。它可以在终端中将界面划分为多个窗口,例如源码窗口、汇编窗口、寄存器窗口和命令窗口,从而让调试过程更加清晰。
TUI是GDB原生支持的功能,通常只要安装的是完整版本的GDB,就可以直接使用。
一、常用窗口布局命令
GDB TUI中可以使用layout命令切换不同的窗口布局。
| 命令 | 作用 |
|---|---|
layout src |
显示源码窗口 |
layout asm |
显示汇编窗口 |
layout regs |
显示寄存器窗口 |
layout split |
同时显示源码窗口和汇编窗口 |
fs src/asm/reg |
切换窗口焦点 |
i win |
查看当前拥有焦点的窗口 |
layout next |
切换到下一个布局 |
layout prev |
切换到上一个布局 |
ctrl+x+a |
退出窗口模式 |
| 接下来以一个实际的例子来演示这些命令的作用 |
c
#include <stdio.h>
int add(int a, int b)
{
int sum = a + b;
return sum;
}
int main()
{
int x = 10;
int y = 20;
int result = add(x, y);
printf("result = %d\n", result);
return 0;
}
对源代码进行编译以及启动GDB调试后,进入调试界面,输入layout src打开TUI界面

可以看见上方为源码显示区域,下方为GDB的命令输入区域,上方被绿色的边框选中,说明当前的窗口焦点在上方,在这种状态下,使用方向键是调整的源码区域的内容。也可以使用i win查看当前的窗口焦点信息。如果想要使用方向键快捷使用gdb历史命令,需要先将窗口焦点切换到命令行窗口上fs cmd

使用b main命令在main函数处添加断点,执行r命令之后,可以看见程序在第11行处中断下来,前面的断点标识变为大写的B,说明该断点至少命中过了一次,对于在第14行添加的断点,可以看见程序还未运行到此处,所以目前断点标识为小写的b,断点标识后的+号标识当前断点为使能状态。

同时在源码窗口的下方,还会显示当前对应的程序状态。显示信息包括PC指针,当前运行线程,当前所在函数等信息。

使用layout split可以将当前的源码窗口分隔成两块部分

可以看见,中间部分出现了汇编代码的内容,使用layout asm可以将可视化窗口部分切换为汇编代码。

GDB的TUI模式可以把普通命令行调试变成多窗口调试界面,使源码、汇编、寄存器和命令输入区域分开显示,避免信息混杂在一起。常用的命令包括layout src、layout asm、layout regs、layout split 等;如果需要在不同窗口之间切换操作焦点,可以使用focus或其简写fs;如果想退出TUI模式,可以使用Ctrl+x+a。对于需要频繁查看源码、寄存器和汇编的调试场景,TUI会比普通命令行模式更加直观。