Wireshark dissector使用loadstring报attempt to call global错误如何解决
错误原因
报错的核心是Wireshark的Lua运行环境的作用域限制:
- 你在dissector脚本顶层定义的
mycustomfnc函数在动态执行上下文的全局环境中不存在。普通Lua脚本里顶层定义的函数默认挂载到全局表,所以loadstring执行时可以正常找到;但Wireshark加载自定义dissector时会把脚本内的顶层定义默认放在模块级的局部环境中,loadstring默认编译出的函数运行时只会从全局环境查找变量,自然会把mycustomfnc识别为nil值。 - 除此之外你动态执行语句中用到的
buffer、subtree都是dissector函数的局部变量,loadstring默认编译出的函数也无法直接访问这两个局部变量。
解决方法
推荐使用传参方案,不会污染全局环境,只需要修改动态执行部分的代码即可:
-- 原报错的两行替换为以下代码 local srcfncall = "local mycustomfnc, buffer, subtree = ...; mycustomfnc(buffer, subtree)" load(srcfncall)(mycustomfnc, buffer, subtree)
如果需要频繁动态调用该函数,也可以选择将函数显式注册到全局环境:
-- 定义函数时直接挂载到全局表_G _G.mycustomfnc = function(buffer, subtree) print(os.time() .. " " .. "FUNCTION REACHED!") subtree:add(buffer(4,2),"Plus 5th and 6th bytes!: " .. buffer(4,2):uint()) end -- 动态调用时同步把局部变量注入环境即可 local srcfncall = "local buffer, subtree = ...; mycustomfnc(buffer, subtree)" load(srcfncall)(buffer, subtree)
内容的提问来源于stack exchange,提问作者dariox
相关产品推荐
相关产品推荐

