您是否在Vim中调试C ++代码?怎么样?


152

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

我生命中有一段时期,可以描述为“我讨厌Vim !!!”。

但是,在Microsoft开发IDE上长大后,我已经习惯了这些F5- F11调试代码,监视窗口,调用堆栈和主代码时的快捷方式-无需键入任何GDB命令即可看到所有这些内容。

因此,这是一个问题:

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

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

请不要告诉我您将GDB用作命令行,仅看到已调试的一行,等等。


1
我相信您仍然可以找到使用“ ed”进行开发和调试的人员。
e2-e4

55
噢,我的上帝,他们回答问题“调试我的C ++代码PLZ”,但接近太局部...可笑!
P

17
尝试gdb -tui
Jayesh

1
您是坚持使用Vim还是愿意看看其他具有内置gdb集成功能的Emacs等编辑器?默认情况下,gdb的主要问题是单行输出还是避免不断键入gdb -tui帮助的l(ist)?
jla

1
超级集:stackoverflow.com/questions/4237817/configuring-vim-for-c但是我强烈建议您使用带有Vim keybindinds的Eclipse来提高类意识。
西罗Santilli郝海东冠状病六四事件法轮功

Answers:


76

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

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

引用店员的网站:

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

我认为您绝对应该放手一搏。

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

几个月前,我尝试了pyclewn。设置起来有点困难,但是看起来不错,但很有希望。我只是做了一些测试,您可以设置书签等,这是图形调试器所期望的。由于偶然的原因,我最终没有使用它,但我很想再尝试一次。


6
Conque GDB是一个不错的选择。易于安装,简单且功能强大。
德鲁苏克(Druesukker),

@UncleZeiv vimgdb已过时。我在这里表示需要更新:github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117

@Druesukker,您的回复值得正式答复!
solotim '17

@UncleZeiv您到vimgdb的链接没有。它应该去github.com/larrupingpig/vimgdb-for-vim7.4,我猜
mcepl

2
只是添加基于GDB的vim“喜欢”调试器-cgdb.github.io
Jimmy MG Lim,

24

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,和:Evaluate

此外,编辑器窗口顶部还有可点击的按钮,可与进行交互gdb

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

内置的帮助页面包含完整的文档。

:help terminal-debug

我最近写了一篇博客文章,其中包括一个示例会话。

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


14

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

但是您不必在文本模式下使用GDB。您可以使用图形前端,例如KDbgDDDInsight

有几种方法可以使GDB进入Vim(但随后您会获得基于文本的调试)。


10

GDB edit命令

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

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

默认editor值为ex,但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集成以简化设置断点的方法。

GDB资讯主页

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

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

其他人提到了GDB TUI,但我发现它太残破且功能不足以承受。

因此,我改为使用基于Python API的解决方案,例如GDB Dashboard。

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

这是它为您提供的截图:

在此处输入图片说明

另请参阅: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


4

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

因此,对我来说,使用恰好也是调试器的文本编辑器根本没有固有的优势。取而代之的是,我使用我喜欢的文本编辑器-与选择使用的调试器无关。目前,我主要将geditkdbg用于这些目的,但是随着时间的推移,这些选择会独立发展。


1
除非您在无kde / gnome的开发主机上进行远程开发。
user826955

3

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

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

  2. 配置(写.vimspector.json

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

  4. F4开始调试

在此处输入图片说明

  • 注意我.vimspector.json的主目录中的my(因此可以在任何子目录中工作)
{
"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"
    }
  }
} }

1

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

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

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

...但是,是的,有时候会有调试器会很不错。


0

只是添加到上面:

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

:terminal

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.