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. 【贪心】AGC018C Coins

    Problem Link 现在有 \(X+Y+Z\) 个人,第 \(i\) 个人有三个权值 \(a_i,b_i,c_i\),现在要求依次选出 \(X\) 个人,\(Y\) 个人和 \(Z\) 个人(一 ...

  2. 模块化Common.js与ES6

    为什么要模块化开发 1. 依赖关系(a文件依赖b文件中的方法,b文件必须在a文件之前引入) 2. 命名问题 (多个文件变量名,方法名相同会出现覆盖) 3. 代码组织(后期不好维护) 模块化规范有 1. ...

  3. vscode中快速声明数据类型

    如何快速声明数据类型 上面这张图 let obj1= reactive({ listArr: [], backArr: [{name:'张三',age:10, info:'本科'}], age: 10 ...

  4. 一个神奇的golang技巧:扩大heap内存来降低gc频率

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 具体的文章请看:https://web.archive.org/web/ ...

  5. 从零开始配置vim(21)——会话管理

    很多代码编辑器都有这么一个功能,重新进入编辑器之后能恢复上次打开的所有文件,窗口布局,有的甚至是上次设置的一些配置.那么vim是否也可以实现这样的功能呢?答案是肯定的.使用vim自带的会话管理和 vi ...

  6. 6.1 C/C++ 封装字符串操作

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  7. 3.4 DLL注入:全局消息钩子注入

    SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保 ...

  8. docker中的mysql时区修改

    永久修改 进入容器 docker exec -it mysql5.7 bash 查看当前时区 date -R 修改时区 cp /usr/share/zoneinfo/PRC /etc/localtim ...

  9. vue下载本地文件 下载二进制流文件 兼容ie

    vue-cli2要下载的静态文件放在static目录下,vue-cli3则放在public目录下 ie不支持 h5 的download写法,故用以下写法 <el-button type=&quo ...

  10. curl接口调用

    CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 CURL 库.使用PHP的CURL 库可以简单和有效地去抓网页.你只 ...