在处理“调用”事件的调试钩子中,有没有一种方法来确定传递给 Lua 函数的参数值?

我已经编写了一个 Lua 脚本,使用调试 API (debug.sethook) 来挂钩函数调用和返回值。我使用它来打印一个非常有用的格式化调用树,用于调试。

在挂钩处理器函数中,我基于事件是'call'还是'return'(或'tail return') 来增加或减少一个全局的 'indentLevel' 变量。然后,我使用 debug.getinfo 来获取有关调用函数的信息,并将其转储到当前缩进级别的 stdout 中。

对于 'call' 事件,我还希望打印出传递给特定调用的参数值。假设我可以通过查看 Lua 堆栈,在挂钩处理器函数的 C/C++ 实现中执行此操作。

是否有人知道是否有办法从 Lua 的 debug 处理器函数中确定参数值?

原文链接 https://stackoverflow.com/questions/1200385

点赞
stackoverflow用户68204
stackoverflow用户68204

我认为你需要的是 debug.getlocal。根据官方文档:

此函数返回堆栈 level 层上函数的局部变量 local 的索引和值(第一个参数或局部变量的索引为 1,以此类推,一直到最后一个活动的局部变量)。如果没有指定索引的局部变量,则返回 nil;如果调用超出范围,则会引发错误。(可以调用 debug.getinfo 检查 level 是否有效。)

以 '('(开括号)开头的变量名代表内部变量(循环控制变量、临时变量和 C 函数局部变量)。

我自己尚未尝试过,但这看起来应该能揭示你需要知道的信息。从文档中我没有注意到如何确定实际传递了多少个参数,但这可能是 debug.getinfo 显示的细节之一。

2009-07-29 23:23:12