Lua:获取不含全局方法的堆栈跟踪

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

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

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

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

我没有使用任何桥接技术,我直接通过 P/Invoke 使用 Lua API。

我该如何在 lua_pcall 调用失败后打印堆栈跟踪,而无需向最终用户公开 debug 表?

点赞
用户2328287
用户2328287

在 lua_pcall 中的第四个参数是错误处理程序。因此,您可以在此函数中调用类似于 debug.traceback 的内容,以获取堆栈跟踪并在此函数中记录。

2016-02-03 10:04:32
用户107090
用户107090

调用luaL_traceback:

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

创建并推送L1堆栈的回溯。如果msg不为NULL,则在回溯开头附加它。level参数告诉从哪个级别开始回溯。

您可能希望使用L1=L。请参见lua.c源码以获得用法示例。

2016-02-03 11:05:55