lua调试函数 debug.getinfo() namewhat详解-kb88凯时官网登录

来自:
时间:2024-02-28
阅读:
免费资源网,https://freexyz.cn/

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"就足够了)

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图