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

时间:2015-02-01 22:56:08

标签: c debugging lua hook lua-api

我正在尝试为运行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方面做到这一点。

1 个答案:

答案 0 :(得分:0)

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

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

使用已注册的Lua实例外部的数据是危险的。也就是说,您可能会想到一个关联容器,它将lua_State指针映射到已注册的实例数据。但是,如果你尝试这个,如果在执行Lua协程期间调用了钩子函数,它可能会失败,因为它们在主线程中有单独的lua_State个对象。