使用调用跟踪来调试 Vim 插件

21

在调试/追踪vim插件时,通常使用什么方法比较好?假设我有一个相当复杂的插件Foo,按下 F9 键会打开一个带有文件浏览器的新窗口,并且可以选择文件,之后文件名将被复制到主窗口。我想看到按下 F9 键时发生了什么,类似于调用跟踪。


3个回答

21

我发现最好的方法是在启动(g)vim时使用-V标记。您可以指定追踪级别N和写入日志的文件名:

$ vim -V[N]{filename}

然后将为每个被引用的文件提供跟踪消息(有关更多信息,请参见:help -V)。

浏览生成的日志文件可能很痛苦,但通常会提供很多信息。我发现最好在触发事件之前和之后(在你的情况下按下<F9>)查看日志文件,以了解发生了什么。


1
在我的情况下,语法是:vim -V[插入数字] [插入文件名] - 例如 vim -V20 filename.txt - Ben Creasy
1
请查看:help 'verbose' - Hans Ginzel
请参阅 :help 'verbose' 以了解各级别的含义。不幸的是,无法防止日志文件的缓冲(请参阅 :help 'verbosefile'),也无法添加时间戳(参见 Vim verbosefile with timestamps - Stack Overflow)。 - user202729

7
如果您已经打开了vim,请尝试在VIM内置调试器下手动执行命令。
1)查找按键时vim的操作。
:map <F-9>

2) 在调试器下手动运行映射的命令

:debug _mapped_command_

3) 现在你应该已经进入了调试器,所以

set verbose=20

4) 最后按下n和回车键以继续运行脚本。

此时屏幕上应该会有许多输出。您可以按空格键滚动屏幕,使用j/k键移动行。

任何以“行号#:”开头的输出都是vim在执行的那一行。


在调试模式下设置断点,请使用 :breaka[dd] func [lnum] {name}:breaka[dd] file [lnum] {name}。要设置条件断点,请修改脚本以包含带有您条件的 if 语句,在 if 语句内部放置一个无操作(如 let xyz = 1),并使用 breakadd 在无操作行上添加断点(请参阅 :help breakadd)。然后键入 contc 继续执行,直到执行断点行。 - David Winiecki

1

对于复杂的插件,通常仅使用命令行调试或跟踪是不够的。

您可以使用BreakPts在vim内进行可视化调试。

它基于远程调试,因此您需要调试vim的服务器实例。

基本上:

终端 1:

$ vim --servername Foo
...
set breakpoint on any Foo function
do whatever operation which trigger Foo logic
...

终端 2:

$ vim
:BreakPts
:BPRemoteServ FOO
:BPDWhere locate (actual debug execution point)
:BPDNext or F12 (next execution line)
:BPDStep or F11 (step inside functions, dictionary functions)
:BPDEvaluate or F8 (if pressed on visual selection evaluates that)
:BPDCont or F5 (continue execution)

有些插件是动态加载的,因此您需要在设置断点之前对它们进行操作。

加载后,您可以使用连接的vim设置断点:

:BPFunctions (Show debuggeable fuctions on RemoteServer)
:BPScripts (Show debuggeable scripts on RemoteServer)
:BPPoints (Show defined breakpoints on RemoteServer)

我已经通过这个伟大的插件来修复/调整/发展了很多vim插件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接