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。