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

xoefb8l8  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(173)

我设法用这个函数从Lua应用程序中获得了几乎所有的变量,但没有获得.lua文件的本地变量...
main.lua根目录下的示例:本地测试= 10
无法找到此文件。
你知道吗?
注意:我在一个Love2D应用程序中运行这个函数,这个函数是从一个Love回调函数(love.draw)调用的。

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
bprjcwpo

bprjcwpo1#

正如@egor-skriptunoff指出的,函数中未使用的局部变量被“杀死”了。这究竟意味着什么?首先,Lua将函数视为值,这意味着love.draw实际上是一个字段,其中的赋值是一个函数。因此,函数本身是在运行时创建的。考虑以下示例:

local myVar = 1

function love.draw()
    print(getvar("myVar"))
end

当Lua构造函数时,它会检查使用了哪些upvalues。这里发生了“kill of”,它不会检测myVar的使用,也不会创建对myVar的引用。即使它在love.update中更新了。调试API也不会显示myVar,因为它只显示引用的值。要强制Lua保留引用,可以使用一个简单的:love.draw中的myVar = myVar应该就可以了。

相关问题