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

时间:2010-08-21 06:23:49

标签: c++ debugging vim gdb

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

我生命中有一段时期,可以说是 “我讨厌Vim !!!'..'Vim很好!'

然而,在大多数使用Microsoft开发IDE的时候,我已经习惯了调试代码,监视窗口,调用堆栈和调试代码时的那些 F5 - F11 快捷方式主要代码 - 所有可见,无需键入任何GDB命令。

所以,问题是:

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

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

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

9 个答案:

答案 0 :(得分:69)

与其他答案相比,至少有三个选项可以满足您的需求:clewnpyclewnvimgdb

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

引用clewn的网站:

  

Clewn在vim编辑器中实现了完整的gdb支持:断点,监视变量,gdb命令完成,程序集窗口等。

我认为你一定要试一试。

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

几个月前我试过pyclewn。设置起来有点困难,但看起来很好但很有希望。我刚做了一些测试,你可以设置书签等,这是你期望从图形调试器中获得的常用内容。我最终没有出于偶然原因使用它,但我很想再试一次。

答案 1 :(得分:14)

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

但您不必在文本模式下使用GDB;您可以使用KDbgDDDInsight等图形前端。

有很多方法可以让GDB进入Vim(但是你会得到基于文本的调试)。

答案 2 :(得分:9)

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

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

  2. 配置(写.vimspector.json

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

  4. 进行编译
  5. 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"
    }
  }
} }

答案 3 :(得分:8)

GDB edit命令

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

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

默认editorex,但vim也了解+<current-line>格式。

当您退出编辑器时,您将返回gdb

这允许您自由浏览源代码,如果您进行ctags集成,则特别强大。

这是一个穷人内置的单向gdb进行vim集成:主要缺少的是从Vim设置断点。

edit和中心

默认情况下,

edit并未将Vim置于源代码中心,因此我创建了一个Python脚本来执行此操作:How to open the current file at the current line in a text editor from GDB?

对剪贴板助手的断点命令

此vim命令复制类型为

的断点说明符
b <file-path>:<line-number>

到剪贴板:

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

然后您可以将其粘贴到gdb

这是一个穷人的vdb集成,可以轻松设置断点。

GDB信息中心

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

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

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

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

我在gdb split view with code

中更详细地描述了使用和理由

以下是它为您提供的屏幕截图:

enter image description here

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

答案 4 :(得分:4)

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

所以对我来说,使用恰好也是调试器的文本编辑器根本没有任何固有的优势。相反,我使用我喜欢的文本编辑器 - 独立于我选择使用的调试器。目前,我主要使用 gedit kdbg 来实现这些目的,但这些选择会随着时间的推移而独立发展。

答案 5 :(得分:2)

Vim于2018年5月发布的8.1版中正式添加了一个内置调试器。该功能早在2017年8月也已在某些8.0版中提供。

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

:packadd termdebug
:Termdebug

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

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

可以发出Vim命令来与gdb进行交互。一些相关的命令包括:Step:Over:Finish:Continue:Stop:Break:Clear和{{1 }}。

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

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

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

>>

我最近写了一篇博文,介绍了一个示例会话。

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

答案 6 :(得分:1)

刚刚在应用程序上工作了很长时间,需要在它运行的盒子上放置一些东西(设备设置),我在vim中编写代码,有自动构建的脚本,推动它到服务器,在那里有一个脚本,注意与二进制文件一起推送的sentinel文件。然后,这将重新启动该框上的相应服务,并在另一个ssh窗口中,我的日志文件上运行了tail -f

长话短说,我根本没有使用调试器。如果我意外地死了一些东西,我只是提高记录级别,重做它,看看在它死之前记录的最后一件事,然后分析并解决问题。

好消息是,当客户环境中存在问题时,我只需要一个调试级别的日志,并且可以在不需要访问其服务器的情况下识别问题。

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

答案 7 :(得分:0)

只需添加到上面:

IMO vim往往是一个轻量级的编辑器,调试往往会增加负担。有很多方法可以做到,即在

上使用vim7.4 +
:terminal

并运行以下命令行(curses)调试器之一。缺省情况下,有一些不知道的IDE使用。即lldb = xcode。

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

答案 8 :(得分:0)

vim编辑器的答案都很出色。 vim的普及使它成为学习的好选择。 如果您打算靠近VS,请尝试geany。它将提供类似的F5-F11编码。您可以对其进行微调,使其与您希望的接近。它还具有可配置的监视窗口和终端输出。 与所有编辑一样,这是一个学习曲线。特别是在处理插件/附加组件时。另外,可以将所需的功能分配给在vim / gvim,emacs,geany中选择的键。