加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

调试 – 如何在`vim`和`nvim`中调试`处理函数时`错误?

发布时间:2020-12-15 21:19:16 所属栏目:安全 来源:网络整理
导读:TL; DR 当我有兴趣修复实际问题而不仅仅是删除坏插件时,如何找到vim或nvim错误的确切位置(哪个文件?)?什么比strace和guesswork更好找到错误来源? 问题 我经常在我的vim或nvim配置中添加一个插件,并最终在钩子上获得错误(缓冲区打开,关闭,写入): "test.py
TL; DR

当我有兴趣修复实际问题而不仅仅是删除坏插件时,如何找到vim或nvim错误的确切位置(哪个文件?)?什么比strace和guesswork更好找到错误来源?

问题

我经常在我的vim或nvim配置中添加一个插件,并最终在钩子上获得错误(缓冲区打开,关闭,写入):

"test.py" [New] 0L,0C written
Error detected while processing function 343[12]..272:
line    8:
E716: Key not present in Dictionary: _exec
E116: Invalid arguments for function get(a:args,'exec',a:1['_exec'])
E15: Invalid expression: get(a:args,a:1['_exec'])

问题是,我不知道它们来自哪里,只得到一些未知文件的行号,我知道它不是我的vim / nvim配置文件.

解决方法

在某个地方,你有一个插件定义了一个带匿名函数的字典(检查与这个标签相关的帮助).

对于好奇的人来说,就是这样做的:

let d = {}
function! d.whatever() abort
   throw "blah"
endfunction

执行此功能时,您将收到当前正在观察的错误.这就是为什么我停止这种方式更喜欢:

let d = {}
function s:whatever() abort
   throw "blah"
endfunction
let d.whatever = function('s:whatever') " a workaround is required for older versions of vim
" At least this way I'll get a `<SNR>42_whatever` in the exception throwpoint,and thus a scriptname.

这就是原因.现在,回到你的问题,AFAIK,你唯一能够知道的就是被调用的两个函数:

>在函数{343}的第12行中,你已经调用了
>:function {272},其中包含第8行的错误.

感谢这两个命令(可能带有前缀:详细,我不记得确切),你将获得这两个函数的源代码,你应该可以使用这些函数来grep你的插件知道它在哪里出现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读