偵錯函式庫教學 |
|
我受不了這個地方是空的,所以我直接從手冊中擷取內容。歡迎根據您的經驗,用自己的話更換內容。這裡仍然是 wiki,歡迎自由編輯。
此函式庫對 Lua 程式提供偵錯介面 (�4.9) 的功能。您在使用此函式庫時應小心。其中的幾個函式會違反 Lua 程式碼的基本假設 (例如,無法從函式外存取函式中的區域變數;使用者資料元資料表無法由 Lua 程式碼變更;Lua 程式碼不會當機),因此可能會危害原本安全的程式碼。此外,此函式庫中有些函式可能會很慢。
此函式庫中的所有函式都提供在 debug 資料表中。所有對執行緒操作的函式都有一個選用的第一個引數,也就是要操作的執行緒。預設值永遠是目前的執行緒。
debug.debug ()
會進入使用者互動模式,執行使用者輸入的每個字串。透過使用簡單指令和其他偵錯功能,使用者可以檢查全域和區域變數、變更其值、評估表達式等等。只包含 cont 字眼的行會結束此函式,讓呼叫者繼續執行。
請注意,debug.debug 的指令不會嵌入任何函式的詞彙嵌套中,因此無法直接存取區域變數。
debug.gethook ([thread])
會傳回執行緒目前的 hook 設定,包含三個值:目前的 hook 函式、目前的 hook 遮罩和目前的 hook 計數 (由 debug.sethook 函式設定)。
debug.getinfo ([thread,] f [, what])
會傳回一個資料表,其中包含函式的資訊。您可以直接提供函式,或將數字作為 f 的值,表示在給定執行緒的呼叫堆疊中的函式 f 層正在執行:0 層為目前的函式 (getinfo 本身);1 層為呼叫 getinfo 的函式 (尾端呼叫例外,尾端呼叫不會計入堆疊);依此類推。如果 f 是大於目前執行函式數量的數字,getinfo 會傳回 nil。
傳回的資料表可以包含 lua_getinfo 傳回的所有欄位,what 字串會描述要填入哪些欄位。預設的 what 會取得所有可取得的資訊,有效的行資料表除外。如果選項 'f' 存在,會加入一個欄位,名稱為 func,其中包含函式本身。如果選項 'L' 存在,會加入一個欄位,名稱為 activelines,其中包含有效行資料表。
例如,程式碼 debug.getinfo(1,"n").name 會傳回一個資料表,其中包含目前函式的名稱 (如果可以找到合理的函式名稱),而程式碼 debug.getinfo(print) 會傳回一個資料表,其中包含 print 函式的所有可取得資訊。
debug.getlocal ([thread,] f, local)
此函數會傳回堆疊層級中的函數的本機變數名稱及值,index 為 local。此函數不僅會存取明確的本機變數,也會存取參數、暫存器等。
第一個參數或本機變數索引為 1,以此類推,直至最後一個處於活動狀態的變數。負索引是指不定參數;-1 是第一個不定參數。如果沒有索引為特定值的變數,函數會傳回 nil,並在超出範圍呼叫 level 時引發錯誤。(你可以呼叫 debug.getinfo 檢查 level 是否有效。)
以「(」(開啟括弧)開頭的變數名稱表示內部變數(迴圈控制變數、暫存器、不定參數與 C 函式本機變數)。
參數 f 也可能是函數。在此情況下,getlocal 只會傳回函數參數名稱。
debug.getmetatable(值)
傳回已指定數值的元表,如果它沒有元表,則傳回 nil。
debug.getregistry()
傳回註冊表(請參閱「�4.5」)。
debug.getupvalue(f,up)
此函數會傳回函數 f 的 upvalue 名稱及值,index 為 up。如果沒有 index 為特定值的 upvalue,函數會傳回 nil。
debug.getuservalue(u)
傳回與 u 相關的 Lua 值。如果 u 不是使用者資料,則傳回 nil。
debug.sethook([執行緒],掛勾,遮罩 [計數])
將指定的函數設為掛勾。字串遮罩和數字計數會說明掛勾的呼叫時機。字串遮罩可以包含下列字元,並表示特定意義
「c」:每當 Lua 呼叫函數時,即呼叫掛勾;「r」:每當 Lua 從函數傳回時,即呼叫掛勾;「l」:每當 Lua 進入新的程式碼列時,即呼叫掛勾。計數不為零時,會在每個計數指令後呼叫掛勾。
不帶引數呼叫 debug.sethook 時,會停用掛勾。
呼叫掛勾時,其第一個參數是一個字串,用來說明觸發呼叫的事件:「呼叫」(或「尾部呼叫」),「傳回」、「列」和「計數」。對於列事件,掛勾的第二個參數為新行號。在掛勾內,你可以呼叫層級為 2 的 getinfo,以取得關於執行中函數的更多資訊(層級 0 是 getinfo 函數,層級 1 是掛勾函數)。
debug.setlocal([執行緒],層級,本機,值)
此函數將值 value 指定給堆疊層級為 level 的函數之本機變數,index 為 local。如果沒有索引為特定值之本機變數,函數會傳回 nil,並在超出範圍呼叫 level 時引發錯誤。(你可以呼叫 getinfo 檢查 level 是否有效。)否則,它會傳回本機變數名稱。
有關變數索引和名稱的詳細資訊,請參閱 debug.getlocal。
debug.setmetatable(值,表格)
將指定值的元表設為指定的表格(可以為 nil)。傳回值。
debug.setupvalue (f, up, value)
此函式將值 value 指派給函式 f 的 upvalue,其索引為 up。若沒有索引為 up 的 upvalue,則此函式會傳回 nil。否則,它會傳回該 upvalue 的名稱。
debug.setuservalue (udata, value)
將給定的值設定為與給定的 udata 關聯的 Lua 值。value 必須是表格或 nil;udata 必須是完整的使用者資料。
傳回 udata。
debug.traceback ([thread,] [message [, level]])
如果 message 存在,但既不是字串也不是 nil,則此函式會傳回 message,不作進一步處理。否則,它會傳回一個字串,其中包含呼叫堆疊的追蹤。可能會在追蹤的開頭附加一個選擇性的訊息字串。一個選擇性的層級數字會指出要從哪個層級開始追蹤(預設為 1,也就是呼叫 traceback 的函式)。
debug.upvalueid (f, n)
傳回給定函式中編號為 n 的 upvalue 的唯一識別碼(作為輕量使用者資料)。
這些唯一的識別碼讓程式碼得以驗證不同的封閉元是否共用 upvalue。共用 upvalue(也就是存取相同的外部局部變數)的 Lua 封閉元會傳回這些 upvalue 索引的同一 ID。
debug.upvaluejoin (f1, n1, f2, n2)
讓 Lua 封閉元 f1 的第 n1 個 upvalue 參照 Lua 封閉元 f2 的第 n2 個 upvalue。在 Lua 5.3 和 5.2 中可用,但在 Lua 5.1 中不可用。
> local x = 0; function add_to_x(val) x = x + val; return x end > local y = 0; function add_to_y(val) y = y + val; return y end > = add_to_x(10) 10 > = add_to_y(20) 20 > debug.upvaluejoin(add_to_x, 1, add_to_y, 1) -- make the variable x in add_to_x refer to the upvalue y in add_to_y > = add_to_x(0) 20 > = add_to_y(0) 20 > = add_to_x(10) 30 > = add_to_y(0) 30
-- ^ 直接取自手冊
~=不再空白=~
~=不再需要填入內容=~
~=已編輯~=
我無法忍受這個留空白的地方。