Lua 调试器、钩子、yield 和resume

问题描述 投票:0回答:1

我正在尝试为我的游戏引擎制作一个简单的调试器,以允许逐行通过从磁盘加载的 lua 脚本。全部通过 c api 完成。

我可以设置一个钩子来触发每一行,或每x条指令等。 我还可以创建线程/协程以允许屈服,从而可以将控制流返回到 c。

当尝试将这些结合起来时,问题就出现了。 lua 脚本不必为此调用任何特殊的东西。不允许从钩子函数调用

lua_yield
吗?

这里我创建了一个新的lua状态,一个新的lua线程,设置了一个钩子并使用

script.lua
运行
pcallk

lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_State* T = lua_newthread(L);
lua_sethook(T, &hookfunc, LUA_HOOKLINE, 1); // Run a hook to trigger every line
luaL_loadfile(T, "script.lua");
lua_pcallk(T, 0, 0, 0, 0, 0); // Run the script so that it can yield

钩子函数只是调用yield。

lua_yield(L, 0);

这没有按预期工作,这合法吗?我是否错过了文档中的某些内容。

我看过:

  • PIL 第 4 版。
  • lua.org 文档
  • 此沙盒页面
  • 还有一个旧的电子邮件线程,我找不到链接

我会重申这是在 c api 中完成的,lua 脚本本身不调用任何东西

lua sandbox lua-api
1个回答
0
投票

你说它不起作用,但你没有具体说明你想要实现什么。从调试钩子中屈服是行不通的(你会得到“尝试跨 C 调用边界屈服”错误消息),因为没有什么可以屈服的;您还没有恢复任何代码来允许执行yield。您可以从调试挂钩执行的操作是恢复一些其他代码;这是一些 Lua 调试器的工作方式(例如 MobDebug 和 RemDebug)。

您可以检查这个SO问题,因为它似乎描述了类似的目标,并且其中一个答案建议了可能与您的问题相关的扩展(yieldhook)。

© www.soinside.com 2019 - 2024. All rights reserved.