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

C 如何将lua_sethook上下文与lua_sethook关联?,c,debugging,lua,hook,lua-api,C,Debugging,Lua,Hook,Lua Api,我正在尝试为运行lua脚本的进程编写一个调试器,有文档记录的方法(在C中)是使用lua\u sethook: int lua_sethook (lua_State *L, lua_Hook f, int mask, int count); lua\u Hook定义为: typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); 钩子只得到一个lua_State指针,这很好,但是如何将指向调试器类的指针与其关联,以便从那里返回调试器类 在这种

我正在尝试为运行lua脚本的进程编写一个调试器,有文档记录的方法(在C中)是使用
lua\u sethook

int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
lua\u Hook
定义为:

typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
钩子只得到一个
lua_State
指针,这很好,但是如何将指向调试器类的指针与其关联,以便从那里返回调试器类

在这种情况下,我希望避免使用全局变量,因为我有多个
lua\u State
实例。我想我可以使用
lua\u State*
指向调试器实例的指针映射,但这似乎效率不高。在
lua\u状态*
中将其存储为全局似乎没有意义,因为为了能够检索它,我必须将至少一个值推送到lua堆栈上,这在lua堆栈溢出的情况下似乎很难/不可能做到


我错过什么了吗?我将如何做到这一点?我知道,我可以在lua代码中实现这一点,但我想了解如何从C端实现这一点。

最终,您无法将值与挂钩函数直接关联

但你可以通过多种方式间接地做到这一点。最安全的方法可能是将值放在Lua注册表中的已知位置。你也可以让它成为一个全球性的。但无论您如何操作,它都需要能够通过
lua_State
对象访问


使用已注册Lua实例外部的数据是危险的。也就是说,您可能有一个将
lua\u状态
指针映射到已注册实例数据的关联容器。但是,如果您尝试此操作,如果在执行Lua协同例程期间调用钩子函数,则可能会失败,因为它们与主线程有单独的
Lua\u状态
对象。

调试器类与
Lua\u状态
之间的多重性关系是什么?例如,对于给定的
lua\u状态
,我们可以假设最多只能有一个调试器类吗?一个调试器类可以在多个
lua\u State
之间共享,还是每个
lua\u State
都有自己唯一的独立调试器类?在我的例子中,它是1:1关系。调试器类有指向一个lua_状态*的指针,我需要以某种方式有效地从lua_状态*获取lua_钩子函数中的调试器类。将其存储在lua注册表中如何?您仍然需要在
hook
函数中将它推到堆栈上,但我不确定您为什么要担心它溢出。你能不能只做一个
lua_checkstack
,如果它失败了,就用你的C代码处理它?我想我能做到。目前,我正在维护一个指向调试器的状态指针映射。这并不理想,但由于所有脚本都在同一个线程中运行,因此我可以不使用任何锁就离开。我希望有一个更轻量级的解决方案。