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
调用后打印堆栈跟踪,而不必向最终用户公开调试表?
调用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
的想法来获取堆栈跟踪并在此函数中登录。