
2.9 gdb tui——gdb图形化界面
gdb调试令很多开发者头疼的问题之一,是很多Linux用户或者刚从其他图形化IDE转过来的开发者,都习惯了有强大的源码显示窗口的调试器,可能对gdb用list命令显示源码的方式非常不习惯,这主要是因为gdb在调试时不能很好地展示源码。gdb在调试时可以通过list命令显示源码,但是通过list命令显示的代码不会高亮显示当前正在执行的代码行,这时可以使用gdb自带的gdbtui来解决问题。
如下所示为使用 gdbtui调试 redis-server的截图(图中的 Shell工具为 SecureCRT),这样看代码比使用list命令方便了很多。

2.9.1 开启gdb TUI模式
开启gdb TUI模式有以下两种方法。
(1)使用gdbtui或者gdb-tui开启一个调试:

(2)在gdb调试过程中程序被gdb中断时,按键盘上的Ctrl+X+A组合键调出gdbtui。
2.9.2 gdb TUI模式下的4个窗口
在默认情况下,在 gdbtui 模式下会显示 command 窗口和 source 窗口,如上图所示。在TUI模式下还有其他窗口,其中4个常用的窗口如下。
(1)command窗口:命令窗口,可以键入调试命令,窗口类型为cmd。
(2)source窗口:源代码窗口,显示当前行、断点等信息,窗口类型为src。
(3)assembly窗口:汇编代码窗口,窗口类型为asm。
(4)register窗口:寄存器窗口,窗口类型为reg。
可以通过在cmd窗口中输入layout+窗口类型的命令选择自己需要的窗口,例如在cmd窗口中输入layout asm可以切换到assembly窗口。

layout命令还可以用来修改窗口布局,该命令支持的窗口类型参数如下:



另外,可以通过winheight命令修改各个窗口的大小:

2.9.3 解决tui窗口不自动更新内容的问题
在当前 gdb tui窗口扩大或者缩小以后,gdbtui窗口中的内容不会自己刷新以适应新的窗口尺寸,我们可以通过space键强行让gdbtui窗口刷新。
2.9.4 窗口焦点切换
在默认设置下,方向键和 PageUp/PageDown 都是用来控制 gdbtui 的 src 窗口的,所以通过上下键显示前一条命令和后一条命令的功能不存在了,不过可以通过 Ctrl+N或Ctrl+P组合键来获取这个功能。
注意:通过方向键调整gdbtui的src窗口后,可以通过update命令重新把焦点定位到当前执行的代码上。
我们可以通过 focus命令调整焦点位置,默认在 src窗口中通过 focus next命令将焦点移到 cmd 窗口,这时就可以像以前一样,通过方向键来切换到上一条命令和下一条命令。同理,可以使用 focus prev切回到 src窗口。如果焦点不在 src窗口,就不能通过方向键来浏览源码了:


