第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但還是有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也可以協助 支援 Lua 專案


23.1 – 內省功能

除錯函式庫中的主要內省函式為 debug.getinfo 函式。其第一個參數可以是函式或堆疊層級。當您呼叫 debug.getinfo(foo) 來取得某個函式 foo 時,您會取得一個包含該函式部分資料的表格。該表格可能有下列欄位:

foo 是 C 函式時,Lua 沒有太多關於它的資料。對於此類函式,只有欄位 whatnamenamewhat 是相關的。

當你對某個數字 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´選擇欄位 namenamewhat
`f´選擇欄位 func
`S´選擇欄位 sourceshort_srcwhatlinedefined
`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 不会列印其結果;相反地,它會傳回一個字串。