我如何判断 Lua 中的任何变量何时设置为给定值?
How can I tell when ANY variable is set to a given value in Lua?
如果某个未知范围内的局部变量被设置为 256
,我怎么知道它发生了?
我希望能够一次查找一个值,假设这是可能的。
我可以访问 debug
API。
您可以在调试钩子中循环遍历当前范围内的所有局部变量,并检查哪个具有您需要的值:
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, and (2) using a debugger.
如果某个未知范围内的局部变量被设置为 256
,我怎么知道它发生了?
我希望能够一次查找一个值,假设这是可能的。
我可以访问 debug
API。
您可以在调试钩子中循环遍历当前范围内的所有局部变量,并检查哪个具有您需要的值:
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, and (2) using a debugger.