開發工具

Nvim 的 :help 頁面,從 來源 使用 tree-sitter-vimdoc 解析器產生


開發 Nvim 的工具與技術
當處理 Nvim 本身的問題或進行除錯時,以下建議會很有幫助。
TODO: 將 debug.txt 合併到這裡。

回溯追蹤 dev-tools-backtrace

LINUX

在 Ubuntu、CentOS 和其他系統上,核心傾印預設是停用的。要啟用核心傾印
ulimit -c unlimited
在基於 systemd 的系統上,取得回溯追蹤非常簡單
coredumpctl -1 gdb
coredumpctl 是一個可選工具,您可能需要安裝它
sudo apt install systemd-coredump
完整的回溯追蹤最有用;當回報與當機相關的錯誤時,請將 backtrace.txt 檔案寄給我們
2>&1 coredumpctl -1 gdb | tee -a backtrace.txt
(gdb) thread apply all bt full
在沒有 coredumpctl 的系統上,您可能會在目前目錄或其他位置找到 core 傾印檔案。在已安裝 apport 的 Linux 系統(例如 Ubuntu)上,儲存核心傾印檔案的目錄可能是 /var/lib/apport/coredump 或其他位置,具體取決於系統設定(請參閱 /proc/sys/kernel/core_pattern)。另請參閱:https://stackoverflow.com/a/18368068
要從 ./core 傾印檔案取得回溯追蹤
gdb build/bin/nvim ./core 2>&1 | tee backtrace.txt
(gdb) thread apply all bt full

MACOS

如果 nvim 當機,您可以在 Console.app 中看到回溯追蹤(在較舊的 macOS 版本中,位於「當機報告」或「使用者診斷報告」下)。
open -a Console
您可能也想在 macOS 上啟用核心傾印。若要執行此操作,請先確保 /cores/ 目錄存在且可寫入
sudo mkdir /cores
sudo chown root:admin /cores
sudo chmod 1775 /cores
然後將核心大小限制設定為 unlimited
ulimit -c unlimited
請注意,這是針對每個 shell 程序完成的。如果您想讓此成為所有 shell 的預設值,請將上述行新增至您 shell 的初始化檔案(例如 ~/.bashrc 或類似的檔案)。
然後您可以在 lldb 中開啟核心檔案
lldb -c /cores/core.12345
Apple 的文件歸檔中有一些其他有用的資訊 https://developer.apple.com/library/archive/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCOREDUMPS,,但請注意,此頁面上的一些內容已過時(例如使用 /etc/launchd.conf 啟用核心傾印)。

使用 GDB 單步執行功能測試

使用 TEST_TAG 來執行符合 busted 標籤的測試(形式為 #foo,例如 it("test #foo ...", ...)
GDB=1 TEST_TAG=foo make functionaltest
然後,在另一個終端機中
gdb build/bin/nvim
(gdb) target remote localhost:7777
-- 請參閱 https://github.com/neovim/neovim/blob/master/test/functional/testnvim.lua 中的 nvim_argv

使用 LLDB 單步執行單元測試

lldb .deps/usr/bin/luajit -- .deps/usr/bin/busted --lpath="./build/?.lua" test/unit/

使用 GDB

要附加到執行中 pid 為 1234 的 nvim 程序(提示:可以透過呼叫 getpid() 取得執行中 Nvim 實例的 pid),例如
gdb -tui -p 1234 build/bin/nvim
將出現 gdb 互動式提示。您可以隨時執行
break foofoo() 函數上設定中斷點
n 單步執行下一個陳述式
<Enter> 重複上一個命令
s 單步進入下一個陳述式
c 繼續
finish 單步跳出目前的函數
p zub 列印 zub 的值
bt 從目前位置查看回溯追蹤(呼叫堆疊)
CTRL-x CTRL-atui enable 顯示目前除錯內容中原始碼檔案的 TUI 檢視。這非常有用,因為它避免了對 gdb「前端」的需求。
<up><down> 捲動原始碼檔案檢視

GDB 反向除錯

set record full insn-number-max unlimited
continue 一下(至少直到 main() 執行)
record
觸發錯誤,然後使用 revert-nextreverse-step 等來倒轉除錯器

使用 GDBSERVER

您可能想要將多個 gdb 用戶端連線到同一個執行中的 nvim 程序,或者您可能想要使用本機 gdb 連線到遠端 nvim 程序。使用 gdbserver,您可以附加到單一程序並從多個 gdb 用戶端控制它。
開啟終端機並啟動附加到 nvimgdbserver,如下所示
gdbserver :6666 build/bin/nvim 2> gdbserver.log
gdbserver 現在正在埠 6666 上接聽。然後您需要在另一個終端機中附加到此除錯工作階段
gdb build/bin/nvim
一旦您進入 gdb,您需要附加到遠端工作階段
(gdb) target remote localhost:6666
如果 gdbserver 將 TUI 作為背景程序,則 TUI 可能無法從 pty 讀取輸入(並接收 SIGTTIN 訊號)和/或輸出資料(SIGTTOU 訊號)。若要強制 TUI 作為前景程序,您可以新增
signal (SIGTTOU, SIG_IGN);
if (!tcsetpgrp(data->input.in_fd, getpid())) {
    perror("tcsetpgrp failed");
}
tui.c:terminfo_start

在 TMUX 中使用 GDBSERVER

考慮使用自訂 makefile https://github.com/neovim/neovim/blob/master/BUILD.md#custom-makefile 以快速啟動使用上述 gdbserver 方法的除錯工作階段。當您鍵入 make debug 時,此範例 local.mk 將會建立除錯工作階段。
.PHONY: dbg-start dbg-attach debug build
build:
    @$(MAKE) nvim
dbg-start: build
    @tmux new-window -n 'dbg-neovim' 'gdbserver :6666 ./build/bin/nvim -D'
dbg-attach:
    @tmux new-window -n 'dbg-cgdb' 'cgdb -x gdb_start.sh ./build/bin/nvim'
debug: dbg-start dbg-attach
這裡的 gdb_start.sh 包含除錯器啟動時要呼叫的 gdb 命令。它需要附加到由 dbg-start 規則啟動的伺服器。例如
(gdb) target remote localhost:6666
(gdb) br main
主頁
命令索引
快速參考