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

相关推荐
背书包的甜瓜14 小时前
Python Excel转lua配置工具
lua
minglie118 小时前
esp32集成lua
lua
番茄炒鸡蛋加糖2 天前
Redis--Lua 脚本原子性与滑动窗口限流
数据库·redis·lua
星空露珠3 天前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
吴声子夜歌11 天前
Redis 3.x——事务与Lua
redis·lua
豆瓣鸡13 天前
Redis Lua 脚本——把多条命令打包成一个原子操作
java·redis·lua
橙色阳光五月天15 天前
MATLAB函数如何打包成独立EXE
开发语言·matlab·lua
耀耀_很无聊18 天前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua
章老师说19 天前
NGINX官方谈Lua风险:这其实是两条网关技术路线之争
运维·nginx·负载均衡·lua·openresty
会周易的程序员20 天前
使用 LuaBridge 封装 C++ 日志库 microLog 为 Lua 模块
c++·物联网·junit·lua·日志·iot·aiot