调试库教程 |
|
我不能忍受它为空,所以我直接从手册中获取了它。 随意根据自己的经验将内容更改为自己的措辞。 它仍然是一个 wiki,随意编辑。
此库为 Lua 程序提供调试接口 (�4.9) 的功能。 在使用此库时应谨慎。 它的几个函数违反了有关 Lua 代码的基本假设(例如,函数的局部变量无法从外部访问;用户数据元表无法由 Lua 代码更改;Lua 程序不会崩溃),因此可能会损害原本安全的代码。 此外,此库中的某些函数可能很慢。
此库中的所有函数都在 debug 表中提供。 所有针对线程运行的函数都有一个可选的第一个参数,它是要操作的线程。 默认值始终是当前线程。
debug.debug ()
进入与用户的交互模式,运行用户输入的每个字符串。 使用简单的命令和其他调试工具,用户可以检查全局和局部变量,更改其值,评估表达式等等。 仅包含单词 cont 的行将完成此函数,以便调用者继续执行。
请注意,debug.debug 的命令未在任何函数内词法嵌套,因此无法直接访问局部变量。
debug.gethook ([thread])
返回线程的当前钩子设置,作为三个值:当前钩子函数、当前钩子掩码和当前钩子计数(如 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)
此函数返回栈帧 f 中索引为 local 的局部变量的名称和值。此函数不仅访问显式局部变量,还访问参数、临时变量等。
第一个参数或局部变量的索引为 1,依此类推,直到最后一个活动变量。负索引表示可变参数;-1 是第一个可变参数。如果不存在指定索引的变量,则函数返回 nil,如果调用时级别超出范围,则会引发错误。(您可以调用 debug.getinfo 来检查级别是否有效。)
以 '('(左括号)开头的变量名称表示内部变量(循环控制变量、临时变量、可变参数和 C 函数局部变量)。
参数 f 也可以是一个函数。在这种情况下,getlocal 仅返回函数参数的名称。
debug.getmetatable (value)
返回给定值的元表,如果它没有元表,则返回 nil。
debug.getregistry ()
返回注册表(参见 �4.5)。
debug.getupvalue (f, up)
此函数返回函数 f 中索引为 up 的上值的名称和值。如果不存在指定索引的上值,则函数返回 nil。
debug.getuservalue (u)
返回与 u 关联的 Lua 值。如果 u 不是用户数据,则返回 nil。
debug.sethook ([thread,] hook, mask [, count])
将给定函数设置为钩子。字符串 mask 和数字 count 描述了钩子何时被调用。字符串 mask 可以包含以下字符,具有以下含义
'c': 每当 Lua 调用函数时,都会调用钩子;'r': 每当 Lua 从函数返回时,都会调用钩子;'l': 每当 Lua 进入新代码行时,都会调用钩子。如果 count 不为零,则在每执行 count 条指令后调用钩子。
如果没有任何参数调用,debug.sethook 会关闭钩子。
当调用钩子时,它的第一个参数是一个字符串,描述了触发调用事件的类型:"call"(或 "tail call")、"return"、"line" 和 "count"。对于行事件,钩子还会将新的行号作为第二个参数。在钩子内部,您可以使用 level 2 调用 getinfo 来获取有关正在运行函数的更多信息(level 0 是 getinfo 函数,level 1 是钩子函数)。
debug.setlocal ([thread,] level, local, value)
此函数将值 value 赋值给堆栈中 level 级函数的 local 索引为 local 的局部变量。如果不存在具有给定索引的局部变量,则函数返回 nil,并在使用超出范围的 level 调用时引发错误。(您可以调用 getinfo 来检查 level 是否有效。)否则,它将返回局部变量的名称。
有关变量索引和名称的更多信息,请参见 debug.getlocal。
debug.setmetatable (value, table)
将给定值的元表设置为给定的表(可以为 nil)。返回 value。
debug.setupvalue (f, up, value)
此函数将值 value 赋值给函数 f 的 up 索引为 up 的闭包。如果不存在具有给定索引的闭包,则函数返回 nil。否则,它将返回闭包的名称。
debug.setuservalue (udata, value)
将给定值设置为与给定 udata 关联的 Lua 值。value 必须是表或 nil;udata 必须是完整的用户数据。
返回 udata。
debug.traceback ([thread,] [message [, level]])
如果 message 存在但既不是字符串也不是 nil,则此函数将返回 message 而不进行进一步处理。否则,它将返回一个包含调用堆栈跟踪的字符串。一个可选的 message 字符串将附加在跟踪的开头。一个可选的 level 数字告诉从哪个级别开始跟踪(默认值为 1,调用 traceback 的函数)。
debug.upvalueid (f, n)
返回给定函数的第 n 个闭包的唯一标识符(作为轻量级用户数据)。
这些唯一标识符允许程序检查不同的闭包是否共享闭包。共享闭包(即访问同一个外部局部变量)的 Lua 闭包将为这些闭包索引返回相同的 id。
debug.upvaluejoin (f1, n1, f2, n2)
使 Lua 闭包 f1 的第 n1 个闭包引用 Lua 闭包 f2 的第 n2 个闭包。在 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
-- ^ 直接从手册中获取
~=不再为空=~
~=不再需要填充=~
~=已编辑=~
我无法忍受它为空。