Lua调试函数 debug.getinfo() namewhat详解

Lua调试的时候会用到debug.getinfo()函数,what的值文档给了解释:

  • "Lua" : Lua function
  • "C" : C function
  • "main" : main part of a chunk (通过load函数等执行的语句)

关于namewhat的值到底表示什么,官方文档只是简单列举(不全)。

列举一些常见情况

lua 复制代码
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"就足够了)

相关推荐
玩转C语言和数据结构2 天前
Lua下载和安装教程(附安装包)
lua·lua下载·lua安装教程·lua下载和安装教程·lua安装包
Arva .3 天前
HTTP Client
网络协议·http·lua
爱吃小胖橘3 天前
Lua语法(2)
开发语言·unity·lua
ellis19704 天前
LuaC API知识点汇总
unity·lua
爱吃小胖橘7 天前
Lua语法
开发语言·unity·lua
东方芷兰7 天前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
1nullptr8 天前
Lua上值与闭包
开发语言·lua
半夏知半秋9 天前
skynet-socket.lua源码分析
服务器·开发语言·学习·架构·lua
夜猫逐梦12 天前
【lua】luajit 命令行使用指南
开发语言·lua
利来利往12 天前
【奇怪的bug】lua的nil不报错
开发语言·bug·lua