Lua提供了一個(gè)調(diào)試庫(kù),它提供了所有的基本功能,創(chuàng)造自己的調(diào)試器。即便如此,也沒(méi)有內(nèi)置的Lua調(diào)試器,Lua為開(kāi)發(fā)者創(chuàng)建很多調(diào)試器是開(kāi)源。
調(diào)試Lua庫(kù)中可用的功能列于下表連同它的用途。
S.N. | 方法及用途 |
---|---|
1. |
debug(): 進(jìn)入調(diào)試,直到我們輸入只在一行中,然后按回車(chē)這仍然是積極的互動(dòng)模式。用戶可以在使用其他功能,此模式下檢查變量。 |
2. |
getfenv(object): 返回對(duì)象的環(huán)境。 |
3. |
gethook(optional thread): 返回該線程的當(dāng)前鉤設(shè)置,三個(gè)值:當(dāng)前鉤子函數(shù),當(dāng)前鉤模,并且當(dāng)前鉤計(jì)數(shù)。 |
4. |
getinfo(optional thread, function or stack level, optional flag): 返回有關(guān)功能的信息表??梢灾苯咏o該函數(shù),或者可以給一個(gè)號(hào)碼作為函數(shù)的值,這意味著該函數(shù)在給定線程的調(diào)用堆棧的水平儀功能運(yùn)行:0級(jí)是當(dāng)前功能(程序getinfo本身); 1級(jí)是所謂getInfo函數(shù)等等。如果函數(shù)比當(dāng)前功能的數(shù)大一些,然后getinfo返回nil。 |
5. |
getlocal(optional thread, stack level, local index): 返回名稱(chēng)和局部變量的索引為局部位于堆棧級(jí)函數(shù)的值。返回nil,如果有指定索引沒(méi)有局部變量,并且當(dāng)使用的級(jí)別超出范圍稱(chēng)為引發(fā)錯(cuò)誤。 |
6. |
getmetatable(value): 返回給定對(duì)象或零nil元表,如果它沒(méi)有一個(gè)元表。 |
7. |
getregistry(): 返回注冊(cè)表,預(yù)先定義的表格,可用于通過(guò)任何C代碼來(lái)存儲(chǔ)任何Lua的值,它需要存儲(chǔ)。 |
8. |
getupvalue(function, upvalue index): 此函數(shù)返回名稱(chēng)和p值與函數(shù)func索引上升的值。該函數(shù)返回零,如果存在折射率給定upvalue的值。 |
9. |
setfenv(function or thread or userdata, environment table): 設(shè)置給定對(duì)象與給定表中的環(huán)境,返回Object。 |
10. |
sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count): 設(shè)置給定函數(shù)的掛鉤。該字符串面具和數(shù)量計(jì)數(shù)描述時(shí)掛鉤會(huì)被調(diào)用。在這里c, r 和l 被Lua每次調(diào)用,分別進(jìn)入函數(shù)每一行代碼。 |
11. |
setlocal(optional thread, stack level, local index, value): 指定值以與索引本地位于堆棧級(jí)別函數(shù)的局部變量。函數(shù)返回零,如果存在與給定的索引沒(méi)有局部變量,而當(dāng)具有級(jí)別超出范圍稱(chēng)為引發(fā)錯(cuò)誤。否則,它返回局部變量的名稱(chēng)。 |
12. |
setmetatable(value, metatable): 設(shè)置元表為給定對(duì)象與給定表(可以是零)。 |
13. |
setupvalue(function, upvalue index, value): 此函數(shù)分配的值與函數(shù)func索引組成的upvalue。該函數(shù)返回零,如果存在與沒(méi)有upvalue給定的折射率。否則,它返回upvalue的名字。 |
14. |
traceback(optional thread, optional message string, optional level argument): 建立一個(gè)回溯擴(kuò)展錯(cuò)誤信息。 |
上面列表中的Lua調(diào)試功能的完整列表,我們經(jīng)常使用,使用上述功能,并提供了更方便的調(diào)試庫(kù)。使用這些函數(shù)和創(chuàng)建自己的調(diào)試器是相當(dāng)復(fù)雜,不是最好的選擇的。無(wú)論如何,我們將看到使用簡(jiǎn)單的調(diào)試功能的例子。
function myfunction () print(debug.traceback("Stack trace")) print(debug.getinfo(1)) print("Stack trace end") return 10 end myfunction () print(debug.getinfo(1))
當(dāng)我們運(yùn)行上面的程序,會(huì)得到堆棧跟蹤信息,如下圖所示。
Stack trace stack traceback: test2.lua:2: in function 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end
在上面的示例程序中,堆棧跟蹤是通過(guò)使用調(diào)試庫(kù)中可用debug.trace功能打印。debug.getinfo得到函數(shù)的當(dāng)前表。
我們經(jīng)常會(huì)需要知道一個(gè)函數(shù)的局部變量而進(jìn)行調(diào)試。為此可以使用setupvalue設(shè)置并使用getupvalue獲取這些局部變量、。一個(gè)簡(jiǎn)單的例子對(duì)本如下所示。
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())
當(dāng)我們運(yùn)行上面的程序,會(huì)得到下面的輸出。
1 2 index 1 k = 1 index 2 n = 2 11
在這個(gè)例子中,每次計(jì)數(shù)器更新當(dāng)它被調(diào)用??梢允褂胓etupvalue函數(shù)獲取局部變量的當(dāng)前狀態(tài)。然后將局部變量的設(shè)置新值。這里,n設(shè)定為2在操作被調(diào)用之前。使用setupvalue函數(shù)更新為10,當(dāng)調(diào)用計(jì)數(shù)器功能,它會(huì)返回11,而不是3。
命令行調(diào)試
圖形化調(diào)試
命令行調(diào)試是使用命令行用命令和打印報(bào)表進(jìn)行調(diào)試的調(diào)試類(lèi)型。有這幾個(gè)下面列出許多Lua可用的命令行調(diào)試器。
RemDebug: RemDebug是一個(gè)遠(yuǎn)程調(diào)試器在Lua5.0和5.1。它可以遠(yuǎn)程控制另一個(gè)Lua程序執(zhí)行,設(shè)置斷點(diǎn)和檢查程序的當(dāng)前狀態(tài)。 RemDebug也可以調(diào)試CGILua腳本。
clidebugger: lua5.1的一個(gè)簡(jiǎn)單命令行界面調(diào)試程序用純Lua編寫(xiě)。它不依賴于任何其他比標(biāo)準(zhǔn)的Lua5.1庫(kù)。它是從RemDebug啟發(fā),但不具有其遠(yuǎn)端設(shè)備。
ctrace: 一種工具,跟蹤Lua的API調(diào)用。
xdbLua: Windows平臺(tái)的一個(gè)簡(jiǎn)單Lua命令行調(diào)試器。
LuaInterface - Debugger: 本項(xiàng)目為擴(kuò)展LuaInterface調(diào)試器。它提出了建立在Lua調(diào)試接口到一個(gè)更高的水平。與調(diào)試器的交互是通過(guò)事件和方法調(diào)用完成。
Rldb: 這是通過(guò)套接字的遠(yuǎn)程LUA調(diào)試器,適用于Windows和Linux。它可以給你比任何現(xiàn)有的更多的功能。
ModDebug: 這使得可以遠(yuǎn)程控制其它Lua程序的執(zhí)行,設(shè)置斷點(diǎn),并檢查程序的當(dāng)前狀態(tài)。
圖形化調(diào)試提供有IDE提供了各種狀態(tài),如變量值,堆棧跟蹤信息和其他相關(guān)信息的可視化調(diào)試。有一種視覺(jué)表示,一步執(zhí)行了斷點(diǎn)的幫助下步控制,步入,跳過(guò)和其他按鈕在IDE中。
有圖形化Lua調(diào)試器的數(shù)量,它包括以下內(nèi)容。
SciTE: 默認(rèn)Windows IDE中的Lua提供了多種調(diào)試工具,如斷點(diǎn),一步,一步進(jìn)入,跳過(guò),查看變量等。
Decoda: 這是一個(gè)支持圖形化調(diào)試器遠(yuǎn)程調(diào)試。
ZeroBrane Studio: Lua的IDE集成了遠(yuǎn)程調(diào)試器,堆棧視圖,表視圖,遠(yuǎn)程控制臺(tái),靜態(tài)分析器等。工程與LuaJIT,Love2d,Moai,和其他的Lua引擎。 在Windows,OSX和Linux并且開(kāi)源。
akdebugger: Lua的Eclipse插件-調(diào)試器和編輯器。
luaedit: 此功能遠(yuǎn)程調(diào)試,本地調(diào)試,語(yǔ)法高亮,自動(dòng)完成建議列表,參數(shù)命題引擎,推進(jìn)斷點(diǎn)管理(包括斷點(diǎn)空調(diào)系統(tǒng)和命中數(shù)),函數(shù)列表,全局變量和局部變量列表,查看,解決問(wèn)題為導(dǎo)向的管理