第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但還是有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也可以協助 支援 Lua 專案。
![]() |
使用 Lua 程式設計 | ![]() |
第三部分。標準函式庫 第 23 章。除錯函式庫 |
除錯函式庫中的主要內省函式為 debug.getinfo
函式。其第一個參數可以是函式或堆疊層級。當您呼叫 debug.getinfo(foo)
來取得某個函式 foo
時,您會取得一個包含該函式部分資料的表格。該表格可能有下列欄位:
source
--- 定義函式的位置。如果函式是在字串中定義的(透過 loadstring
),source
就是該字串。如果函式是在檔案中定義的,source
就是檔案名稱,前面加上 `@
´。
short_src
--- source
的簡短版本(最多 60 個字元),適用於錯誤訊息。
linedefined
--- 定義函式的來源程式碼行數。
what
--- 此函式的類型。如果 foo
是常規 Lua 函式,選項為 "Lua"
;如果是 C 函式,選項為 "C"
;如果是 Lua 程式區塊的主要部分,選項為 "main"
。
name
--- 函式的合理名稱。
namewhat
--- 前一個欄位的意義。此欄位可能是 "global"
、"local"
、"method"
、"field"
或 ""
(空字串)。空字串表示 Lua 沒有找到函式的名稱。
nups
--- 該函式的向上值數量。
func
--- 函式本身;請參閱後續說明。
當 foo
是 C 函式時,Lua 沒有太多關於它的資料。對於此類函式,只有欄位 what
、name
和 namewhat
是相關的。
當你對某個數字 n 呼叫 debug.getinfo(n)
時,你可以取得在該堆疊層級中作用中的函式資料。例如,如果 n 是 1,你可以取得關於執行呼叫的函式資料。(當 n 是 0 時,你可以取得關於 getinfo
本身(一個 C 函式)的資料。)如果 n 大於堆疊中作用中函式的數量,debug.getinfo
會傳回 nil。當你查詢一個作用中的函式,使用數字呼叫 debug.getinfo
時,結果表格會有一個額外的欄位 currentline
,其中包含函式在該時刻所在的行。此外,func
具有在該層級中作用中的函式。
欄位 name
很棘手。請記住,由於函式在 Lua 中是第一類值,因此函式可能沒有名稱,或可能有多個名稱。Lua 會嘗試尋找函式的名稱,方法是尋找具有該值的全域變數,或者查看呼叫函式的程式碼,以查看它是如何被呼叫的。第二個選項僅在我們使用數字呼叫 getinfo
時才有效,也就是說,我們取得關於特定呼叫的資訊。
getinfo
函式效率不佳。Lua 以不損害程式執行的方式保留偵錯資訊;在此處,有效率的擷取是次要目標。為了獲得更好的效能,getinfo
有第二個選用參數,用於選擇要取得哪些資訊。使用此參數時,它不會浪費時間收集使用者不需要的資料。此參數的格式為字串,其中每個字母根據下表選擇一組資料
`n ´ | 選擇欄位 name 和 namewhat |
`f ´ | 選擇欄位 func |
`S ´ | 選擇欄位 source 、short_src 、what 和 linedefined |
`l ´ | 選擇欄位 currentline |
`u ´ | 選擇欄位 nup |
下列函式說明了 debug.getinfo
的用法。它會列印作用中堆疊的原始追蹤資料
function traceback () local level = 1 while true do local info = debug.getinfo(level, "Sl") if not info then break end if info.what == "C" then -- is a C function? print(level, "C function") else -- a Lua function print(string.format("[%s]:%d", info.short_src, info.currentline)) end level = level + 1 end end要改善此函式並不困難,包括從
getinfo
取得更多資料。事實上,偵錯函式庫提供了此類改善版本,debug.traceback
。與我們的版本不同,debug.traceback
不会列印其結果;相反地,它會傳回一個字串。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |