Lua调试:getinfo详解
getinfo是调试Lua程序时一个很重要很常见的函数,主要用于获取函数调用的基本信息。这个函数的难点在于各个参数的含义。下面一一介绍。
一、函数简介:
1.原型:getinfo(level, arg)
2.调用:debug.getinfo(level, arg)
3.返回值:返回一个包含函数信息的table,table的内容由参数arg决定,包含哪个函数的信息由level决定.
4.参数解释:
(1)level:函数调用的层级,表示要输出哪个函数的信息。
(0:getinfo自身,1:调用getinfo的函数f1,2:调用f1的函数f2,...以此类推。f1, f2, ...也可能不是函数,而是在文件中直接调用getinfo)
(2)arg:该参数是一个字符串,其中每个字符代表一组字段,用于指定希望获取哪些信息,可为 "n","S","l","u","f","L" 中的一个或他们的组合
【注意区分大小写】
<英文看不懂没关系,我简单解释下,加黑的表示返回的table包含的内容,即函数信息>
'n': fills in the field name and namewhat;
'S': fills in the fields source, linedefined, lastlinedefined, what, and short_src;(source)
'l': fills in the field currentline;
'u': fills in the field nups;
'f': pushes onto the stack the function that is running at the given level; ->func
'L': pushes onto the stack a table whose indices are the numbers of the lines that are valid on the function. (A valid line is a line with some associated code, that is, a line where you can put a break point. Non-valid lines include empty lines and comments.) ->activelines
name:函数名, namewhat:函数类型(field, upvalue, global),what:函数类型(Lua, C, main),
short_src, source:函数所属的文件名, linedefined, lastlinedefined:函数定义的起始和结束行号,
currentline:上级(level - 1)函数被调用的行号,nups: 函数的upvalue值的个数,
func:函数本身, activelines:一个包含行号的table,可理解为该函数运行的代码的行号
(如果还不是很明白,可以看下面的示例,也可以自己运行一下代码)
二、示例
假设一个文件luatest.lua包含如下代码:
local args = {"n","S","l","u","f","L"}
local function f1()
for level =0,3 do --不同级别
print("level================", level)
for k, v in ipairs(args) do --不同参数
print("arg======", v)
local fInfo = debug.getinfo(level, v)
for key, val in pairs(fInfo) do
print("key, val==", key, val)
end
end
end
end
local function f2()
print("f1=====", f1)
f1()
end
function main()
print("f2=====", f2)
f2()
end
print("main======", main)
main()
--========运行以上代码,结果如下(win7上测试的)======
main====== function: 0073D128
f2===== function: 0073D108
f1===== function: 0073D0E8
level================ 0
arg====== n
key, val== name getinfo
key, val== namewhat field
arg====== S
key, val== source =[C]
key, val== what C
key, val== lastlinedefined -1
key, val== linedefined -1
key, val== short_src [C]
arg====== l
key, val== currentline -1
arg====== u
key, val== nups 0
arg====== f
key, val== func function: 0073AF70
arg====== L
level================ 1
arg====== n
key, val== name f1
key, val== namewhat upvalue
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 13
key, val== linedefined 2
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 7
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D0E8
arg====== L
key, val== activelines table: 0073BC78
level================ 2
arg====== n
key, val== name f2
key, val== namewhat upvalue
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 18
key, val== linedefined 15
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 17
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D108
arg====== L
key, val== activelines table: 0073BDE0
level================ 3
arg====== n
key, val== name main
key, val== namewhat global
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 23
key, val== linedefined 20
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 22
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D128
arg====== L
key, val== activelines table: 0073EA78
--===============================
看完这个示例后,大家应该对getinfo有所了解了吧。
Lua调试:getinfo详解的更多相关文章
- adb调试命令详解-2016.02.01
adb(Android Debug Bridge),调试桥可以让设备的调试监测过程在远端进行,而不必在运行实际运行应用的设备上,方便调试的输出. 1 命令详解 a 查看帮助信息 adb ...
- Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...
- IntelliJ IDEA 2020.1.1 x64 Debug 断点调试模式详解
前言 对于初入职场的萌新们来说,很多都还不会 Debug 断点模式.记得我刚写代码的时候,也是通过 System.out.println() 一行一行的把变量打印出来看.其实强大的编辑器已经帮我们做好 ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- Windbg调试命令详解(1)
转载注明>> [作者:张佩][镜像:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是 ...
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- Lua IO库详解
I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. 当使 ...
- Windbg调试命令详解(3)
3 进程与线程 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1 进程命令 进程命令包括这些内容:显示进程 ...
随机推荐
- 浅析Content Negotation在Nancy的实现和使用
背景介绍 什么是Content Negotation呢?翻译成中文的话就是"内容协商".当然,如果不清楚HTTP规范(RFC 2616)的话,可以对这个翻译也是一头雾水. 先来看看 ...
- 用Java实现将多级文件夹下的所有文件统一放到一个文件夹中
每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了 ...
- MyBatis解决字段名与实体类属性名不相同的冲突(四)
一.创建表和表数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no ), order_price FLOA ...
- 配置uwsgi
首先要明确的是,如果你喜欢用命令行的方式(如shell)敲命令,那可以省去任何配置. 但是,绝大多数人,还是不愿意记那么长的命令,反复敲的.所以uwsgi里,就给大家提供了多种配置,省去你启动时候,需 ...
- Python 获取 网易云音乐热门评论
最近在研究文本挖掘相关的内容,所谓巧妇难为无米之炊,要想进行文本分析,首先得到有文本吧.获取文本的方式有很多,比如从网上下载现成的文本文档,或者通过第三方提供的API进行获取数据.但是有的时候我们想要 ...
- css2.1实现图片添加阴影效果
盒子里面放了img标签,盒子浮动后,盒子的背景图片(就是阴影图片)会应用图片的宽高. <!DOCTYPE html> <html lang="en"> &l ...
- PRINCE2考试一共多少道题
一.Foundation 基础级: 考试时长 1 个小时: 75 道单选题,其中 5 道随机测试题,无论对错都不计入考分:满分 70 分,获得 35 分才能通过考试,正确率 50%: 全程闭卷考试 二 ...
- Oracle函数整理
) from dual;--绝对值 ,) from dual;--取模,取余数 select ceil (12.1) from dual;--去上限值 select floor (12.1) from ...
- SpringMVC基础学习(三)—参数绑定
一.基本数据类型的绑定 页面 <form action="${pageContext.request.contextPath}/test.do" method="p ...
- Java ClassLoader加载机制
一.体系结构(自上向下) 1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般 ...