Upgrade to Pro — share decks privately, control downloads, hide ads and more …

debug Vim itself

Satoru Kitaguchi
December 13, 2023
670

debug Vim itself

Satoru Kitaguchi

December 13, 2023
Tweet

Transcript

  1. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する ゴリラ.vim #29 Satoru Kitaguchi 2023/12/13
  2. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    About Me Satoru Kitaguchi • 株式会社エウレカ ◦ Back-end Team ▪ Go ▪ Pairs の機能開発・保守・運用 ◦ 平日も休日も Vim をいじってます
  3. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    人生に「あってよかった」と思ってもらえるものを。
 Mission
  4. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Match Group
 サービス展開国・言語 時価総額 190ヶ国 40言語 約91億ドル(2023年12月時点) マッチグループ(NASDAQ:MTCH)は S&P500 種指数 45以上のマッチングサービスを展開 etc
  5. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug したことありますか?
  6. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    本日のゴール Vim を debug して検証できるようになる
  7. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    ❖ なぜ Vim を debug したくなったのか
 ❖ Vim を debug する手順
 ➢ 再現させる最小構成を作成する
 ➢ 再現しないバージョンを探す
 ➢ Vim のコードを読む
 ➢ debug build する
 ➢ GDB で debug する
 ❖ まとめ
 本日のAgenda
  8. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    なぜ Vim を debug したくなったのか
  9. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    なぜ Vim を debug したくなったのか bufnr() の動作がおかしいかも? 対象のバッファを開いていないのに バッファ番号が返ってきてしまう! -1 が返ってきて欲しいのに! bufnr(): バッファ番号を返すビルトイン関数 バッファが存在しない場合は -1 を返す
  10. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    なぜ Vim を debug したくなったのか
  11. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する手順 1. 最小構成を作成する
  12. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    1. 再現させる最小構成を作成する 発生原因の切り分けと debug の効率化のために必要 今回はパスを指定して Vim 起動後に bufnr() を呼び出せば良い 今回はワンライナーで構成できましたが 最小構成の設定ファイルを用意してもいいです --clean よりも -N -u NONE の方が良かったかも
  13. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する手順 2. 再現しないバージョンを探す
  14. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    2. 再現しないバージョンを探す 再現しないバージョンがあれば バージョン間のコード差分を比較できる! 今回は thinca さんの docker image を使いました ビルド不要でお手軽でありがたい! Vim の tag で checkout してビルドして検証することもできます この例では vimrc をマウントして指定しています
  15. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    2. 再現しないバージョンを探す 複数バージョンで検証する場合は 1. で作成した最小構成をシェルスクリプトにすると検証しやすいです 返り値を標準出力している場合は検証しにくいので `cquit` を使用すると終了コードを設定でき、検証がしやすくなります cquitのデフォルトのエラーコードは1なのでbufnr()の返り値に9を足しておく
  16. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する手順 3. Vim のコードを読む
  17. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    3. Vim のコードを読む 実装都合のコメントやバグが潜んでそうな箇所を探します 関数は evalfunc.c から探します bufnr は f_bufnr として定義されていることがわかりました evalfunc.c:1789 evalbuffer.c:473
  18. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する手順 4. debug build する
  19. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    4. debug build する 環境変数または Makefile を書き換えて build します
  20. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    4. debug build する debug build になってるか確認します 通常は stripped が末尾についています 別の確認方法 ↑-g オプション付きで build されていればOK
  21. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    4. debug build する 環境構築用の Dockerfile を用意しました
  22. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    Vim を debug する手順 5. GDB で debug する
  23. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する 方法は二種類 1. gdb コマンドを使って Vim のプロセスをアタッチする 2. Terminal モードを使用した termdebug を使用する Vim8 で導入された Terminal モードを使用するため Vim の中で debug できる Ex コマンドを使用して gdb コマンドを操作できる Vim でソースファイルを自由に操作できる マクロを実行したり autocmd を設定することもできる 別タブでターミナルを開く必要がある
  24. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する – gdb コマンドを使用する – 1. gdb を起動させるコンテナを起動する 2. 別タブで debug build した Vim を起動する 3. Vim のプロセスをアタッチして gdb を起動する * bufnr の挙動確認のためにファイルパスを指定↑
  25. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する – gdb コマンドを使用する –
  26. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する – termdebug を使用する – Vim 起動後に plugin をロードする 3つのウィンドウ ➢ gdb: gdb コマンドを入力するウィンドウ source ウィンドウで Ex コマンド入力しても ツールバーから選択してもOK ➢ program: 実行したプログラムのウィンドウ ➢ source: ソースコードが表示されるウィンドウ ウィンドウの行き来に使えるコマンド
  27. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する – termdebug を使用する –
  28. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    5. GDB で debug する – termdebug を使用する – source ウィンドウで gdb 操作できる Ex コマンド K を押すとカーソル下を print してくれる
  29. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    まとめ bufnr() バグってない! バッファ番号が返ってきてしまう! -1 が返ってきて欲しいのに! → file-pattern で解釈されるためエスケープが必要だった help に {buf}の使い方は前述の bufname() を参照 とちゃんと書いてました
  30. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

    まとめ – 付録 – debug してわかったこと file-pattern の検索で優先されるのは ファイル名の完全一致ではなく カレントファイル(%) この場合の bufnr の返り値は 4 ではなく 1