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

我如何判断任何变量在Lua中何时设置为给定值?,lua,Lua,如果某个未知范围内的局部变量设置为256,我如何知道它发生了 我希望能够一次查找一个值,假设这是可能的 我可以访问debugAPI。您可以在debug钩子内的当前作用域中循环所有局部变量,并检查哪一个具有所需的值: do local seen = {} debug.sethook(function(ev, line) local level = 2 local target = 256 local i = 1 while true do

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

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


我可以访问
debug
API。

您可以在debug钩子内的当前作用域中循环所有局部变量,并检查哪一个具有所需的值:

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
这只适用于局部变量。对于全局变量,您可以迭代
\u G
\u ENV
表并比较值

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


还有两个其他选项可以跟踪变量更改(有一些限制):(1)和(2)。

您想在整个变量空间中扫描任何值为256的变量吗?如果不进行一些简化的假设和/或流控制分析,或者不向VM代码添加跟踪,您就不能这样做。调试库最多中断每一行和函数调用或返回。一行可以将其设置为256,并在中断之间设置为其他值。那么,你有什么简化的假设吗?如果可能的话,我想知道在赋值时哪个变量是256。在最坏的情况下,我需要在每个局部的作用域结束时知道它的值,所以在每次返回时中断就足够了(但不是最优的)。但是局部的作用域可以在它在返回中创建的函数之前结束。你真正想解决的问题是什么?谢谢你的回答。不幸的是,我不知道什么时候赋值,也不知道在哪里赋值,所以我不知道什么时候运行这个代码段,也不知道在什么时候运行。我需要的东西将自动运行时,值分配给一个变量。你不需要知道;您只需在脚本开始时设置它,它将在每一行触发(这将影响性能),并将指向更改值的行。通常情况下,您不能使用变量进行设置,但可以使用来检测是否更改了表字段的值。由于全局变量是表中的字段,您可以跟踪它们的更改,但不能跟踪局部(简单)变量。在重新阅读并随后使用此代码后,它解决了我的问题。谢谢虽然我可以解释一下它是如何工作的,因为我以前从未接触过挂钩。是的,您可以尝试
debug.getinfo(2,“S”).source
。请参阅
debug.getinfo
的文档。