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. CentOS创建vsftp进行读写操作的简单方法

    1. 安装vsftpd yum install epel-release yum install vsftpd 2. 进入系统设置简单进行处理 注意 user_list 是不允许访问的列表. [roo ...

  2. 一个Redis dump文件的简要分析过程

    摘要 遇到一个老大难的问题. 让帮忙分析一下一个Redis的dump文件. 虽然之前写过了rdb和rdr的文档 但是感觉大家都喜欢拿来主义. 没办法. 今天继续进行深入一点的分析. 原理其实还是基于r ...

  3. 根目录被赋予777 -R权限后的处理过程

    解决某研发手残导致的系统宕机问题的处理过程 背景 2022.8.8 公司一台服务器出现了宕机的现象: 所有的人都无法远程, 都提示密码错误. 但是网络还是通的. 2022.8.12 出差前一天去了一趟 ...

  4. NOI Linux 下 Geany 配置教程

    没有括号补全? 现在有自动括号补全了! 红色的 a.cpp 的意思是 a.cpp 没有保存. 现在来设置编译运行的快捷键. 不难推测 "%e" 是可执行文件的意思,"%f ...

  5. vue3.2新增指令v-memo的使用

    v-memo的讲解 vue3.2中新增了一个性能优化的指令: 这个指令就是v-memo; v-memo:可以做性能优化,v-memo中值若不发生变化,整个子树的更新会被跳过. <div v-me ...

  6. devDependencies和dependencies有何区别

    01==>devDependencies用于本地环境开发时候所需要的依赖包. 上线后就不在需要了: npm i webpack-cli -D --save-dev等价为-D 意思是安装到开发环境 ...

  7. gpedit.msc 打不开

    win10系统推出已有不短的时间了,朋友们也纷纷升级了win10系统,但是暴露的问题也是越来越多,比如win10系统打开运行输入gpedit.msc命令时却提示找不到文件.那出现win10打不开gpe ...

  8. 6.7 Windows驱动开发:内核枚举LoadImage映像回调

    在笔者之前的文章<内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个LoadI ...

  9. powerDesigner 逆向工程 mysql 生成 PDM

     1. 信息补充说明 powerDesigner  16.5 mysql 5.6 主要内容:使用powerDesigner的逆向工程,将mysql中的数据库转换成PDM文件 所需资源: powerDe ...

  10. Windows 7 Ultimate with Service Pack 1 (x64)

    Windows 7 Ultimate with Service Pack 1 (x64) 链接:https://pan.baidu.com/s/1ZHODDFlJPLQ3ydxZ4rfc3g 提取码: ...