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)。 |
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 endmyfunction () print(debug.getinfo(1))
当运行上面的程序时,将获得如下所示的堆栈跟踪。
Stack trace stack traceback:test2.lua:2: in function myfunctiontest2.lua:8: in main chunk[C]: ? table: 0054C6C8 Stack trace end
在上述示例程序中,使用调试库中可用的debug.trace函数打印堆栈跟踪。 debug.getinfo获取函数的当前表。
无涯教程经常需要知道函数的局部变量以进行调试。为此,可以使用getupvalue并使用setupvalue来设置这些局部变量。
function newCounter ()local n = 0local k = 0return function ()k = nn = n + 1return nendendcounter = newCounter ()print(counter()) print(counter())local i = 1repeatname, val = debug.getupvalue(counter, i)if name thenprint ("index", i, name, "=", val)if(name == "n") thendebug.setupvalue (counter,2,10)endi = i + 1end -- ifuntil not nameprint(counter())
当运行上面的程序时,将得到以下输出。
1 2 index 1 k = 1 index 2 n = 2 11
在此示例中,计数器在每次调用时都会更新1。无涯教程可以使用getupvalue函数查看局部变量的当前状态。然后,将局部变量设置为新值。在此,在调用设置操作之前,n为2。使用setupvalue函数,它将更新为10。现在,当调用counter函数时,它将返回11而不是3。
Lua - 调试语句 - 无涯教程网无涯教程网提供Lua提供了一个调试库,该库提供了所有原始函数供无涯教程创建自己的调试器。即使没有...https://www.learnfk.com/lua/lua-debugging.html