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調用,返回並分別輸入函數中的每一行代碼時,都會調用c ,r 和l 。 |
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
操作之前n
為2
。 使用setupvalue
函數,它更新為10
。現在當調用計數器函數時,它將返回11
而不是3
。
調試類型
在Lua中,調試類型主要有兩種 -
- 命令行調試
- 圖形化調試
1. 命令行調試
命令行調試是使用命令和列印語句在命令行進行調試的調試類型。 Lua有許多命令行調試器,下麵列出了一些。
RemDebug - RemDebug是
Lua 5.0
和Lua 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 - 這包括遠程調試,本地調試,語法突出顯示,完成建議列表,參數命題引擎,高級中斷點管理(包括中斷點和命中計數的條件系統),功能列表,全局和局部變數列表,監視,面向解決方案的管理。