VimでC ++コードをデバッグしますか?どうやって?


152

問題は、Vimを使用してC ++アプリケーションを開発するすべての人にあります。

私の人生には「Vimが嫌いだ!!!」と表現できる期間がありました。

ただし、主にMicrosoft開発IDEで育ったので、私はそれらに慣れてきましたF5- F11コードのデバッグ時のショートカット、ウィンドウの監視、コールスタック、およびメインコード-GDBコマンドを入力する必要なくすべて表示されます。

だから、ここに質問があります:

デバッグにもVimを使用していますか?または、この目的のためにIDEに切り替えますか?どれ?

Vimを使用してコードをデバッグする場合:エディターにブレークポイントを設定するプラグインはありますか?現在デバッグしている行を強調表示し、ステップ、ステップイン、ステップアウト中に自動ナビゲーションしますか?

コマンドラインとしてGDBを使用していると言わないでください。デバッグされている1行だけが表示されます。


1
「ed」を使って開発やデバッグをしている人を見つけることができると思います。
e2-e4 2010

55
なんてこった、彼らは「私のC ++コードplzをデバッグする」という質問に答えますが、ローカライズされすぎているのでこれを閉じてください...ばかげています!
Pは2010

17
お試しくださいgdb -tui
Jayesh 2013年

1
あなたはVimに行き詰まっていますか、それともGDBの統合が組み込まれているEmacsのような他のエディターを喜んで見ていますか?gdbの主な問題はデフォルトで1行出力ですか、それともg(db)-tuiが役立つl(ist)を常に入力するのを避けるためですか?
jla

1
スーパーセット:stackoverflow.com/questions/4237817/configuring-vim-for-cただし、クラス認識のためにEclipseとVimキーバインドを使用することをお勧めします。
Ciro Santilli郝海东冠状病六四事件法轮功

回答:


76

他の回答とは対照的に、必要なことを実行するオプションは少なくとも3つあります:clewnpyclewn、およびvimgdb

3つのプロジェクトはすべて関連しています。vimgdbはVimに対するパッチであり、Vimを再コンパイルする必要があります。clewnは、Netbeansソケットインターフェースを介してVimと通信するスタンドアロンプ​​ログラムです。これには、Vimを+netbeansオプションでビルドする必要があります(これは最近のLinuxディストリビューションの場合なので、問題にはなりません)。

クルーのウェブサイトから引用するには:

Clewnはvimエディターで完全なgdbサポートを実装しています:ブレークポイント、監視変数、gdbコマンドの完了、アセンブリウィンドウなど。

ぜひやってみてください。

pyclewn Webサイトのホームページは、3つのプロジェクトの比較を示しています。

数か月前に私はpyclewnを試しました。セットアップは少し大変でしたが、見た目はよくて有望です。私はいくつかのテストを行っただけで、ブックマークなどを設定できます。これは、グラフィカルデバッガに期待される通常のものです。私は偶発的な理由でそれを使用しなくなりましたが、もう一度試してみたいと思っています。


6
Conque GDBは素晴らしい代替手段です。インストールが簡単、シンプルで非常に強力。
Druesukker 2013年

@UncleZeiv vimgdbは古くなっています。ここで更新の必要性を表明しました:github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117

@Druesukker、あなたの返信は正式な回答に値します!
solotim 2017年

@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に組み込みデバッガを正式に追加しました。この機能は、バージョン8.0の一部のリリースにも、2017年8月には存在していました。

次のvimコマンドはプラグインをロードし、デバッガーを開始します。

:packadd termdebug
:Termdebug

後者のコマンドは、オプションの引数としてプログラムを受け取ります。またはgdbfileコマンドを使用してウィンドウからプログラムをロードすることもできます。

プラグインをロード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 そしてセンター

editVimはデフォルトでソースの中央に配置されないため、それを実行するPythonスクリプトを作成しました。GDBからテキストエディターで現在の行の現在のファイルを開く方法

クリップボードヘルパーへのブレークポイントコマンド

次のvimコマンドは、次のタイプのブレークポイント指定子をコピーします。

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

クリップボードに:

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

次に、それをに貼り付けるだけgdbです。

これは、ブレークポイントの設定を簡単にするための、gdbとgdbの統合が貧弱な人です。

GDBダッシュボード

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

これはVimとは何の関係もありませんが、多くのことを実現し、他のVimmerに合う軽量ソリューションです。

他の人たちはGDB TUIについて言及しましたが、私はそれがあまりにも壊れていて、耐えられるほど強力ではないことに気付きました。

そこで、代わりにGDBダッシュボードなどのPython APIベースのソリューションに移動しました。

私は使用と理論的根拠をコードで詳しく説明しました:コード付きの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

ソースレベルのデバッガーを使用することは、プログラムの動作不良を診断するための多くの方法の1つにすぎず、非常に簡単に実行できるにもかかわらず、自分でデバッガーを起動することはほとんどありません。

したがって、私にとっては、たまたまデバッガでもあるテキストエディタを使用することに固有の利点はありません。代わりに、使用するデバッガーとは関係なく、好みのテキストエディターを使用します。現時点では、これらの目的で主にgeditkdbgを使用していますが、これらの選択は時間の経過とともに独立して進化します。


1
kde / gnome-free開発ホストでリモートを開発していない限り。
user826955

3

アップデート2020:Debug Adapter Protocolを使用する新しいプラグインvimspectorがあります

  1. プラグインをインストールhttps://github.com/puremourning/vimspector#installation

  2. 構成(書き込み.vimspector.json

  3. デバッグシンボルでコンパイル g++ cpp.cpp -ggdb -o cpp

  4. 押しF4てデバッグを開始します

ここに画像の説明を入力してください

  • .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"
    }
  }
} }

1

つい最近、アプリケーションを実行しているボックス上にたくさんのものを配置する必要のあるアプリケーション(アプライアンスのセットアップ)に取り組み、vimでコードを書き、ビルドを自動化するスクリプトを作成し、サーバーにプッシュしました。そこには、番兵ファイルがバイナリとともにプッシュされたことに気付くスクリプトがありました。これにより、ボックスで適切なサービスが再起動し、別のsshウィンドウでtail -fログファイルを実行していました。

要するに、私はデバッガをまったく使用しませんでした。予期せず何かが死んだ場合は、ログレベルを上げてやり直し、死ぬ前に最後に記録されたものを確認し、それを分析して問題を修正します。

顧客環境で何か問題が発生したときにデバッグレベルのログを要求するだけで、サーバーへのアクセスを必要とせずに問題を特定できるのはすばらしいことです。

...しかし、はい、デバッガがあればよかったと思うこともありました。


0

上記に追加するだけです:

IMO vimは非常に軽いエディターである傾向があり、デバッグは重みを増す傾向があります。それを行う方法があります。すなわち、vim7.4 +を

:terminal

そして、次のコマンドライン(呪い)デバッガーの1つを実行します。いくつかは、あなたが知らなかったIDEのデフォルトで使用されます。つまり、lldb = xcode。

明らかにより多くのcliベースのものがあります。@allは自由に提案してリストに追加してください。ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.