我如何在Lua中判断任何变量是否设置为给定值?

如果某个不知名作用域中的局部变量被设置为 256,我该如何知道它发生了什么?

我希望能够一次查找一个值,如果可能的话。

我可以访问 debug API。

点赞
用户1442917
用户1442917

您可以在调试钩子内部循环遍历当前范围内的所有本地变量,并检查哪些变量具有您需要的值:

do
  local seen = {}
  debug.sethook(function(ev, line)
      local level = 2
      local target = 256
      local i = 1
      while true do
        local name, value = debug.getlocal(level, i)
        if not name then break end
        if value == target and string.sub(name, 1, 1) ~= '(' and not seen[name] then
          print("at line", line, "variable", name, value)
          seen[name] = true
        elseif seen[name] and value ~= target then
          seen[name] = nil
        end
        i = i + 1
      end
    end, "l")
end

local a = 256
local b = 11
a = 13
a, b = 256, 256
print("done")

在我的情况下,这会打印如下内容:

at line 23  variable    a   256
at line 26  variable    a   256
at line 26  variable    b   256
done

这仅适用于本地变量。对于全局变量,您可以迭代 _G_ENV 表并比较值。

请注意,打印的行是下一条语句的行,而不是更改发生的行(因为钩子在行执行之前停止)。

还有两个跟踪变量更改的选项(具有一些限制):(1)使用元方法和代理表和(2)使用调试器

2015-04-28 00:37:12