是否可以使用 lua 调试库检测变量的值何时发生变化。类似于回调函数的东西,它会提供详细信息,例如更改值的函数、先前的值等。这样的事情可能吗?
我阅读了有关钩子的信息,但我不确定钩子是否可以设置为变量。
您可以在 Lua 中通过使用元表并保留“代理”表并使用 __newindex 函数调用来检测添加变量的尝试在一定程度上做到这一点。
这在“跟踪表访问”部分的 Lua 编程一书中有所介绍:
如果您不介意使用调试器,那么某些调试器允许您设置 Watch 表达式,当表达式中的条件为真时将触发该表达式。我将展示如何在MobDebug中完成此操作(它使用 lua 调试库,但据我所知,没有直接的方法来检测变量更改)。
假设我们有一个start.lua
像下面这样的脚本,并且想要检测foo
值 2 的位置:
print("Start")
local foo = 0
for i = 1, 3 do
local function bar()
print("In bar")
end
foo = i
print("Loop")
bar()
end
print("End")
lua -e "require('mobdebug').listen()"
使用命令启动服务器。lua -e "require('mobdebug').loop()"
使用命令启动客户端。load start.lua
以加载脚本。step
,然后step
再次键入。你会看到“Paused at file start.lua line 3”。foo
是多少。键入eval foo
,您应该会看到 0。setw foo == 2
。你可以在 setw 命令之后指定任何 Lua 表达式;当条件被评估为真时,脚本的执行将停止。foo
为 2 并且执行在第 8 行停止。然后您可以检查您的脚本和当前值(您可以使用“eval”和“exec”命令运行任何 Lua 代码在您的脚本环境中评估)以查找触发更改的原因。这种方法的好处是您不仅可以监视表值,还可以指定任何表达式。主要缺点是您的脚本在调试器下运行,并且在每一步之后都会评估表达式,这可能会变得非常慢。