gdb是linux下很强大的调试工具,它使用命令行进行交互。相比于windows下visual studio的图形化调试界面,gdb的命令行方式操作起来不是很方便,从用户友好度上二者难以相提并论。不过gdb也有许多配套的前端组件,提供了图形化界面展示调试过程中的信息,这样就比传统命令行方式要方便很多。本文介绍了使用图形化的gdb前端让调试变得便捷高效,建议再阅读本文之前先掌握一些gdb的基础知识。

TUI

gdb内置了TUI作为图形化的调试界面。TUI的全称是Text User Interface,TUI基于 curses 库,这使它能够在命令行中有更生动的展示效果。
TUI有两个显示区,一个是拥有更直观显示效果的TUI模式,另一个是标准的gdb命令行模式。TUI模式显示区用于展现源码信息,汇编信息,寄存器信息。

在gdb模式下,可以使用 C-x C-a 进入TUI模式,这个快捷接也可以用来退出TUI模式。我认为TUI模式提供了额外的窗口用于展示源代码,并且在源代码界面提示当前运行的代码位置,这样就不用频繁的使用 list 命令看源代码了。

在TUI下常用的命令如下

layout src    # 显示源代码窗口
layout asm    # 显示反汇编窗口
layout regs   # 增加寄存器窗口
layout split  # 显示源代码和反汇编窗口
ctrl + l      # 刷新窗口
refresh       # 刷新窗口
update        # 更新源码窗口和当前的执行点
focus cmd     # 聚焦到 cmd 窗口
focus asm     # 聚焦到 asm 窗口
focus src     # 聚焦到 src 窗口
focus regs    # 聚焦到 regs 窗口
tui reg next  # 显示下一组寄存器
tui reg prev  # 显示上一组寄存器

更详细的使用方法可以阅读 TUI官方操作手册

cgdb

cgdb是第三方开发的基于 curses 的轻量级gdb前端。与TUI相似,cgdb的展示窗口也有两种模式。cgdb还提供一些额外的特性:源码高亮显示,模仿vi的按键方式。

cgdb的官方介绍 https://cgdb.github.io/

下图展示的是cgdb的用户界面 (摘自cgdb官方主页)

nil

EMACS gud mode

作为同样属于GNU的emacs,它提供了 gud mode 作为gdb的前端。这也是我目前在使用的工具链。借助emacs的强大可定制性, gud mode 支持对图形化界面进行深度定制。对于一般用户,推荐通过设置 gdb-many-windowst 得到一份默认的多窗口调试界面。

nil

上图展示的是默认的多窗口调试界面,从图中可以看到, gud-mode 提供了6个窗口,他们分别展示的是gdb交互界面、本地变量查看、源代码展示、输入输出界面、调用堆栈信息、断点和线程信息。

与前两种方案相比,emacs gud mode 提供了更好的可定制性,允许用户通过编写elisp代码对调试界面进行修改、对调试过程进行拓展。这也对用户提出了更高的要求,使用这种方案需要学习emacs和elisp的相关知识。

对于已经在使用emacs的用户,我强烈推荐尝试使用gud mode进行gdb调试,图形界面下emacs的gud mode调试体验格外地好。

更详细的使用方法可以参考 官方帮助手册