如何将lua_sethook上下文与lua_sethook关联?

我正在尝试为运行 Lua 脚本的进程编写调试器,文档中建议(使用 C 语言)使用 lua_sethook:

int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);

lua_Hook 被定义为:

typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);

这个钩子只会得到一个 lua_State 指针,这很好,但我该如何将指针与我的调试器类关联起来,以便我可以从那里返回到我的调试器类?

在这种情况下,我想避免使用全局变量,因为我有多个 lua_State 实例。我想我可以使用一个 lua_State * 指针到调试器实例的映射,但这似乎不太有效率。而将它存储为 lua_State * 中的全局变量似乎并没有意义,因为要能够检索它,我必须将至少一个值推送到 Lua 栈上,这在 Lua 栈溢出的情况下似乎很难/不可能做到。

我是否忽略了什么?我该如何实现这一点?我知道,我可以在 Lua 代码中实现这一点,但我想了解如何从 C 代码中做到这一点。

点赞
用户734069
用户734069

最终,你不能直接将一个值与钩子函数相关联。

但你可以通过多种方式间接地实现。最安全的可能是将该值放在 Lua 注册表中已知的位置上。你也可以将其设为全局变量。但无论如何,它都需要是可以通过 lua_State 对象访问到的东西。

使用外部的数据来操作注册过的 Lua 实例是很危险的。也就是说,你可能会构建一个关联容器来映射 lua_State 指针到注册实例数据。然而,如果你尝试这样做,当钩子函数在执行 Lua 协程期间被调用时,该方法可能会失败,因为它们与主线程有不同的 lua_State 对象。

2015-12-08 17:49:57
用户10882916
用户10882916

我注意到在lua_State中有一个额外的空间,你可以使用lua_getextraspace获取它。根据手册,Lua本身没有触及它。默认情况下,其大小为sizeof(void*)。因此,也许你可以在lua_newstate之后分配一个自定义结构,在调试钩子中使用它,在lua_close之前自己释放它。

2022-01-14 11:29:16