Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy 会社紹介

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

出典:MMD研究所「2023年マッチングサービス・アプリの利用実態調査」 


Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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 を設定することもできる 別タブでターミナルを開く必要がある

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy まとめ

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

No content