はじめに
この記事ではVimで使えるgdbフロントエンドプラグインを幾つか紹介します。
Vim8からはtermdebugが使えるようになりましたが、cpiger/NeoDebugも使い勝手がよかったので、それぞれの使用感と補足となるWindows環境構築(後述)についてを記載します1。
termdebug
cgdbやgdbのtuiモードでデバッグしてた方はtermdebugへの乗り換えがオススメです、キビキビと動作してcgdbのような画面の乱れもありません。
Demo
C++デバッグ時のデモです、breakpointの設定と変数操作をして通常だとありえないif文を通してみます。
補足
現時点の最新版termdebug.vimですが、ハイライト設定がプラグインロード時に設定されている関係で、カラースキームを変更している場合に.vimrcへのpackadd termdebug
の場所によってはハイライト設定が初期化されてしまいます、それが困るって方は暫定としてハイライト設定をtermdebugが開始される時に変更すれば動作します。
" termdebug.vim変更方法
func s:Highlight(init, old, new)
let default = a:init ? 'default ' : ''
if a:new ==# 'light' && a:old !=# 'light'
exe "hi " . default . "debugPC term=reverse ctermbg=lightblue guibg=lightblue"
elseif a:new ==# 'dark' && a:old !=# 'dark'
exe "hi " . default . "debugPC term=reverse ctermbg=darkblue guibg=darkblue"
endif
+ hi default debugBreakpoint term=reverse ctermbg=red guibg=red
endfunc
- call s:Highlight(1, '', &background)
- hi default debugBreakpoint term=reverse ctermbg=red guibg=red
func s:StartDebug(bang, ...)
" First argument is the command to debug, second core file or process ID.
call s:StartDebug_internal({'gdb_args': a:000, 'bang': a:bang})
+ call s:Highlight(1, '', &background)
endfunc
NeoDebug
NeoDebugはtermdebugよりも高機能で、標準でショートカットキー、変数やbreakpoint、watchやスレッドなどの状態をリアルタイムに表示するウィンドウが用意され、マウスオーバーでの変数表示などに対応しています。
ソースコードを確認したところ、ある時点からのtermdebug.vimのソースコードを元に拡張しているようでした、ただし触ってみたところ細かいバグらしきものがあったため2、それらの修正をした自改造版を利用しています。
こちらでは修正の他に、cgdbに近い操作感を得るためのショートカットキーも追加しています。
Demo
termdebugデモと同じ操作の他に、watchの設定やマウスオーバー時の変数表示などもしています。
Windows環境構築
gdbのビルドについて
ビルド用にMSYS2を用意します。
pacmanでインストールするgdb 7.12.1だと動かなかったため、公式のソースコードからビルドします。
※記事作成時はバージョン8.2
MSYS2用のパッチの必要もなく、C++のビルド環境を整えてビルドするだけで済みます。
msys2 ターミナル
$ # 解凍したルートでmake(README 参照) ※わりと長い
$ ./configure
$ make [-j4]
termdebug対応Vimのビルドについて
Kaoriya版Vimでの手順です。
termdebug.vimはつい先日のvimconf2018で修正が入ったばかりなので最新版を取ってきます。
2018/12/14時点のKaoriya版Vimはバージョン8.1.0005ですが、termdebug.vimで利用されているprompt_setprompt()
がまだ未実装のため、最新版のVimソースを自前でビルドします。
自前でビルドするとKaoriya版Vimのパッチが未対応になりますので、それが嫌だという方は対応まで待ちましょう。
現時点の最新はバージョン8.1.0581なので、それをgit clone
> git clone --depth=1 -b v8.1.0581 https://github.com/vim/vim
自分はKaoriya版と同じMS-Windowsビルド版のGVimが欲しかったのでVisual C++ 2017でビルド、Python2、Python3、Luaをリンクさせます、Python3は3.6を指定。
VS 2017 用 x86_x64 Cross Tools コマンドプロンプト
> @rem srcフォルダでnmake(INSTALLpc.txt 参照)
> nmake -f Make_mvc.mak GUI=yes ^
PYTHON=path\to\Python27 ^
PYTHON3=path\to\Python36 ^
LUA=path\to\lua-5.3
生成されたgvim.exe
を差し替え後、runtimeも最新へ差し替えます。