Debugging 使用getinfo/getlocal/getupvalue获取Lua中的所有变量以进行调试

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访问这些变量,所以这意味着它们在堆栈中

我用这个函数从我的Lua应用程序中获得了几乎所有的变量,但不是a.Lua文件的本地变量

main.lua根目录下的示例: 本地测试=10

这是找不到的

有什么想法吗

注意:我在Love2D应用程序中运行这个函数,这个函数是从Love回调(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