调试库教程

lua-users home
wiki

我不确定所有者创建者是否会对这个编辑感到满意,但我决定他们有权将其恢复到以前的版本。

我不能忍受它为空,所以我直接从手册中获取了它。 随意根据自己的经验将内容更改为自己的措辞。 它仍然是一个 wiki,随意编辑。

6.10 � 调试库

此库为 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

-- ^ 直接从手册中获取

评论

我认为不应该创建没有内容的页面。维基上有十几个空页面,等待着永远不会出现的內容。此外,这里类似参考的布局是否与教程的目标相冲突?--JohnBelmonte

~=不再为空=~

总体上同意关于空页面的观点。为了与其他库教程保持一致,此页面也需要填充内容。

~=不再需要填充=~

我对库教程的结构也有一些担忧。例如,我们有StringsTutorialTablesTutorial介绍了这些数据类型的基本特性。然后我们有StringLibraryTutorialTableLibraryTutorial以大致字母顺序列出了所有模块函数,并为每个函数提供了示例,以及一些来自 Lua 参考手册的描述重复。这种方式遵循教程的唯一之处在于每个函数描述都部分以示例为导向。然而,从高层次来看,它并没有像教程那样结构化,这样做需要一些工作。另见LuaReferenceManualComments.

--DavidManura

好吧,它是一个维基!:) 我在这里创建它,以便其他人可以编辑它。而且他们似乎在整体上很好地维护它。StringsTutorial,就像其他类型一样,只是为了演示特定类型,而库教程则展示了使用示例,而 Lua 文档中缺少这些示例。我个人发现这是快速理解新语言的最简单方法。口味可能有所不同。还有其他信息来源,例如代码片段等。我还发现参考类型的布局对于当我忘记某个功能时快速参考很有用。同样,口味可能有所不同;有些人可能更喜欢更多详细的描述和使用讨论。-- 其他页面确实被留空,希望人们能填补这些内容。我也还没有完成。一开始,维基几乎没有结构,我使用维基的经验是,如果没有人对某件事进行温和的引导式拥有,它就会变成一团糟。--NickTrout

~=已编辑=~

我无法忍受它为空。


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2018 年 12 月 12 日 下午 11:11 GMT (差异)