如果某个未知范围内的局部变量设置为256
,我怎么知道它发生了?
我希望能够一次找到一个值,假设这是可能的。
我可以访问debug
API。
答案 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。