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 sourcelinedefinedlastlinedefinedwhat, 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详解的更多相关文章

  1. adb调试命令详解-2016.02.01

    adb(Android Debug Bridge),调试桥可以让设备的调试监测过程在远端进行,而不必在运行实际运行应用的设备上,方便调试的输出. 1 命令详解 a 查看帮助信息         adb ...

  2. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  3. IntelliJ IDEA 2020.1.1 x64 Debug 断点调试模式详解

    前言 对于初入职场的萌新们来说,很多都还不会 Debug 断点模式.记得我刚写代码的时候,也是通过 System.out.println() 一行一行的把变量打印出来看.其实强大的编辑器已经帮我们做好 ...

  4. Windbg调试命令详解

    作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...

  5. Windbg调试命令详解(1)

    转载注明>> [作者:张佩][镜像:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是 ...

  6. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  7. Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  8. Lua IO库详解

    I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. 当使 ...

  9. Windbg调试命令详解(3)

    3 进程与线程 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1 进程命令 进程命令包括这些内容:显示进程 ...

随机推荐

  1. JAVA基础知识(2)--关键字final的使用

    /***Final关键字的使用*@author lihaiming*Email:912547587@qq.com*关键字Final可以修饰属性,方法,类*修饰属性的时候,final修饰的变量是一个常量 ...

  2. 使sublimetext3在ubuntu下可以打中文和在windows的dos命令行下正常显示中文

    学习闲暇之余,总结一下在windows和ubuntu下使用sublimetext3遇到的问题 一.关于sublimetext3在windows的dos命令行下不能编译运行中文的解决方案: 因为dos命 ...

  3. git使用教程及github远程仓库管理

    git使用教程步骤 1.安装git 安装完后,在开始菜单里找到"git"->"Git Bash",蹦出一个类似命令行窗口,说明安装成功.2 注册git 在 ...

  4. ECMAScript6-解构

    ▓▓▓▓▓▓ 大致介绍 解构:就是将声明的一组变量和与相同结构的数组或者对象的元素数值一一对应,并将变量相对应元素进行赋值 ▓▓▓▓▓▓ 数组解构 例子: let [a,b,c] = [1,2,3]; ...

  5. 自动化利器-Zabbix

    1.1为何需要监控系统 在一个IT环境中会存在各种各样的设备,例如:硬件设备.软件设备.其系统的构成也是非常复杂的. 多种应用构成负载的IT业务系统,保证这些资源的正常运转,是一个公司IT部门的职责. ...

  6. Access中的自定义排序设置方式

    一.问题起因 最近有网友提问说,Access中在用查询指定排序方式时,为什么只有升序跟降序,怎么米有自定义排序了?竟然比Excel都弱啊! 其实这是对Access的误解,我这就给大家来解一下疑惑.案例 ...

  7. 老李分享:走读unittest源码

    老李分享:走读unittest源码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开发工程师就业培训感兴趣 ...

  8. AngularJS1.X学习笔记1-整体看看

    听说 明天是愚人节,这与我有什么关系呢!我可 不想被愚弄,但是但是,我这么笨怎么才能不被愚弄呢?左思右想,我决定从现在开始闭关,闭关干啥哩?学习!学习AngularJS.以前学习过Angular的,不 ...

  9. linux之shell编程基本语法

    Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell.Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的s ...

  10. Android 调出和隐藏软键盘

    1.弹出软键盘 public static void showSoftInputMode(Context context,View windowToken) { final InputMethodMa ...