开发工具

Nvim 的 :help 页面,生成源代码 使用 tree-sitter-vimdoc 解析器。


用于开发 Nvim 的工具和技术
以下建议在处理或调试 Nvim 本身的问题时很有用。
待办事项:将 debug.txt 合并到这里。

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 运行与已破坏标签匹配的测试(格式为 #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

要附加到正在运行的 nvim 进程(其 PID 为 1234,提示:正在运行的 Nvim 实例的 PID 可以通过调用 getpid() 获得),例如
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 方法快速启动调试会话。此示例 local.mk 将在您键入 make debug 时创建调试会话。
.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
命令索引
快速参考