Lua调试函数 debug.getinfo() namewhat详解
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详解的更多相关文章
- 【转】 C# DEBUG 调试信息打印及输出详解
[转] C# DEBUG 调试信息打印及输出详解 1.debug只在[debug模式下才执行](运行按钮后面的下拉框可选) 2.debug提供了许多调试指令,如断言 System.D ...
- JavaScript调试技巧之console.log()详解
JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...
- PHP函数call_user_func和call_user_func_array详解
今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...
- JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function
html +css 静态页面 js 动态 交互 原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...
- WordPress函数:get_bloginfo()用法详解
描述 返回你博客的信息,这些信息可以用在任何地方的 PHP 代码中.这个函数,和 bloginfo() 一样,可以用来在模板文件的任何地方显示你博客的信息. 用法 <?php $bloginfo ...
- Wordpress菜单函数wp_nav_menu各参数详解及示例
Wordpress菜单函数wp_nav_menu各参数详解及示例 注册菜单 首先要注册菜单,将以下函数添加至function.php函数里 register_nav_menus(array( ...
- 如何利用IIS调试ASP.NET网站程序详解
如何利用IIS调试ASP.NET网站程序详解 更新时间:2019年01月13日 08:44:13 作者:江湖逍遥 我要评论 这篇文章主要给大家介绍了关于如何利用IIS调试ASP.NET网 ...
- Delphi Format函数功能及用法详解
DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...
- Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- Javascript的调试利器:Firebug使用详解
转载自:http://blog.csdn.net/tianxiaode/archive/2007/09/02/1769152.aspx 一直在用firebug,可是没有这么精通,今天看到本文章觉得 ...
随机推荐
- 基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理
一.前言 两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题.具体而言,他在使用CefSharp WPF版本时遇到了一个问题,即输入法突然出现在屏幕的左上角.在这里记录下处理这个问题的过程,希望 ...
- echarts饼状图自定义legend的样式付费
先看效果图 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 手写promise完成异常处理和状态只能够修改一次
8.处理 Promise 抛出的异常 <script src="./Promise.js"></script> <script type=" ...
- 【解决了一个小问题】alert manager要怎么样才能触发告警到企业微信上?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 07-15:花了几个小时仍然是没走通这个流程,把中间结果记 ...
- ABP 使用Except 和EqualityHelper<T> 实现去重
先上一端代码!!! railwayCar中有10条记录,train参考railwayCar创建了5条记录.要实现,当train再次参考railwayCar创建记录时,使用过的记录在展示列表时不可以再次 ...
- C/C++ 实现FTP文件上传下载
FTP(文件传输协议)是一种用于在网络上传输文件的标准协议.它属于因特网标准化的协议族之一,为文件的上传.下载和文件管理提供了一种标准化的方法,在Windows系统中操作FTP上传下载可以使用WinI ...
- npm旧淘宝镜像过期,更换新淘宝镜像
1. 清空缓存 npm cache clean --force 2.设置新淘宝镜像 npm config set registry https://registry.npmmirror.com/ 3. ...
- 自定义RecyclerView下拉刷新上拉加载更多
自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多
- 教你轻松用上ChatGPT
最近ChatGPT大火呀,小伙伴们是不是在网上看到各种和ChatGPT有趣聊天的截图,奈何自己实力不够,被网络拒之门外,只能眼馋别人的东西.看别人玩,肯定不如自己玩一把舒服的啊.今天小卷就给大家汇总了 ...
- ABC 314
F 每次相当于创建一个包含 \(p_i,q_i\) 各自所在集合的点的大点 \(u\),然后 \(u\) 向 \(p_i,q_i\) 各自所在集合连边,边权就是胜率. 连完之后求每个点到根结点(\(\ ...