是否有可能当一个变量的值,用LUA调试库已经改变检测。 类似于一个回调函数,它会给出详细信息,例如值被更改的函数,之前的值等。 这样的事情可能吗?的Lua调试 - 检测当一个变量的值更改
我读到挂钩,但我不知道钩子可以设置为变量。
是否有可能当一个变量的值,用LUA调试库已经改变检测。 类似于一个回调函数,它会给出详细信息,例如值被更改的函数,之前的值等。 这样的事情可能吗?的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
。你会看到“暂停在文件start.lua第3行”。foo
的值是多少。键入eval foo
,你应该看到0setw foo == 2
。您可以在setw命令后指定任何Lua表达式;当条件评估为true时,脚本的执行将会停止。foo
的值更改为2,并且执行在第8行停止。然后,您可以检查脚本和当前值(可以使用“eval”和“exec”命令来运行任何Lua代码在您的脚本环境中进行评估)来查找引发更改的内容。这种方法的好处是,您不仅限于监视表值,还可以指定任何表达式。主要的缺点是你的脚本在调试器下运行,表达式在每一步之后被评估,这可能会非常慢。
听起来非常方便..我会做一些与这个整洁的图书馆搞乱..谢谢很多! – SatheeshJM 2012-08-13 22:11:20
您可以通过使用元表,并保持一个“代理”表中,使用了__newindex函数调用来检测试图加入一个变量这样做是为了在Lua在一定程度上。
这是这里所涉及的程序在Lua书下的一节 “跟踪表访问”:
感谢您的回答!访问表格元素时很好。如果我需要跟踪一个局部变量/ upvalue,该怎么办? – SatheeshJM 2012-08-13 20:47:51
根据我发布的“另请参见”链接,跟踪一个局部变量并不是真的在Lua中完成的,或者在任何其他编程语言中都不是这样,而不是没有调试器。您可以尝试查看Object Properties:http://lua-users.org/wiki/ObjectProperties,您可以使用它来创建一个将通知您的setter。 – 2012-08-13 21:15:17
我已经提供了一个免费的库,为您提供这个包装和通知。 https://github.com/Phrogz/notifitable – Phrogz 2014-02-12 07:04:50
您可以将自定义setter方法添加到您感兴趣的对象的metatable中。使它们在运行时提醒您。 – TheZ 2012-08-13 20:41:37