Lua - 调试语句

Lua - 调试语句 首页 / Lua入门教程 / Lua - 调试语句

Lua提供了一个调试库,该库提供了所有原始函数供无涯教程创建自己的调试器。即使没有内置的Lua调试器,也有许多针对Lua的调试器,这些调试器由各种开发人员创建,其中许多开源。

下表列出了Lua调试库中可用的函数及其用法。

Sr.No.Method & Purpose
1

debug()

进入交互式模式进行调试,该模式将保持活动状态,直到仅在一行中连续输入内容并按回车键为止。

2

getfenv(object)

返回对象的环境。

3

gethook(optional thread)

以三个值返回线程的当前挂钩设置-当前挂钩函数,当前挂钩掩码和当前挂钩计数。

4

getinfo(optional thread,function或stack level,optional flag)

返回包含有关函数信息的表。您可以直接给函数,也可以给数字作为函数的值,这意味着该函数在给定线程的调用堆栈的level函数上运行-level 0是当前函数(getinfo本身); 1级是调用getinfo的函数;如果function的数量大于活动函数的数量,则getinfo返回nil。

5

getlocal(optional thread,stack level,local index)

返回在堆栈级别具有函数索引local的局部变量的名称和值。如果没有给定索引的局部变量,则返回nil,并且在超出范围的级别调用时会引发错误。

6

getmetatable(value)

返回给定对象的元表;如果没有元表,则返回nil。

7

getregistry()

返回注册表表,这是一个预定义的表,任何C代码都可以使用该表来存储需要存储的Lua值。

8

getupvalue(function,upvalue index)

此函数返回带有func函数的索引的upvalue的名称和值。如果给定索引没有升值,则该函数返回nil。

9

setfenv(function or  thread or userdata,environment table)

将给定对象的环境设置为给定表。返回对象。

10

sethook(optional thread,hook function,hook  mask string with "c" and/or "r" and/or "I" optional instruction count)

将给定函数设置为钩子。字符串掩码和数字计数描述何时调用该挂钩。在这里,每次Lua调用,返回并输入函数中的每一行代码时,都会分别调用c,r和l。

11

setlocal(optional thread,stack level,local index,value)

将值分配给在堆栈级别具有函数索引local的局部变量。如果没有给定索引的局部变量,该函数将返回nil,并且在级别超出范围的情况下调用时会引发错误。否则,它将返回局部变量的名称。

无涯教程网

12

setmetatable(value,metatable)

将给定对象的元表设置为给定表(可以为nil)。

链接:https://www.learnfk.comhttps://www.learnfk.com/lua/lua-debugging.html

来源:LearnFk无涯教程网

13

setupvalue(function,upvalue index,value)

此函数使用函数func的上索引将值分配给upvalue。如果给定索引没有升值,则该函数返回nil。否则,它返回升值的名称。

14

traceback(optional thread,optional message string,optional level argument)

构建带有追溯的扩展错误消息。

上面的列表是Lua中调试函数的完整列表,无涯教程经常使用一个库,该库使用上面的函数,并且调试起来更容易。

function myfunction ()
   print(debug.traceback("Stack trace"))
   print(debug.getinfo(1))
   print("Stack trace end")

   return 10
end

myfunction ()
print(debug.getinfo(1))

当运行上面的程序时,将获得如下所示的堆栈跟踪。

Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

在上述示例程序中,使用调试库中可用的debug.trace函数打印堆栈跟踪。 debug.getinfo获取函数的当前表。

无涯教程经常需要知道函数的局部变量以进行调试。为此,可以使用getupvalue并使用setupvalue来设置这些局部变量。

function newCounter ()
   local n = 0
   local k = 0
	
   return function ()
      k = n
      n = n + 1
      return n
   end
	
end

counter = newCounter ()

print(counter())
print(counter())

local i = 1

repeat
   name, val = debug.getupvalue(counter, i)
	
   if name then
      print ("index", i, name, "=", val)
		
      if(name == "n") then
         debug.setupvalue (counter,2,10)
      end
		
      i = i + 1
   end -- if
	
until not name

print(counter())

当运行上面的程序时,将得到以下输出。

1
2
index	1	k	=	1
index	2	n	=	2
11

在此示例中,计数器在每次调用时都会更新1。无涯教程可以使用getupvalue函数查看局部变量的当前状态。然后,将局部变量设置为新值。在此,在调用设置操作之前,n为2。使用setupvalue函数,它将更新为10。现在,当调用counter函数时,它将返回11而不是3。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

分布式协议与算法实战 -〔韩健〕

深入浅出云计算 -〔何恺铎〕

如何看懂一幅画 -〔罗桂霞〕

人人都用得上的写作课 -〔涵柏〕

PyTorch深度学习实战 -〔方远〕

全链路压测实战30讲 -〔高楼〕

快手 · 音视频技术入门课 -〔刘歧〕

零基础学Python(2023版) -〔尹会生〕

Dubbo源码剖析与实战 -〔何辉〕

好记忆不如烂笔头。留下您的足迹吧 :)