Clewn 是什么?在 Vim 中集成 GDB 调试的方式与限制

Clewn 是一个让 Vim 编辑器获得完整 GDB 调试能力的程序:断点、变量监视、GDB 命令补全、汇编窗口等功能都可以在 Vim 里完成。它的适用条件很明确——只能配合 gvim(Vim 的图形版本)使用,因为 Clewn 通过 netBeans socket 接口控制 Vim,而终端里的 vim 不支持 netBeans。如果你在纯终端环境工作,或者不想额外开一个终端窗口,需要看下面的 vimGdb 或 pyclewn。

Clewn 的工作方式

Clewn 是一个独立进程,与 Vim 并发运行并通过 netBeans socket 接口与 Vim 通信。它负责和 GDB 交互,把调试信息呈现到 Vim 界面中。

这个架构带来两个直接后果:

  • 必须有图形界面:netBeans 接口只在 gvim 中可用,终端 vim 无法作为被控端。
  • 需要自己的终端:Clewn 作为独立进程运行,占用一个单独的终端窗口。GDB run 命令的输入输出也发生在这个 Clewn 终端里。

Clewn 与 vimGdb 的关系

两者共享同一套与 GDB 对接的基础源代码,功能集也基本相同,区别在实现方式:

维度 Clewn vimGdb
实现形式 独立进程,通过 netBeans socket 控制 Vim Vim 的可选特性补丁
运行环境 只能配合 gvim 不依赖 netBeans
是否需要独立终端 需要 不需要
版本升级成本 不涉及 Vim 补丁 每个新 Vim 版本都要重新打补丁
被调试程序的输入输出 run 命令直接在 Clewn 终端进行 需用 GDB 的 tty 或 attach 命令控制

Clewn 相比 vimGdb 多出的能力主要有两项:

  • 用气球提示(balloon)显示 GDB 表达式的值。
  • GDB run 命令的输入输出直接在 Clewn 终端完成,不需要额外配置 tty 或 attach。

反过来,vimGdb 的优势是不需要独立终端,代价是每次升级 Vim 都要重新应用补丁。

第三种选择:pyclewn

除了 Clewn 和 vimGdb,还有 pyclewn——一个 Python 程序,功能比前两者更多,并且与 Vim 的集成更紧密。项目页面建议直接参考 pyclewn 网站上列出三者差异的对照表来做选择。

如果你的关注点是功能完整度和集成深度,pyclewn 值得优先评估;如果只需要一个不依赖 Vim 补丁的独立调试进程,Clewn 是合适的选择;如果不想多开终端且能接受维护补丁,则考虑 vimGdb。

版本与已知问题

从发布记录可以看到几个实际使用中容易遇到的点:

  • 1.15(2009-11-28):修复了在 Ubuntu 9.10 上启动时挂起的问题。
  • 1.14(2008-10-19):vimGdb 移植到 Vim 7.2;当 netBeans socket 连接未建立而打印“not connected yet”提示时,Clewn 会提示 Vim 可能没有以 netbeans_intg 编译——这是排查连接失败的第一个检查点;同时修复了 Mac OS X 上 vimgdb 控制台的 ^M 字符问题。
  • 1.13(2007-12-28):restart 命令改名为 cl_restart;修复了源码以绝对路径编译后移动导致找不到源文件的问题,以及 Clewn 干扰 GDB pretty printing 的问题。

如果你在使用中遇到 Clewn 连不上 Vim,先确认 Vim 是否编译了 netbeans_intg 支持,再确认用的是 gvim 而非终端 vim。

clewn.sourceforge.net