或许是GNU GDB更好的一个调试界面cgdb

  之前说到GDB的tui模式是相较于纯命令行版本来说一个较友好的用户界面,毕竟源代码、当前执行位置瞄一眼就立马可见,而不用麻烦去不断敲命令来显示,说来Linux程序员也真容易满足,一个独立显示代码的子窗口就够用了。但即便是GDB builtin支持的功能,在一些远程终端上界面的显示和刷新总是出现问题,单步一行就要refresh一下着实令人崩溃,导致我宁愿退化使用最原始的纯命令行模式来调试程序。
  在这中间,人家提到另外一个调试工具cgdb,这也是一个机遇curses库的调试前端,试用一下之后发现问题比tui要少的多,至少SecureCRT不再跟我乱闪了,而且显示界面和独特的vi风格交互感也算是加分项了,唯一遗憾的是中文字符没法正常显示,但总体还是比较推荐的。cgdb通过Trivial GDB(libtgdb)的库和后端gdb通信,通过这个库做到前端和后端分离的效果。
cgdb

一、用户界面之窗口(Window)

  默认启动的cgdb由两个子窗口和一个状态栏组成,状态栏将两个子窗口分割成上下两半屏。

1.1 源代码窗口

  源代码窗口每个时刻只能显示一个源代码文件,并且根据用户的操作(next、step等)自动更新源代码窗口的显示。源代码窗口的显示支持C/C++语言的语法高亮特性,当前正在(要)被执行的行会高亮显示出来。
  源代码窗口对断点也有很好的支持,在浏览源代码窗口的时候通过反复使用空格,就可以在当前行设置、删除断点,使能的断点行号使用红色标识,禁用的断点行号使用黄色标识(貌似没有禁用断点的操作键)。
  在源代码窗口搜索也十分方便,通过/ ?可以向上或者向下增量搜索代码,同时还可以使用正则元字符(比如+、*等)。

1.2 GDB窗口

  该窗口的输入是和gdb的输入兼容的,所以之前纯命令行模式调试的操作都可以在这个窗口实现。通常的输入都会转发到后端的gdb,但是某些特殊的按键是会被cgdb截获处理的。
  该输入的命令是缓冲的,即使一次输入多个命令,gdb还是会保证依次执行每个命令。

1.3 文件窗口

  主要是弹出来让用户选择要需要查看的文件,其展出效果是一个和当前调试项目相关的全路径的文件列表。在CGDB模式下通过按键o就可以调出这个窗口,使用vim的方向键可以在文件列表的条目中切换移动,而且使用/可以用正则表达式的方式进行文件的快速搜索和定位,敲击回车即打开该文件,命令q可以退出文件列表窗口。

1.4 TTY窗口

  这个窗口可以让用户的输入直接转发给被调试的程序,对于复杂程序都建议这么做(但作为服务端程序员来说,通常都没有处理终端输入需求的)。
  在参考文献中,其作者建议使用tty代替cgdb所支持的TTY窗口,新连接一个终端然后使用who am i得到终端名字,再回到GDB窗口使用tty /dev/pts/5类似的命令进行设置,那么后面程序的输出就会被定向到你指定的这个终端上面。虽不知这样的用意,但是将输出重定向到一个新终端还是不错的,不用挤在那个原本就拮据的GDB窗口了。

1.5 状态栏和窗口切换

  状态栏横跨在中间主要起到提示作用。默认调试代码的时候显示当前的源代码文件路径,而当使用搜索、设置等命令的时候,命令的输入会展现在状态栏上面,同时一些错误报告也会在上面显示。
  窗口焦点的切换比较简单:ESC会切换到CGDB窗口,i会切换到GDB窗口,o会打开文件窗口,I会进入TTY窗口。

二、用户界面之模式(mode)

  根据哪个窗口成为焦点,那么操作将会被定义为对应的模式,当源代码窗口(source window)处于焦点时候被定义为CGDB mode,当GDB窗口处于焦点的时候被定义为GDB mode,当TTY窗口处于焦点的时候,其被定义为TTY mode

2.1 CGDB模式

  当窗口焦点在源代码窗口时候,就处于CGDB模式。在CGDB模式下大部分的操作都跟vi习惯相似:
  j、k控制控制光标单行移动;Ctrl-u、Ctrl-d上下卷屏;gg、G切换源代码首部和尾部;/、?用于源代码中内容搜索;n、N正向和逆向跳转到下一个搜索结果;
  空格创建、删除断点;t创建临时断点;-、=增加或者减少源代码窗口的面积。

2.2 GDB模式

  在该模式下的几乎所有的输入,都会通过readline处理后,在给gdb后端调试器使用。该模式下除了使用ESC切换到CGDB模式外,还有就是使用PageUP、PageDown滚屏历史输出,而Ctrl-p、Ctrl-n会切换当前行的历史记录,当然这个是readline的支持了。

2.3 文件窗口模式

  这个窗口是全屏的,主要用来帮助用户选择打开调试的源代码文件,通过CGDB模式使用o调出,使用q可以退出,使用回车可以选择打开该文件。该模式下其他的操作和CGDB模式类似(vi的操作风格),这里就不赘述了。

三、cgdb之简要配置

  cgdb的配置可以写在HOME目录的.cgdb/cgdbrc文件,其原理是GDB启动的时候,会读取该文件的内容一行一行执行下去,所以其配置内容在cgdb启动之后也可以再行配置的。
  cgdb默认就工作很好了,下面是一些常用的配置:

1
2
3
4
:set arrowstyle=long #当前执行的显示风格
:set autosourcereload #默认也是打开的,和GDB风格一样,当重启调试程序的时候,会自动检查(基于时间戳)调试程序是否已修改
:set ignorecase #设置搜索的时候大小写不敏感,默认是敏感的
:set tabstop=4 #设置制表符的长度,默认是8

  小结:除了中文不能正常显示,状态栏输入无法回删之外,瑕不掩瑜——其他一切感觉良好!

参考