首页 > 其他分享 >Lua调试函数 debug.getinfo() namewhat详解

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

时间:2024-02-28 11:47:10浏览次数:23  
标签:function end getinfo -- lua namewhat Lua local

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

标签:function,end,getinfo,--,lua,namewhat,Lua,local
From: https://www.cnblogs.com/lunoctis/p/18039838

相关文章

  • Redis加Lua脚本实现分布式锁
    先讲一下为什么使用分布式锁:在传统的单体应用中,我们可以使用Java并发处理相关的API(如ReentrantLock或synchronized)来实现对共享资源的互斥控制,确保在高并发情况下同一时间只有一个线程能够执行特定方法。然而,随着业务的发展,单体应用逐渐演化为分布式系统,多线程、多进程分布在不同......
  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......
  • Unity xLua开发环境搭建与基础进阶
    Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建UnityxLua开发环境,并进行基础进阶的学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正......
  • 使用clion给xlua增加第三方lua库
    以xlua的文件中的rapidjson为例1,把头文件放在lua-rapidjson/include下,源码文件放在lua-rapidjson/source下,然后再CMakeList.txt中添加下图所示的内容 2,加载CMakeList.txt可能会遇到下面的错误原因是:需要使用vs作为编译器,而不是gnu的编译器把VisualStudio移到第1个,设......
  • lua集成cjson
    1,准备编译好的lua 2,lua加到环境变量Path下 3,下载openresty维护的cjson源码GitHub-openresty/lua-cjson:LuaCJSONisafastJSONencoding/parsingmoduleforLua 4,在cjson的CMakeList.txt加一行路径为lua源码的头文件所在文件夹 5,用MinGW编译......
  • cmake编译lua
    lua5.1.5源码 创建一个CMakeList.txt文件cmake_minimum_required(VERSION3.10.0)set(Proj_Name"mylua")project(${Proj_Name})#使用的语言标准是C89/ANSICset(CMAKE_C_STANDARD90)#头文件搜索目录include_directories("src")#源码文件aux_source_direct......
  • Lua学习笔记之迭代器、table、模块和包、元表和协程
    迭代器迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素。泛型for迭代器泛型for自己内部保存迭代函数,实际上保存三个值:迭代函数、状态常量、控制变量。泛型......
  • UVA12422 (Kengdie) Mua (II) - Expression Evaluator 题解
    题目传送门闲话蒟蒻的第一篇黑题题解!连着花了\(12\)个小时才做出来,打代码\(6\)小时,调试\(6\)小时。一开始怎么编也编不过,直到看到了tiger大神的题解才豁然开朗。思路本题主要是输出函数或运算式子的结果,最重要的就是判断优先级。tiger大神提出了表达式树法和递归......
  • lua小小实战的资料
    Lua实现JSON解析器http://www.manongjc.com/detail/25-ozepzazdsivhrxe.htmlhttps://blog.51cto.com/u_15072927/3936779游戏中的排行榜Lua设计(简单实现,线段树,跳表)https://codeleading.com/article/15992061562/LuaJSON解析与序列化https://blog.csdn.net/wx771720/art......
  • Unity xLua开发环境搭建与基础进阶
    Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建UnityxLua开发环境,并进行基础进阶的学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正......