Lua Debugging - 检测变量值何时发生变化

时间:2012-08-13 20:39:13

标签: debugging variables lua hook

是否可以使用lua调试库检测变量值的更改时间。 类似于回调函数的东西,它会提供类似于更改值的函数,先前值等的详细信息。 这样的事情有可能吗?

我读过钩子,但我不确定钩子是否可以设置为变量。

2 个答案:

答案 0 :(得分:2)

您可以在Lua中通过使用元表并保留“代理”表,并使用__newindex函数调用来检测添加变量的尝试,从而在某种程度上执行此操作。

“Lua编程”一书的“跟踪表访问”一节中介绍了这一点:

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

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

答案 1 :(得分: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. 使用“run”命令继续执行脚本。
  9. 手表现在开启,会显示如下消息:“暂停在文件start.lua第8行(观察表达式1:[foo == 2])”。这意味着前一个表达式将foo的值更改为2,并且在第8行停止执行。然后,您可以检查脚本和当前值(可以使用“eval”和“exec”命令运行要在脚本环境中评估的任何Lua代码,以找到触发更改的内容。
  10. 此方法的好处是您不仅可以监视表值,还可以指定任何表达式。主要的缺点是您的脚本在调试器下运行,并且在每个步骤之后计算表达式,这可能会变得非常慢。