偵錯函式庫教學

lua-users home
wiki

我不太確定作者看到這項編輯後是否滿意,但我決定他們有權力將其還原為先前版本。

我受不了這個地方是空的,所以我直接從手冊中擷取內容。歡迎根據您的經驗,用自己的話更換內容。這裡仍然是 wiki,歡迎自由編輯。

6.10 � 偵錯函式庫

此函式庫對 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

-- ^ 直接取自手冊

意見

我認為不應該建立不含內容的頁面。Wiki 有十幾個範本頁面在等永遠不會來的內容。此外,此處的參考式版面是否與教學目的相衝突?--JohnBelmonte

~=不再空白=~

普遍同意關於範本頁面的事。為了與其他函式庫教學一致,此頁面也需要填入內容。

~=不再需要填入內容=~

我也懷疑函式庫教學的結構。例如,我們有 StringsTutorialTablesTutorial 給出這些資料類型的基本品質。然後,我們有 StringLibraryTutorialTableLibraryTutorial 列出所有模組函式的大略字母順序,並為每個函式提供範例,以及一些 Lua 參考手冊中說明的重複內容。這些內容依循教學的唯一方式是每一個函式說明都部分以範例為導向。然而,以高層級來看,它的結構並不是教學,如果要設計成教學,則需要一些工夫。另請參閱 LuaReferenceManualComments

--DavidManura

好,它是一個維基!:) 我在這裡建立它,這樣其他人才能編輯它。而且他們似乎在整體上完成維護得很好。字串教學,就像其他類型只用於展示特定類型,而函式庫教學顯示使用範例,這是 Lua 文件所沒有的。我個人認為這是快速掌握新語言的最簡單方法。口味因人而異。還有其他資訊來源,例如程式碼片段等。當我忘記功能時,我也發現參考類型佈局非常有用於快速查詢。同樣地,口味因人而異;有些人可能比較喜歡更冗長的內容和使用討論。-- 確實會將其他頁面留空,希望人們可以填入這些內容。我也沒有時間完成它。最初,維基的結構很少,而我對維基的經驗是如果沒有人溫和地掌握主導權,它只會變成一團糟。--NickTrout

~=已編輯~=

我無法忍受這個留空白的地方。


最新變更 · 偏好設定
編輯 · 歷史記錄
上次編輯於 2018 年 12 月 12 日下午 11:11 (GMT) (差異)