3

我正在尝试为运行 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 端执行此操作。

4

2 回答 2

0

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

于 2022-01-14T11:29:16.867 回答
0

最终,您不能直接将值与挂钩函数相关联。

但是您可以通过多种方式间接地这样做。最安全的可能是将值放在 Lua 注册表中的已知位置。你也可以让它成为一个全球性的。但是不管你怎么做,它必须是可以通过lua_State对象访问的东西。

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

于 2015-12-08T17:49:57.240 回答