你在 Vim 中调试 C + + 代码吗? 怎么调试?

问题在于所有使用 Vim 开发 C + + 应用程序的人。

在我的一生中,有一段时间 'I hate Vim!!!'..'Vim is nice!'

然而,我是在微软的开发 IDE 中成长起来的,我已经习惯了在调试代码、监视窗口、调用堆栈和主代码时使用那些 F5-F11快捷方式——所有这些都是可见的,不需要输入任何 GDB 命令。

所以,问题来了:

你是否也使用 Vim 进行调试? 或者为此切换到某个 IDE? 哪一个?

对于那些使用 Vim 来调试代码的人: 是否有插件在编辑器中设置断点,突出显示我们当前正在调试的行,在单步执行期间自动导航,单步执行,单步执行?

请不要告诉我你使用 GDB 作为命令行,只看到一行被调试,等等。

102790 次浏览

我最近在一个应用程序上工作了很长一段时间,这个应用程序需要在它运行的机器上放置很多东西(设备设置) ,我用 vim 编写代码,有自动构建的脚本,把它推送到服务器上,服务器上有一个脚本,可以注意到哨兵文件和二进制文件一起被推送。然后,这将在该机器上重新启动适当的服务,在另一个 ssh 窗口中,我的日志文件上运行了 tail -f

长话短说,我根本没有使用调试器。如果有东西意外死亡,我只需要提升日志记录级别,重做它,看看它死亡前最后记录的是什么,然后分析它并修复问题。

好处是,当客户环境中出现问题时,我只需要一个 Debug 级别的日志,就可以识别问题,甚至不需要访问他们的服务器。

但是,是的,有时候有一个调试器是很好的。

Vim 是一个很好的编辑器,但是为了进行调试,我使用了一个调试器(如 GDB)。

但是您不必在文本模式中使用 GDB; 您可以使用图形前端,如 KDbgDDD洞察力

有一些方法可以将 GDB 导入 Vim (但是之后您可以进行基于文本的调试)。

与其他答案相比,至少有三个选项可以满足您的要求: 小丑派克伦Vimgdb

这三个项目都是相关的。Vimgdb是针对 Vim 的补丁,需要重新编译 Vim。小丑是一个通过 Netbeans 套接字接口与 Vim 通信的独立程序。这要求使用 +netbeans选项构建 Vim (在最近的 Linux 发行版中就是这种情况,所以应该不会有问题)。

引用小丑网站上的话:

Clewn 在 vim 编辑器中实现了对 gdb 的完全支持: 断点、监视变量、 gdb 命令完成、汇编窗口等。

我觉得你绝对应该试试。

Pyclewn 网站的主页显示了三个项目之间的比较。

几个月前我尝试了 Pyclewn。这是一个有点困难的设置,但它看起来很好,虽然出来和希望。我只是做了一些测试,你可以设置书签,等通常的东西,你会期望从一个图形调试器。我最终没有使用它的偶然原因,但我热衷于给它一个尝试。

使用源代码级别的调试器只是诊断错误程序行为的许多方法之一,而且我很少发现自己启动了一种方法——尽管这很容易做到。

所以对我来说,使用碰巧也是调试器的文本编辑器没有什么固有的优势。相反,我使用我喜欢的文本编辑器——独立于我选择使用的调试器。目前,我主要为这些目的使用 GeditKDBG,但是这些选择随着时间的推移而独立发展。

GDB edit命令

使用以下命令在当前行上打开编辑器:

$EDITOR +<current-line> <current-file>

默认的 editorex,但是 vim也能理解 +<current-line>格式。

当你退出编辑器,你回到 gdb

这使您可以自由地浏览源代码,如果您集成了 ctags,那么它的功能特别强大。

这是穷人内置的 gdb 到 Vim 集成的一种方式: 主要缺少的是从 Vim 设置断点。

edit和中心

缺省情况下,edit不会将 Vim 放在源代码的中心位置,所以我创建了一个 Python 脚本来实现这一点: 如何在 GDB 的文本编辑器中在当前行打开当前文件?

剪贴板帮助程序的断点命令

这个 vim 命令复制一个断点说明符,类型为:

b <file-path>:<line-number>

在剪贴板上:

command! Xg :let @+ = 'b ' . expand('%:p') . ':' . line('.')

然后你可以把它粘贴到 gdb

这是一个穷人为了缓解设置断点而进行的广东发展银行整合。

GDB 仪表盘

Https://github.com/cyrus-and/gdb-dashboard

这与 Vim 无关,但它是一个轻量级解决方案,可以实现很多功能,可能适合其他 Vimmers。

其他人提到了 GDB TUI,但是我发现它太破碎了,而且不够强大,不能忍受。

