前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lua 5.3 的调试库

Lua 5.3 的调试库

作者头像
bering
发布2020-02-14 17:40:59
2K0
发布2020-02-14 17:40:59
举报
文章被收录于专栏:游戏开发之旅

debug.traceback([thread,] [message [, level]]

如果 message 有,且不是字符串或 nil, 函数不做任何处理直接返回 message。 否则,它返回调用栈的栈回溯信息。 字符串可选项 message 被添加在栈回溯信息的开头。 数字可选项 level 指明从栈的哪一层开始回溯 (默认为 1 ,即调用 traceback 的那里)。 通俗点讲就是,打印从当前debug.traceback调用的位置(如果有message则先打印message),到最终调用debug.traceback的位置,比如说:debug.traceback存在于函数test1中,函数test2中调用了test1,则debug.traceback会输出debug.traceback以及test1,test2所在的行数和函数名称

[[ debug.getinfo([thread,] f [, what])

参数解释:

(1)level:函数调用的层级,表示要输出哪个函数的信息。

(0:getinfo自身,1:调用getinfo的函数f1,2:调用f1的函数f2,…以此类推。f1, f2, …也可能不是函数,而是在文件中直接调用getinfo)

(2)arg:该参数是一个字符串,其中每个字符代表一组字段,用于指定希望获取哪些信息,可为 “n”,“S”,“l”,“u”,“f”,“L” 中的一个或他们的组合

返回一个"table",其中包含线程"thread"中的函数"f"由"what"指定的相关信息。 “thread"默认为当前线程。“f"可以是函数名,也可以是一个数值,如果是数值则代表该函数的栈级别。 如果通过名字指定的函数不存在,则报错;如果通过数值指定的函数不存在,则返回"nil”。 如果"what"不指定,默认情况下返回除合法行号表外的所有域: source: 创建这个函数的"chunk"的名字。 如果"source"以’@‘打头,表示这个函数定义在一个文件中,而’@‘之后的部分就是文件名。 若"source"以’='打头,表示之后的部分由用户行为来决定如何表示源码。 其它的情况下,这个函数定义在一个字符串中,而"source"正是那个字符串。 short_src: 一个“可打印版本”的"source”,用于出错信息。 linedefined: 函数定义开始处的行号。 lastlinedefined: 函数定义结束处的行号。 what: 如果函数是一个Lua函数,则为一个字符串"Lua"; 如果是一个C函数,则为"C"; 如果是一个"chunk"的主体部分,则为"main"。 currentline: 给定函数正在执行的那一行。当提供不了行号信息的时候,“currentline"被设为-1。 name: 给定函数的一个合理的名字。 因为Lua中的函数是"first-class values”,所以它们没有固定的名字。 一些函数可能是全局复合变量的值,另一些可能仅仅只是被保存在一个"table"的某个域中。 Lua会检查函数是怎样被调用的,以此来找到一个适合的名字。 如果它找不到名字,该域就被设置为"NULL"。 namewhat: 用于解释"name"域。 其值可以是"global",“local”,“method”,“field”,“upvalue”,或是"", 这取决于函数怎样被调用。(Lua用空串表示其它选项都不符合) istailcall: 如果函数以尾调用形式调用,这个值为"true"。在这种情况下,当前栈级别的调用者不在栈中。 nups: 函数的"upvalue"个数。 nparams: 函数固定形参个数(对于C函数永远是0)。 isvararg: 如果函数是一个可变参数函数则为"true"(对于C函数永远为"true")。 func: 函数本身。 activelines: 合法行号表。 表中的整数索引用于描述函数中哪些行是有效行。 有效行指有实际代码的行,即你可以置入断点的行。无效行包括空行和只有注释的行。 “what"可以指定如下参数,以指定返回值"table"中包含上面所有域中的哪些域: ‘n’: 包含"name"和"namewhat"域; ‘S’: 包含"source”,“short_src”,“linedefined”,“lastlinedefined"以及"what"域; ‘l’: 包含"currentline"域; ‘t’: 包含"istailcall"域; ‘u’: 包含"nup”,"nparams"以及"isvararg"域; ‘f’: 包含"func"域; ‘L’: 包含"activelines"域;]]

尽可能只在调试过程中使用调试库中的函数。首先,库中一些函数的性能并不卓越。其次,它打破了Lua语言中一些基本的规则,比如函数中定义的局部变量无法在其外部被访问。最后,你一定不希望在你的最终产品中见到它的身影,所以你可以使用,debug = nil来剔除调试库,同时减少最终产品的大小。 ———————————————— 参考链接:https://blog.csdn.net/vermilliontear/article/details/50851045 https://www.runoob.com/lua/lua-debug.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • debug.traceback([thread,] [message [, level]]
  • [[ debug.getinfo([thread,] f [, what])
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档