前書き

GDBをリッチなText User interface環境で実行するツールは、以前から複数ありました。例えば、

  • CGDB:ViライクなキーバインドのGDBフロントエンド
  • GDB TUI mode:EmacsライクなキーバインドのGDB標準のTUI環境(オプションtui)
  • NeoDebug:Vim用GDBフロントエンドプラグイン。Vim標準(Termdebug)より高機能

などがあります。

上記のツールの(個人的な)デメリットは、

  • CGDBは便利だが、Vim(+plugin)環境を完全に再現できない事
  • GDB TUI modeは、OS標準GDBがサポートしていない可能性ある事
  • NeoDebugは、本記事で紹介するVim標準機能より遥かに高機能だが、バグがある事。また、情報が少ない事

と、何点か挙げられました。

本記事で紹介するVim標準機能(termdebug)は、上記のデメリットがありません。普段使用しているVim(+plugin)の環境上でGDBを操作でき、操作に関する情報量も多いです。Breakpointをマウス操作で貼れます。

termdebugは使い勝手が良いため、本記事では導入方法と使い方について説明します。

検証環境

       _,met$$$$$gg.          nao@debian 
    ,g$$$$$$$$$$$$$$$P.       ---------- 
  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 10 (buster) x86_64 
 ,$$P'              `$$$.     Kernel: 4.19.0-6-amd64 
',$$P       ,ggs.     `$$b:   Uptime: 4 hours, 8 minutes 
`d$$'     ,$P"'   .    $$$    Packages: 2474 (dpkg) 
 $$P      d$'     ,    $$P    Shell: fish 3.0.2 
 $$:      $$.   - ,d$$'    Resolution: 2560x1080 
 $$;      Y$b._   _,d$P'      DE: Cinnamon 3.8.8 
 Y$$.    `.`"Y$$$$P"'         WM: Mutter (Muffin) 
 `$$b      "-.__              WM Theme: cinnamon (Albatross) 
  `Y$$                        Theme: BlackMATE [GTK2/3] 
   `Y$$.                      Icons: gnome [GTK2/3] 
     `$$b.                    Terminal: gnome-terminal 
       `Y$$b.                 CPU: Intel i3-6100U (4) @ 2.300GHz 
          `"Y$b._             GPU: Intel HD Graphics 520 
              `"""            Memory: 3840MiB / 32060MiB 

Termdebug導入前の事前確認

Termdebugは、Vim8.1.x環境でterminal機能が無ければ、使用できません。バージョン確認およびterminal機能の有効・無効確認は、以下の手順で実施します。

$ vim --version                           
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
(省略)

$ vim
(注釈):Vimの画面上で以下を入力。
:echo has('terminal')

(注釈):出力が1であればterminal機能が有効、0ならば無効

仮に、Terminal機能がなかった場合は、vimを一度削除し、vim-noxパッケージを入れるか(Debian限定)、Vimの上流からのバックポートパッケージを利用して下さい(Debian, Ubuntu限定)。手順を以下に示します。

vim-noxを利用する場合

$ sudo apt remove vim
$ sudo apt update
$ sudo apt install vim-nox

最新版(上流)のVimを利用する場合

$ sudo add-apt-repository ppa:jonathonf/vim   (注釈):最新のVimを使用できるよう、リポジトリ追加
$ sudo apt update
$ sudo apt install vim

Termdebugを利用するための設定

Termdebugを利用するには、"~/.vimrc"ファイルに以下の3行を追加するだけです。

" termdebugプラグイン読み込み
packadd termdebug

" Vimの全モードでマウス操作を有効化
set mouse=a

" GDBデバッグ時のWindow横幅サイズ指定
let g:termdebug_wide = 160

Termdebugの使い方

Vimを起動した後、":Termdebug <デバッグ対象バイナリへのPATH>“でGDBとソースコードが同時に表示できます。":Termdebug"部分をgdbコマンドに置き換えると、分かりやすいと思われます。

例えば、rpnバイナリをGDBデバッグする場合は、":Termdebug rpn"とVim上で入力します。以下に起動後のイメージを示します。

VIM_GDB

上記のVim画像の右側がソースコード画面、左上がGDB画面、左下がプログラムのI/O画面です。GDB画面に移動(例:“Ctrl-w w”)すれば、GDBを操作できます。GDBを終了させれば、画面はソースコードのみ表示された状態に戻り、Window横幅も元の設定に戻ります。

ソースコード画面上部には、Step、Next、Finish、Cont、Stop、Evalと書かれたボタンがあり、このボタンをマウスで押下してGDBを操作します。ソースコードの任意の行で右クリックすれば、Breakpointの追加・削除、式の評価ができます。

Vim画面(Vimコマンド)でGDBを操作する場合は、下表のコマンドを使用します。より詳細な情報は、Vim公式日本語HPを確認して下さい。

コマンド説明
:Run [args][args] または以前の引数でプログラムを実行
:Break現在の行にBreakpointを設定
:Clear現在の行のBreakpointを削除
:Stepgdbのstepコマンドを実効
:Overgdbのnextコマンドを実効
:Finishgdbのfinishコマンドを実効
:Continuegdbのcontinuコマンドを実効
:Stopプログラムの中断
:Evaluateカーソルの下の式を評価
:Evaluate {expr}{expr}を評価
:Gdbgdb画面に移動
:Programデバッグ中のプログラムI/O画面に移動
:Sourceソースコード画面に移動