Debugging 使用getinfo/getlocal/getupvalue获取Lua中的所有变量以进行调试
我用这个函数从我的Lua应用程序中获得了几乎所有的变量,但不是a.Lua文件的本地变量 main.lua根目录下的示例: 本地测试=10 这是找不到的 有什么想法吗 注意:我在Love2D应用程序中运行这个函数,这个函数是从Love回调(Love.draw)调用的Debugging 使用getinfo/getlocal/getupvalue获取Lua中的所有变量以进行调试,debugging,lua,introspection,love2d,Debugging,Lua,Introspection,Love2d,我用这个函数从我的Lua应用程序中获得了几乎所有的变量,但不是a.Lua文件的本地变量 main.lua根目录下的示例: 本地测试=10 这是找不到的 有什么想法吗 注意:我在Love2D应用程序中运行这个函数,这个函数是从Love回调(Love.draw)调用的 调用回调love.draw时,主块(其中定义了test)已经执行,其所有局部变量(包括local test)都被杀死(只有upvalue可以存活)。很有意思,谢谢!但是,我可以从love.draw访问这些变量,所以这意味着它们在堆栈中
调用回调
love.draw
时,主块(其中定义了test
)已经执行,其所有局部变量(包括local test
)都被杀死(只有upvalue可以存活)。很有意思,谢谢!但是,我可以从love.draw访问这些变量,所以这意味着它们在堆栈中的某个位置,对吗?那么为什么getvarvalues不能访问它们呢?然而,我可以访问这个变量
如果您可以访问,但还没有访问它,变量就被杀死了。否则,它将被发现为upvalue。你说得太对了!如果我在调用getvarvalue之前从love.draw访问它,那么它是可访问的,否则它在本地或up值中找不到。我仍然无法理解这个值,因为somewere一直在更新它的值,如果我不从调用getvarvalue的函数访问它,我就无法访问它。
function getvarvalue (name)
local value, found
-- try local variables
local exit = false
local level = 0
while debug.getinfo(level) ~= nil do
local i = 1
while true do
local n, v = debug.getlocal(level, i)
if n then
print("local "..i.." "..level.." name:"..n)
end
if not n then break end
print(n)
if n == name then
value = v
found = true
end
i = i + 1
end
if found then return value end
level = level + 1
end
-- try upvalues
level = 0
while debug.getinfo(level) ~= nil do
local func = debug.getinfo(level).func
i = 1
while true do
local n, v = debug.getupvalue(func, i)
if n~= nil then print("up "..i.." "..level.." "..n) end
if not n then break end
if n == name then return v end
i = i + 1
end
if getfenv(func)[name] ~= nil then
return getfenv(func)[name]
end
level = level + 1
end
-- not found
return "?"
end