Lua调试函数 debug.getinfo() namewhat详解
Lua调试的时候会用到debug.getinfo()函数,what
的值文档给了解释:
- "Lua" : Lua function
- "C" : C function
- "main" : main part of a chunk (通过load函数等执行的语句)
关于namewhat
的值到底表示什么,官方文档只是简单列举(不全)。
列举一些常见情况
local getinfo = debug.getinfo
local format = string.format
local hook = function(event, line)
local t = getinfo(2, "nS")
local msg = format("[%s:%s] %s (%s:%s)", t.what, t.namewhat, t.name, t.source, t.linedefined)
print(msg)
end
debug.sethook(hook, "c")
local M = {}
print(123)
-- [C:global] print (=[C]:-1)
local _print = print
_print(123)
-- [C:local] _print (=[C]:-1)
function M.Func1(a)
end
function M:Func2(a)
end
M.Func1()
-- [Lua:field] Func1 (@.\test.lua:19)
M.Func2()
-- [Lua:field] Func2 (@.\test.lua:22)
M:Func2()
-- [Lua:method] Func2 (@.\test.lua:22)
local list = {1, 2, 3}
for i in pairs(list) do
local a = 0
end
--[[
[C:global] pairs (=[C]:-1)
[C:for iterator] for iterator (=[C]:-1)
[C:for iterator] for iterator (=[C]:-1)
[C:for iterator] for iterator (=[C]:-1)
]]
local t = { a = 1 }
setmetatable(t, {
__index = function(t, k)
end
})
local a = t.a
local b = t.b
-- [Lua:metamethod] index (@.\test.lua:46)
function GlobalFunc1()
end
function GlobalFunc2()
return GlobalFunc1()
end
GlobalFunc2()
--[[
[Lua:global] GlobalFunc2 (@.\test.lua:56)
[Lua:] nil (@.\test.lua:53)
--]]
function M.Func3()
local a = 1
local closure_func = function()
a = a + 1
end
closure_func()
return a
end
M.Func3()
--[[
[Lua:field] Func3 (@.\test.lua:66)
[Lua:local] closure_func (@.\test.lua:68)
]]
function M.Func4(f)
f()
end
M.Func4(function() end)
--[[
[Lua:field] Func4 (@.\test.lua:82)
[Lua:local] func (@.\test.lua:86)
]]
local FileFunc1
local FileFunc2
FileFunc1 = function()
end
FileFunc2 = function()
FileFunc1()
end
FileFunc2()
--[[
[Lua:local] FileFunc2 (@.\test.lua:98)
[Lua:upvalue] FileFunc1 (@.\test.lua:95)
]]
FileFunc3() = function()
end
local FileFunc4() = function()
FileFunc3()
end
FileFunc4()
--[[
[Lua:local] FileFunc4 (@.\test.lua:111)
[Lua:global] FileFunc3 (@.\test.lua:108)
]]
load("return 1")()
--[[
[C:global] load (=[C]:-1)
[main:] nil (return 1:0)
]]
local obj = setmetatable({}, {__index = { Func1 = function() end } })
obj:Func1()
--[[
[C:global] setmetatable (=[C]:-1)
[Lua:method] Func1 (@.\test.lua:127)
]]
具体含义归纳总结
- "": 通过load()等函数执行的代码块
- "for iterator": 迭代器
- "metamethod": meta方法
- "field": 通过
M.FuncName()
形式调用的函数 - "method": 通过
M:FuncName()
形式调用的函数 - "global": 调用global值
- "local": 调用local值
- "upvalue": 调用upvalue值
应用
""正常来说是没太大意义的,load()执行的语句一般只有调试会用,不需要对调试代码本身进行分析
"global"可用于查找没有写类似local print = print
的文件
"local"可用于查找闭包函数 (还需要加更多判断,来和直接写在文件内的调用进行区分,但如果根据短期内调用频率进行统计的话,直接判断"local"就足够了)