Lua 调试(Debug)
Lua 调试(Debug)
Lua 提供了 debug 库用于提供创建我们自定义调速器的功能。Lua 本身并未有内置的调速器,但很多开发者共享了他们的 Lua 调速器代码。
Lua 中 debug 库包含以下函数:
方法 | 描述 |
debug() | 进入调试的交互式模式,此模式将保持活动状态,直到我们只在一行中键入孔特,然后按enter键。用户可以使用其他函数在此模式下检查变量。 |
getfenv(object) | 返回对象的环境. |
gethook(optional thread) | 返回线程的当前钩子设置,作为三个值——当前的钩子函数、当前的钩子掩码和当前的钩子计数。 |
getinfo(optional thread, function or stack level, optional flag) | 返回一个关于函数的信息的表。可以直接给出函数,或者可以给出一个值作为函数的值,这意味着给定线程级0的调用堆栈的水平函数运行的函数是当前函数( getinfo本身) ;级别1是称为getinfo的函数;等等。如果函数是大于活动函数数的数字,则getinfo将返回零。 |
getlocal(optional thread, stack level, local index) | 返回具有堆栈级别函数的索引本地变量的名称和值。如果没有给定索引的本地变量,则返回零,并在调用级别超出范围时引发错误。 |
getmetatable(value) | 如果它没有元表,返回给定对象的元表或零。 |
getregistry() | 返回注册表表,一个可以被任何c代码用于存储其需要存储的任何Lua值的预定义表。 |
getupvalue(function, upvalue index) | 此函数返回具有函数功能索引的upvalue的名称和值。如果没有给定索引的upvalue,函数将返回零。 |
setfenv(function or thread or userdata, environment table) | 将指定对象的环境设置给指定表。返回对象。 |
sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count) | 将给定函数设置为钩子。字符串掩码和数字计数描述钩子何时被调用。这里,c、r和l每次调用Lua调用,返回,并分别在函数中输入每行代码。 |
setlocal(optional thread, stack level, local index, value) | 将值分配给本地变量,并在堆栈级别的函数的索引本地变量。如果没有给定索引的本地变量,函数将返回零,并在被调用时抛出一个超出范围的错误。否则,它将返回本地变量的名称。 |
setmetatable(value, metatable) | 将指定对象的元表设置给指定表(可以是零)。 |
setupvalue(function, upvalue index, value) | 此函数使用函数功能的索引为upvalue分配值。如果没有给定索引的upvalue,函数将返回零。否则,它将返回upvalue的名称。 |
traceback(optional thread, optional message string, optional level argument) | 建立一个扩展错误消息并进行回溯。 |
上表列出了我们常用的调试函数,接下来我们可以看些简单的例子:
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 库的 traceback 和 getinfo 函数, getinfo 函数用于返回函数信息的表。
另一个实例
我们经常需要调试函数的内的局部变量。我们可以使用 getupvalue 函数来设置这些局部变量。实例如下:
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。现在我们调用函数,执行后输出为 11 而不是 3。
调试类型
1.命令行调试
2.图形界面调试
常用的命令行调试器有:RemDebug、clidebugger、ctrace、xdbLua、LuaInterface - Debugger、Rldb、ModDebug。
常用的图形界调试器有:SciTE、Decoda、ZeroBrane Studio、akdebugger、luaedit。