Lua:在没有全局方法的情况下获取堆栈跟踪

本文关键字:情况下 获取 堆栈 跟踪 方法 全局 Lua | 更新日期: 2023-09-27 18:32:56

在使用Lua进行扩展性的游戏中,当脚本中抛出错误时,我想向用户显示错误日志,即错误消息和堆栈跟踪,有点像这样:

if (lua_pcall(L, nargs, nresults, 0) != 0) log.printline(lua_tostring(L, -1));

但是,这只会打印错误消息,而不会打印调用堆栈。

我知道我可以使用debug.traceback,即通过 API 从调试表中获取函数然后调用它,但由于安全问题,我根本不想加载调试表,即允许恶意用户编写与系统和其他全局表搞砸的脚本。(出于同样的原因,我不加载io而是公开我自己的函数。

我没有使用任何类型的桥接器,我直接使用 Lua API,通过 P/Invoke。

如何在失败的lua_pcall调用后打印堆栈跟踪,而不必向最终用户公开调试表?

Lua:在没有全局方法的情况下获取堆栈跟踪

调用luaL_traceback:

void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level);

创建并推送堆栈 L1 的回溯。如果 msg 不是 NULL,则会追加在回溯的开头。level 参数指示在哪个级别开始回溯。

您可能想使用 L1=L .有关使用示例,请参阅lua.c的来源。

lua_pcall中的第 4 个参数是错误处理程序。因此,您可以在此函数中调用一些类似debug.traceback的想法来获取堆栈跟踪并在此函数中登录。