开发学院

您的位置:首页>教程>正文

教程正文

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。