はい、getinfo、getlocal、getupvalue を組み合わせて使用すると、すべての情報を取得できます (set* 関数を使用してこれらの値を変更することもできます)。
これはMobDebugからのフラグメントで、各レベルのローカルと上位値のテーブルと共にスタック情報を返します。各レベルの変数は、コードに表示されるのと同じ順序で (パラメーターから開始して) インデックスが付けられます。各 get* 関数には、C の同等の関数 (lua_getinfo、lua_getlocal、および lua_getupvalue) を使用できますが、ロジックはまったく同じである必要があります。
local function stack(start)
local function vars(f)
local func = debug.getinfo(f, "f").func
local i = 1
local locals = {}
while true do
local name, value = debug.getlocal(f, i)
if not name then break end
if string.sub(name, 1, 1) ~= '(' then locals[name] = {value, tostring(value)} end
i = i + 1
end
i = 1
local ups = {}
while func and true do -- check for func as it may be nil for tail calls
local name, value = debug.getupvalue(func, i)
if not name then break end
ups[name] = {value, tostring(value)}
i = i + 1
end
return locals, ups
end
local stack = {}
for i = (start or 0), 100 do
local source = debug.getinfo(i, "Snl")
if not source then break end
table.insert(stack, {
{source.name, source.source, source.linedefined,
source.currentline, source.what, source.namewhat, source.short_src},
vars(i+1)})
if source.what == 'main' then break end
end
return stack
end