2012-08-13 135 views
1

是否有可能当一个变量的值,用LUA调试库已经改变检测。 类似于一个回调函数,它会给出详细信息,例如值被更改的函数,之前的值等。 这样的事情可能吗?的Lua调试 - 检测当一个变量的值更改

我读到挂钩,但我不知道钩子可以设置为变量。

+1

您可以将自定义setter方法添加到您感兴趣的对象的metatable中。使它们在运行时提醒您。 – TheZ 2012-08-13 20:41:37

回答

2

如果你不介意使用一个调试器,然后一些调试器允许您设置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") 
  1. 下载mobdebug.lua,并将其提供给您的脚本(最简单的方法是把它与您的脚本到文件夹中)。
  2. 使用lua -e "require('mobdebug').listen()"命令启动服务器。
  3. 使用lua -e "require('mobdebug').loop()"命令启动客户端。
  4. 您将在服务器窗口中看到提示:'>'。输入load start.lua加载脚本。
  5. 类型step,然后再step。你会看到“暂停在文件start.lua第3行”。
  6. 让我们看看foo的值是多少。键入eval foo,你应该看到0
  7. 现在,我们可以设置我们的手表。类型setw foo == 2。您可以在setw命令后指定任何Lua表达式;当条件评估为true时,脚本的执行将会停止。
  8. 使用“运行”命令继续执行脚本。
  9. 手表现在触发,这将显示您喜欢的消息:“(:[富== 2]观看表达式1)在文件start.lua线8暂停”。这意味着前面的表达式将foo的值更改为2,并且执行在第8行停止。然后,您可以检查脚本和当前值(可以使用“eval”和“exec”命令来运行任何Lua代码在您的脚本环境中进行评估)来查找引发更改的内容。

这种方法的好处是,您不仅限于监视表值,还可以指定任何表达式。主要的缺点是你的脚本在调试器下运行,表达式在每一步之后被评估,这可能会非常慢。

+0

听起来非常方便..我会做一些与这个整洁的图书馆搞乱..谢谢很多! – SatheeshJM 2012-08-13 22:11:20

2

您可以通过使用元表,并保持一个“代理”表中,使用了__newindex函数调用来检测试图加入一个变量这样做是为了在Lua在一定程度上。

这是这里所涉及的程序在Lua书下的一节 “跟踪表访问”:

http://www.lua.org/pil/13.4.4.html

请参见
http://www.gammon.com.au/forum/?id=10887

+0

感谢您的回答!访问表格元素时很好。如果我需要跟踪一个局部变量/ upvalue,该怎么办? – SatheeshJM 2012-08-13 20:47:51

+0

根据我发布的“另请参见”链接,跟踪一个局部变量并不是真的在Lua中完成的,或者在任何其他编程语言中都不是这样,而不是没有调试器。您可以尝试查看Object Properties:http://lua-users.org/wiki/ObjectProperties,您可以使用它来创建一个将通知您的setter。 – 2012-08-13 21:15:17

+0

我已经提供了一个免费的库,为您提供这个包装和通知。 https://github.com/Phrogz/notifitable – Phrogz 2014-02-12 07:04:50