lua - 在 Lua 中如何判断 ANY 变量何时被设置为给定值?

标签 lua

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

我希望能够一次查找一个值(假设这是可能的)。

我有权访问调试 API。

最佳答案

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

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 表并比较值。

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

还有两个其他选项可以跟踪变量更改(有一些限制):(1) using metamethods and a proxy table和 (2) using a debugger .

关于lua - 在 Lua 中如何判断 ANY 变量何时被设置为给定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29906624/

相关文章:

caching - 应该使用内存 Db 中的哪个来缓存主要用于读取的树?

lua - 如何使用Lua获取Neovim当前工作目录下的所有文件和目录?

api - 如何在Lua中创建表,然后从C API添加值?

使用 LuaJIT 调用标准打开对话框会导致访问冲突

string - lua string.find 无法识别子字符串

random - 如何以更高的频率获取某个 "random range"?

c++ - 如何让 Lua 迭代器返回 C 结构?

lua - swig 包装变量的基本赋值失败

linux - Lua:加载模块文件时出错,找不到

Lua 表转换