如何在Lua中将ANY变量设置为给定值?

时间:2015-04-27 21:51:09

标签: lua

如果某个未知范围内的局部变量设置为256,我怎么知道它发生了?

我希望能够一次找到一个值,假设这是可能的。

我可以访问debug API。

1 个答案:

答案 0 :(得分:3)

您可以在调试钩子内的当前范围内遍历所有局部变量,并检查哪一个具有您需要的值:

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)using metamethods and a proxy table和(2)using a debugger