第一版是針對 Lua 5.0 編寫的。雖然對於後續版本來說仍然十分相關,但有些地方還是有差異。
第四版針對 Lua 5.3,可以在 Amazon 和其他書店買到。
購買這本書,您也可以 贊助 Lua 專案


23.2 – 掛鉤

除錯函式庫的掛鉤機制允許我們註冊一個函式,當程式執行時,這個函式會在特定事件中被呼叫。有四種類型的事件可以觸發掛鉤:呼叫 事件會在 Lua 每一次呼叫函式時發生;傳回 事件會在函式每次傳回時發生; 事件會在 Lua 開始執行新的程式碼列時發生;計數 事件會在執行特定數量的指令後發生。Lua 會使用單一引數呼叫掛鉤,這個引數是一個描述產生呼叫的事件的字串:"call""return""line""count"。此外,對於列事件,它也會傳遞第二個引數,也就是新的列號。我們可以隨時使用 debug.getinfo 在掛鉤中取得更多資訊。

要註冊掛鉤,我們使用兩個或三個引數呼叫 debug.sethook:第一個引數是掛鉤函式;第二個引數是一個描述我們想要監控的事件的字串;第三個引數(選用)是一個描述我們想要取得計數事件的頻率的數字。要監控呼叫、傳回和列事件,我們在遮罩字串中加入它們的第一個字母(`c``r``l`)。要監控計數事件,我們只要提供一個計數器作為第三個引數。要關閉掛鉤,我們使用沒有引數呼叫 sethook

以下程式碼是一個簡單的範例,它安裝了一個原始的追蹤器,會印出直譯器執行的每一個新列的數字

    debug.sethook(print, "l")
它只會將 print 安裝為掛鉤函式,並指示 Lua 只在列事件中呼叫它。更精細的追蹤器可以使用 getinfo 將目前的檔案名稱加入追蹤中
    function trace (event, line)
      local s = debug.getinfo(2).short_src
      print(s .. ":" .. line)
    end
    
    debug.sethook(trace, "l")