所以我转而使用基于 Python API 的解决方案,比如 GDB Dashboard。

我已经在 带代码的 gdb 拆分视图上更详细地描述了使用和基本原理

下面是它提供给你的截图:

enter image description here

参见: https://vi.stackexchange.com/questions/2046/how-can-i-integrate-gdb-with-vim

放弃使用真正的 IDE

尽管如此,对大多数人来说,这是最好的解决方案,包括我自己。如果大多数人能够以 C + + 类感知的方式跳转定义,而不需要自己选择和安装几个不同的插件,包括步骤调试工作,那么他们将获得大量的时间。截至2020年,对我来说最不糟糕的是 Eclipse: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux

再补充一点:

IMO vim 往往是一个相当轻的编辑器和调试往往增加了重量。有一些方法可以做到这一点,例如使用 vim7.4 +

:terminal

并运行下列命令行(诅咒)调试器之一。一些默认情况下用于您从不知道的 IDE。即 lldb = xcode。

显然还有更多的基于 cli 的;@all 随时建议并添加到列表中。谢谢!

Vim 在2018年5月发布的8.1版本中正式添加了一个内置调试器。该特性早在2017年8月就已经出现在某些8.0版本中。

以下 vim 命令加载插件并启动调试器。

:packadd termdebug
:Termdebug

后一个命令将程序作为可选参数,或者可以使用 file命令从 gdb窗口加载程序。

在加载了插件之后,gdb可以在相应的窗口中交互式地使用。例如,可以设置断点、逐步执行代码和检查变量。

可以发出与 gdb交互的 Vim 命令。一些相关的命令包括 :Step:Over:Finish:Continue:Stop:Break:Clear:Evaluate

此外,在编辑器窗口的顶部还有用于与 gdb交互的可单击按钮。

更新编辑器窗口以反映调试状态。断点用 >>表示,当前行突出显示。

内置的帮助页面包括详细的文档。

:help terminal-debug

我最近写了一篇博客文章,讲述了一个示例会话。

Https://www.dannyadam.com/blog/2019/05/debugging-in-vim/

更新2020: 有一个使用调试适配器协议的新插件 Vimspector

  1. 安装插件 https://github.com/puremourning/vimspector#installation

  2. 配置(写入 .vimspector.json)

  3. 使用调试符号 g++ cpp.cpp -ggdb -o cpp编译

  4. F4开始调试

enter image description here

  • 请注意我的主目录中的 .vimspector.json(因此可以在任何子目录中工作)
{
"configurations": {
"Python - Launch": {
"adapter": "vscode-python",
"configuration": {
"name": "Python: Launch current file",
"type": "python",
"request": "launch",
"stopOnEntry": true,
"stopAtEntry": true,
"console": "externalTerminal",
"debugOptions": [],
"cwd": "${cwd}",
"program": "${file}"
}
},
"Perl - Launch": {
"adapter": "vscode-perl-debug",
"configuration": {
"name": "Perl: Launch current file",
"type": "perl",
"request": "launch",
"exec": "/usr/bin/env perl",
"execArgs": [],
"stopOnEntry": true,
"stopAtEntry": true,
"console": "externalTerminal",
"sessions": "single",
"debugOptions": [],
"cwd": "${cwd}",
"program": "${file}"
}
},
"C - Launch": {
"adapter": "vscode-cpptools",
"configuration": {
"name": "Cpp: Launch current file",
"type": "cppdbg",
"request": "launch",
"externalConsole": true,
"logging": {
"engineLogging": true
},
"stopOnEntry": true,
"stopAtEntry": true,
"debugOptions": [],
"MIMode": "gdb",
"cwd": "${cwd}",
"program": "${fileDirname}/${fileBasenameNoExtension}"
}
},
"Java - Launch": {
"adapter": "vscode-java",
"configuration": {
"name": "Java: Launch current file",
"request": "launch",
"mainClass": "com.vimspector.test.TestApplication",
"sourcePaths": [ "${workspaceRoot}/src/main/java" ],
"classPaths": [ "${workspaceRoot}/target/classes" ],
"args": "hello world!",
"stopOnEntry": true,
"console": "integratedTerminal"
}
}
} }

Vim 编辑器的答案都非常棒。 Vim 的普遍性使它成为一个很好的学习选择。 如果你决定和 VS 保持亲密关系,试试 Geany。它将提供类似的 F5-F11编码。你可以随心所欲地调整它。它还具有可配置的观察窗口和终端输出。 和所有的编辑一样,有一个学习曲线。特别是在处理插件/附加组件时。此外,还可以将所需的函数分配给在 vim/gvim、 emacs 和 geany 中选择的键。