Lua - 调试



Lua 提供了一个调试库,它为我们提供了创建自己的调试器所需的所有基本函数。尽管没有内置的 Lua 调试器,但我们有很多由各种开发人员创建的 Lua 调试器,其中许多是开源的。

Lua 调试库中可用的函数及其用途列在下面的表格中。

序号 方法及用途
1

debug()

进入交互式调试模式,该模式保持活动状态,直到我们在一行中只输入 cont 并按 Enter 键。用户可以在此模式下使用其他函数检查变量。

2

getfenv(object)

返回对象的 environment。

3

gethook(optional thread)

返回线程的当前钩子设置,作为三个值:当前钩子函数、当前钩子掩码和当前钩子计数。

4

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

返回一个包含有关函数信息的表格。您可以直接提供函数,也可以提供一个数字作为函数的值,这意味着在给定线程的调用栈的函数级别 function 处运行的函数:级别 0 是当前函数(getinfo 本身);级别 1 是调用 getinfo 的函数;以此类推。如果 function 是一个大于活动函数数量的数字,则 getinfo 返回 nil。

5

getlocal(optional thread, stack level, local index)

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

6

getmetatable(value)

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

7

getregistry()

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

8

getupvalue(function, upvalue index)

此函数返回函数 func 的索引为 up 的 upvalue 的名称和值。如果不存在具有给定索引的 upvalue,则该函数返回 nil。

9

setfenv(function or thread or userdata, environment table)

将给定对象的 environment 设置为给定表格。返回 object。

10

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

将给定函数设置为钩子。字符串掩码和数字计数描述了何时调用钩子。这里,c、r 和 l 分别在 Lua 调用、返回和进入函数的每一行代码时调用。

11

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

将 value 分配给栈级别 level 上的函数的索引为 local 的局部变量。如果不存在具有给定索引的局部变量,则该函数返回 nil,并在使用超出范围的级别调用时引发错误。否则,它返回局部变量的名称。

12

setmetatable(value, metatable)

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

13

setupvalue(function, upvalue index, value)

此函数将 value 分配给函数 func 的索引为 up 的 upvalue。如果不存在具有给定索引的 upvalue,则该函数返回 nil。否则,它返回 upvalue 的名称。

14

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

构建包含回溯的扩展错误消息。

以上列表是 Lua 中调试函数的完整列表,我们经常使用一个使用上述函数并提供更简单调试的库。使用这些函数并创建我们自己的调试器非常复杂,并且不可取。无论如何,我们将看到简单使用调试函数的示例。

main.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:
	main.lua:2: in function 'myfunction'
	main.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end
table: 00C59638

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

调试 - 示例

我们经常需要了解函数的局部变量以进行调试。为此,我们可以使用 getupvalue,并且要设置这些局部变量,我们使用 setupvalue。下面显示了对此的一个简单示例。

main.lua

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

在这个例子中,每次调用 counter 时,它都会更新一次。我们可以使用 getupvalue 函数查看局部变量的当前状态。然后我们将局部变量设置为一个新值。这里,在调用 set 操作之前,n 为 2。使用 setupvalue 函数,它更新为 10。现在当我们调用 counter 函数时,它将返回 11 而不是 3。

调试类型

  • 命令行调试
  • 图形化调试

命令行调试

命令行调试是一种使用命令行在命令和打印语句的帮助下进行调试的调试类型。Lua 有许多可用的命令行调试器,其中一些列在下面。

  • RemDebug - RemDebug 是 Lua 5.0 和 5.1 的远程调试器。它允许您远程控制另一个 Lua 程序的执行,设置断点并检查程序的当前状态。RemDebug 还可以调试 CGILua 脚本。

  • clidebugger - 一个用纯 Lua 编写的 Lua 5.1 的简单命令行界面调试器。它不依赖于任何其他内容,除了标准的 Lua 5.1 库。它受到 RemDebug 的启发,但没有它的远程功能。

  • ctrace - 用于跟踪 Lua API 调用的工具。

  • xdbLua - Windows 平台的简单 Lua 命令行调试器。

  • LuaInterface - Debugger - 此项目是 LuaInterface 的调试器扩展。它将内置的 Lua 调试界面提升到更高的级别。与调试器的交互通过事件和方法调用来完成。

  • Rldb - 这是一个通过套接字进行的远程 Lua 调试器,可在 Windows 和 Linux 上使用。它可以为您提供比任何现有调试器更多的功能。

  • ModDebug - 这允许远程控制另一个 Lua 程序的执行,设置断点并检查程序的当前状态。

图形化调试

图形化调试是在 IDE 的帮助下提供的,您可以在其中获得各种状态的可视化调试,例如变量值、堆栈跟踪和其他相关信息。借助 IDE 中的断点、单步进入、单步跳过和其他按钮,可以对执行进行可视化表示和逐步控制。

Lua 有许多图形化调试器,包括以下内容。

  • SciTE - Lua 的默认 Windows IDE 提供多种调试功能,例如断点、单步执行、单步进入、单步跳过、监视变量等等。

  • Decoda - 这是一个具有远程调试支持的图形化调试器。

  • ZeroBrane Studio - 带有集成远程调试器、堆栈视图、监视视图、远程控制台、静态分析器等的 Lua IDE。适用于 LuaJIT、Love2d、Moai 和其他 Lua 引擎;Windows、OSX 和 Linux。开源。

  • akdebugger - Eclipse 的调试器和编辑器 Lua 插件。

  • luaedit - 它具有远程调试、本地调试、语法高亮、代码补全列表、参数建议引擎、高级断点管理(包括断点上的条件系统和命中次数)、函数列表、全局和局部变量列表、监视、解决方案导向管理等功能。

广告