简介
termdebug
是从 Vim 8.1 开始内置的调试插件,仅支持 GDB。
安装
- 将 Vim 升级至 8.1 或以上版本。
- GDB 需升级至 7.12 或以上版本。
启动
默认情况下需手动加载 termdebug 插件:
:packadd termdebug
假设我们有一个简单的 helloworld.cpp 文件:
#include <iostream>
using namespace std;
int main() {
cout << "hello world" << endl;
int in;
cin >> in;
cout << "you input " << in << endl;
return 0;
我们将其编译为二进制文件 helloworld
:
g++ -g helloworld.cpp -o helloworld # 必须有 -g,这样才能将调试的相关信息添加到.o文件中
现在,我们在 Vim 中启动 termdebug 来调试这个程序:
:Termdebug helloworld
这时 termdebug
会为我们开三个窗口。 其中, GDB 窗口
提供 GDB 原生操作;程序窗口
供被调试程序使用,提供 IO 功能;源码窗口
提供源码交互。

可以通过<Ctrl-w>
按键切换不同窗口。
调试程序
我们既可以在 GDB 窗口中调试,也可以在源码窗口中调试。 GDB 调试常用指令:
1. file bin 加载名为 bin 的二进制文件
2. CTRL-C 中断程序
3. run/r 运行
4. next/n 执行当前行,停在下一行 (step over)
5. step/s 执行当前行,进入下一层函数 (step in)
6. finish 执行直至离开当前函数
7. where 显示栈
8. continue/c 继续执行
9. break/b N 在第 N 行加断点
10. break/b f 在函数 f 处加断点
11. delete 删除所有断点
在源码窗口中的调试指令:
:Run [args] 运行程序,可带参数 [args],或沿用上一次运行的参数
:Arguments {args} 设置下一次运行所用参数
:Break 在当前行加断点
:Clear 删除当前行的一个断点
:Step = gdb "step"
:Over = gdb "next"
:Finish = gdb "finish"
:Continue = gdb "continue"
:Stop 中断程序
如果觉得手动输入调试指令太麻烦,可以在个人的.vimrc
文件中自定义keymap
来执行这些命令,如用<F9>
来添加断点:
nnoremap <F9> :Break<CR>
现在我们来演示一下调试上面的已经加载好的 helloworld
程序:
- 先移动至 GDB 窗口,输入
b main
以在 main 函数入口处添加断点; - 在 GDB 窗口输入
r
,程序开始运行,并停在 main 函数入口; - 在 GDB 窗口输入
n
,程序停在cout << "hello world" << endl;
这一行; - 移动至源码窗口,输入
:Continue
,程序继续运行,并在cin >> in
处等待用户输入; - 移动至程序窗口(IO窗口),输入数字 3 并回车,可以看到程序输出
you input 3
,并运行直至结束; - 移动至 GDB 窗口,输入
q
,退出调试。
获取帮助文档
在 Vim 窗口中输入:h terminal-debug
阅读详细的帮助文档。