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

Lua调试函数 debug.getinfo() namewhat详解的更多相关文章

  1. 【转】 C# DEBUG 调试信息打印及输出详解

    [转] C# DEBUG 调试信息打印及输出详解 1.debug只在[debug模式下才执行](运行按钮后面的下拉框可选) 2.debug提供了许多调试指令,如断言          System.D ...

  2. JavaScript调试技巧之console.log()详解

    JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...

  3. PHP函数call_user_func和call_user_func_array详解

    今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...

  4. JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function

    html +css 静态页面 js     动态 交互   原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...

  5. WordPress函数:get_bloginfo()用法详解

    描述 返回你博客的信息,这些信息可以用在任何地方的 PHP 代码中.这个函数,和 bloginfo() 一样,可以用来在模板文件的任何地方显示你博客的信息. 用法 <?php $bloginfo ...

  6. Wordpress菜单函数wp_nav_menu各参数详解及示例

    Wordpress菜单函数wp_nav_menu各参数详解及示例   注册菜单 首先要注册菜单,将以下函数添加至function.php函数里   register_nav_menus(array( ...

  7. 如何利用IIS调试ASP.NET网站程序详解

    如何利用IIS调试ASP.NET网站程序详解 更新时间:2019年01月13日 08:44:13   作者:江湖逍遥    我要评论   这篇文章主要给大家介绍了关于如何利用IIS调试ASP.NET网 ...

  8. Delphi Format函数功能及用法详解

    DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...

  9. Linux C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...

  10. Javascript的调试利器:Firebug使用详解

    转载自:http://blog.csdn.net/tianxiaode/archive/2007/09/02/1769152.aspx   一直在用firebug,可是没有这么精通,今天看到本文章觉得 ...

随机推荐

  1. Docker 部署 Ceph的简单方法

    https://zhuanlan.zhihu.com/p/390377674 学习一下. docker部署 部署的思路和网络架构和前面分布式是一样的,区别在于命令的形式. 在每个节点安装 docker ...

  2. [译]深入了解现代web浏览器(二)

    本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part2/ 翻译而来,共有四篇,该篇 ...

  3. TS声明promise返回来的数据类型

    promise返回来的数据类型 interface backResult{ code: number, data: { name:string,age:number}[], //数组里面的对象类型,这 ...

  4. golang: 模仿 VictoriaMetrics 中的做法,通过把局部变量放在自定义 Context 对象中来做到hot path 的 0 alloc

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 使用 benchmark 压测过程中通常会出现这样的信息: ...

  5. HUBUCTF 2022新生赛Writeup

    既然是母校,那一定要好好对待~    2024-01-13 22:42:34 WEB  [HUBUCTF 2022 新生赛]checkin 题目链接:checkin 原题 <?php show_ ...

  6. ABP .net Core 将日志打印在控制台

    上效果图 来看一下操作流程: 一.分为.net Core 2.2 和 .net Core 3.0及以上 (一)..net Core 2.2 1.在 EntityFrameworkCore中安装Nuge ...

  7. win10下MySQL安装教程(MySql-8.0.26超级详细)

    一.下载安装包: 官网链接:MySQL :: Developer Zone 依次点击步骤如下: 二.MySQL文件配置 解压安装包: 解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目 ...

  8. 一些提供办公效率的软件(clover、f.lux、幕布),老赞了!

    1.clover 链接:http://cn.ejie.me/ Clover是由异次元的读者ejie团队开发的一款电脑窗口标签化工具.Clover是电脑中资源管理器的一个扩展程序,可以为其增加多标签页的 ...

  9. 遥感图像处理笔记之【U-Net for Semantic Segmentation on Unbalanced Aerial Imagery】

    遥感图像处理学习(5) 前言 遥感系列第5篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月15日 2024年1月24日搬运至本人博客园平台 文章标题:U-Net for Se ...

  10. VB6的OfficeMenu控件 - 开源研究系列文章

    这次将原来VB6中喜欢和使用到的OfficeMenu的控件做一个使用介绍. 上次介绍了VB6中的控件引擎,但是那个只针对基本的控件,这个OfficeMenu控件在当时是收费的,笔者找度娘好不容易才下载 ...