位置:首頁 > 腳本語言 > Lua教學 > Lua調試

Lua調試

Lua提供了一個調試庫,它提供了所有的基本功能,創造自己的調試器。即便如此,也冇有內置的Lua調試器,Lua為開發者創建很多調試器是開源。

調試Lua庫中可用的功能列於下表連同它的用途。

S.N. 方法及用途
1. debug(): 
進入調試,直到我們輸入隻在一行中,然後按回車這仍然是積極的互動模式。用戶可以在使用其他功能,此模式下檢查變量。
2. getfenv(object): 
返回對象的環境。
3. gethook(optional thread): 
返回該線程的當前鉤設置,三個值:當前鉤子函數,當前鉤模,並且當前鉤計數。
4. getinfo(optional thread, function or stack level, optional flag): 
返回有關功能的信息表。可以直接給該函數,或者可以給一個號碼作為函數的值,這意味著該函數在給定線程的調用堆棧的水平儀功能運行:0級是當前功能(程序getinfo本身); 1級是所謂getInfo函數等等。如果函數比當前功能的數大一些,然後getinfo返回nil。
5. getlocal(optional thread, stack level, local index): 
返回名稱和局部變量的索引為局部位於堆棧級函數的值。返回nil,如果有指定索引冇有局部變量,並且當使用的級彆超出範圍稱為引發錯誤。
6. getmetatable(value): 
返回給定對象或零nil元表,如果它冇有一個元表。
7. getregistry(): 
返回注冊表,預先定義的表格,可用於通過任何C代碼來存儲任何Lua的值,它需要存儲。
8. getupvalue(function, upvalue index): 
此函數返回名稱和p值與函數func索引上升的值。該函數返回零,如果存在折射率給定upvalue的值。
9. setfenv(function or thread or userdata, environment table): 
設置給定對象與給定表中的環境,返回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): 
指定值以與索引本地位於堆棧級彆函數的局部變量。函數返回零,如果存在與給定的索引冇有局部變量,而當具有級彆超出範圍稱為引發錯誤。否則,它返回局部變量的名稱。
12. setmetatable(value, metatable): 
設置元表為給定對象與給定表(可以是零)。
13. setupvalue(function, upvalue index, value): 
此函數分配的值與函數func索引組成的upvalue。該函數返回零,如果存在與冇有upvalue給定的折射率。否則,它返回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得到函數的當前表。

另外一個例子

我們經常會需要知道一個函數的局部變量而進行調試。為此可以使用setupvalue設置並使用getupvalue獲取這些局部變量、。一個簡單的例子對本如下所示。

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函數獲取局部變量的當前狀態。然後將局部變量的設置新值。這裡,n設定為2在操作被調用之前。使用setupvalue函數更新為10,當調用計數器功能,它會返回11,而不是3。

調試類型

  • 命令行調試

  • 圖形化調試

命令行調試

命令行調試是使用命令行用命令和打印報表進行調試的調試類型。有這幾個下麵列出許多Lua可用的命令行調試器。

  • RemDebug: RemDebug是一個遠程調試器在Lua5.0和5.1。它可以遠程控製另一個Lua程序執行,設置斷點和檢查程序的當前狀態。 RemDebug也可以調試CGILua腳本。

  • clidebugger: lua5.1的一個簡單命令行界麵調試程序用純Lua編寫。它不依賴於任何其他比標準的Lua5.1庫。它是從RemDebug啟發,但不具有其遠端設備。

  • ctrace:  一種工具,跟蹤Lua的API調用。

  • xdbLua: Windows平台的一個簡單Lua命令行調試器。

  • LuaInterface - Debugger: 本項目為擴展LuaInterface調試器。它提出了建立在Lua調試接口到一個更高的水平。與調試器的交互是通過事件和方法調用完成。

  • Rldb: 這是通過套接字的遠程LUA調試器,適用於Windows和Linux。它可以給你比任何現有的更多的功能。

  • ModDebug: 這使得可以遠程控製其它Lua程序的執行,設置斷點,並檢查程序的當前狀態。

圖形化調試

圖形化調試提供有IDE提供了各種狀態,如變量值,堆棧跟蹤信息和其他相關信息的可視化調試。有一種視覺表示,一步執行了斷點的幫助下步控製,步入,跳過和其他按鈕在IDE中。

有圖形化Lua調試器的數量,它包括以下內容。

  • SciTE: 默認Windows IDE中的Lua提供了多種調試工具,如斷點,一步,一步進入,跳過,查看變量等。

  • Decoda: 這是一個支持圖形化調試器遠程調試。

  • ZeroBrane Studio: Lua的IDE集成了遠程調試器,堆棧視圖,表視圖,遠程控製台,靜態分析器等。工程與LuaJIT,Love2d,Moai,和其他的Lua引擎。 在Windows,OSX和Linux並且開源。

  • akdebugger: Lua的Eclipse插件-調試器和編輯器。

  • luaedit: 此功能遠程調試,本地調試,語法高亮,自動完成建議列表,參數命題引擎,推進斷點管理(包括斷點空調係統和命中數),函數列表,全局變量和局部變量列表,查看,解決問題為導向的管理