'(' (開き括弧) で始まる変数名は内部の変数 (ループ制御変数、 一時変数、 可変長引数、 および C の関数のローカル変数) を表します。
引数 f に関数を指定することもできます。この場合は関数の引数の名前だけを返します。
function foo (a, b)
local x
do local c = a-b end
local a = 1
while true do
local name, value = debug.getlocal(1,a)
if not name then break end
print(name, value)
a = a + 1
end
end
foo(10, 20)
--[[
a 10
b 20
x nil
a 4
]]
co = coroutine.create( function()
local x = 10
coroutine.yield()
error("some error")
end)
coroutine.resume(co)
print(debug.traceback(co)) --> yieldでとまっている状態でコルーチンをトレース
print(coroutine.resume(co))
print(debug.traceback(co)) -- > エラーが発生した後にコルーチンをトレース
print(debug.getlocal(co,1,1)) -- > エラーが発生した後でもローカル変数は調査可能
--[[
実行結果:
stack traceback:
[C]: in function 'yield'
c:\test.lua:3: in function <c:\test.lua:1>
false c:\a.lua:4: some error
stack traceback:
[C]: in function 'error'
c:\test.lua:4: in function <c:\test.lua:1>
x 10
みたいな形。
]]
function hook_func(p)
local fname = debug.getinfo(2).name
print("[hook]"..p..":"..fname)
end
debug.sethook(hook_func, "c")
-- call function
function hoge1(a,b) return a,b end
function hoge2(a,b) return a,b end
hoge1(3,5)
hoge2(1,2)
--[[ 実行結果
[hook]call:hoge1
[hook]call:hoge2
--]]
呼び出し回数分析プロファイラの作成
profiler.luaなど
local Counters = {}
local Names = {}
local function hook()
local f = debug.getinfo(2, "f").func
if Counters[f] == nil then
Counters[f] = 1
Names[f] = debug.getinfo(2, "Sn")
else
Counters[f] = Counters[f] + 1
end
end
local f = assert(loadfile(arg[1]))
debug.sethook(hook, "c")
f()
debug.sethook()
function getname(func)
local n = Names[func]
if n.what == "C" then
return n.name
end
local lc = string.format("[%s]:%s", n.short_src, n.linedefined)
if n.namewhat ~= "" then
return string.format("%s (%s)", lc, n.name)
else
return lc
end
end
for func, count in pairs(Counters) do
print(getname(func), count)
end
別途test.luaなど
function abc()
return 3
end
abc()
abc()
abc()
abc()