Lua調試

Lua提供了一個調試庫,它提供了創建自己的調試器的原始函數。 即使沒有內置的Lua調試器,也有許多第三方Lua調試器,由各種開發人員創建,其中許多是開源的。

下表中列出了Lua調試庫中可用的功能及其用法。

編號 方法 描述
1 debug() 進入用於調試的交互模式,該模式保持活動狀態,直到用戶只輸入一行中的cont並按Enter鍵。 用戶可以使用其他功能在此模式下檢查變數。
2 getfenv(object) 返回對象的環境。
3 gethook(optional thread) 返回線程的當前掛鉤設置,有三個值 - 當前掛鉤函數,當前掛鉤掩碼和當前掛鉤計數。
4 getinfo(optional thread, function or stack level, optional flag) 返回一個包含函數資訊的表。可以直接給出函數,或者可以給一個數字作為函數的值,在給定線程的調用堆疊的級別函數上運行的函數 - 級別0為當前函數(getinfo本身); 級別1為調用getinfo的函數;等等。 如果function是一個大於活動函數數的數字,則getinfo返回nil
5 getlocal(optional thread, stack level, local index)
6 getmetatable(value) 返回給定對象的元表,如果沒有元表,則返回nil
7 getregistry() 返回註冊表表,這是一個預定義的表,任何C語言代碼都可以使用它來存儲它需要存儲的任何Lua值。
8 getupvalue(function, upvalue index) 此函數返回upvalue的名稱和值,索引為函數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 "l", optional instruction count) 將給定函數設置為鉤子。 字串掩碼和數字計數描述了何時調用掛鉤。 這裏,每次Lua調用,返回並分別輸入函數中的每一行代碼時,都會調用crl
11 setlocal(optional thread, stack level, local index, value) 使用堆疊級別的函數的索引local將值賦給局部變數。 如果沒有具有給定索引的局部變數,則該函數返回nil,並且當使用超出範圍的級別調用時引發錯誤。 否則,它返回局部變數的名稱。
12 setmetatable(value, metatable) 將給定對象的metatable設置為給定表(可以為nil)。
13 setupvalue(function, upvalue index, value) 此函數使用函數func的索引up將值賦給upvalue。 如果給定索引沒有upvalue,則函數返回nil。 否則,它返回upvalue的名稱。
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
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.trace函數列印堆疊跟蹤。 debug.getinfo獲取函數的當前表。

調試示例

開發人員經常為了知道函數的局部變數以進行調試。 為此,可以使用getupvalue和使用setupvalue並設置這些局部變數。 一個簡單的例子如下所示 -

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

在此示例中,計數器每次調用時都會更新一次。 可以使用getupvalue函數查看局部變數的當前狀態。 然後,將局部變數設置為新值。 這裏,在調用set操作之前n2。 使用setupvalue函數,它更新為10。現在當調用計數器函數時,它將返回11而不是3

調試類型

在Lua中,調試類型主要有兩種 -

  • 命令行調試
  • 圖形化調試

1. 命令行調試

命令行調試是使用命令和列印語句在命令行進行調試的調試類型。 Lua有許多命令行調試器,下麵列出了一些。

  • RemDebug - RemDebug是Lua 5.0Lua 5.1的遠程調試器。 它允許遠程控制另一個Lua程式的執行,設置中斷點並檢查程式的當前狀態。 RemDebug 還可以調試CGILua腳本。

  • clidebugger - 它是Lua 5.1的簡單命令行介面調試器,用純Lua編寫。 除了標準的Lua 5.1庫之外,它不依賴於任何其他東西。 它的靈感來自RemDebug,但沒有遠程工具。

  • ctrace - 用於跟蹤Lua API調用的工具。
  • xdbLua - 用於Windows平臺的簡單Lua命令行調試程式。
  • LuaInterface Debugger - 它是LuaInterface的調試器擴展。 它將內置的Lua調試介面提升到更高的級別。與調試器的交互由事件和方法調用完成。
  • Rldb - 它是一個通過套接字的遠程Lua調試器,可在Windows和Linux上使用。 它可以為您提供比現有功能更多的功能。
  • ModDebug - 這允許遠程控制另一個Lua程式的執行,設置中斷點,並檢查程式的當前狀態。

2. 圖形調試

在IDE下可以進行圖形調試,在IDE中可為各種狀態(如變數值,堆疊跟蹤和其他相關資訊)進行可視化調試。 借助中斷點,步入,步進和IDE中的其他按鈕,可以實現可視化表示和逐步控制執行。

Lua有許多圖形調試器,它包括以下內容-

  • SciTE - Lua的默認Windows IDE提供了多個調試工具,如中斷點,步驟,步入,步進,監視變數等。
  • Decoda - 這是一個具有遠程調試支持的圖形調試器。
  • ZeroBrane Studio - Lua IDE集成了遠程調試器,堆疊視圖,監視視圖,遠程控制臺,靜態分析器等。 適用於LuaJIT,Love2d,Moai和其他Lua引擎; Windows,OSX和Linux。
  • akdebugger - 這是Eclipse調試器和編輯器的Lua插件。
  • luaedit - 這包括遠程調試,本地調試,語法突出顯示,完成建議列表,參數命題引擎,高級中斷點管理(包括中斷點和命中計數的條件系統),功能列表,全局和局部變數列表,監視,面向解決方案的管理。

上一篇: Lua錯誤處理 下一篇: Lua垃圾收集