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 - 它具有遠端除錯、本地除錯、語法高亮、程式碼補全列表、引數建議引擎、高階斷點管理(包括斷點上的條件系統和命中次數)、函式列表、全域性和區域性變數列表、監視、解決方案導向管理等功能。

廣告
© . All rights reserved.