在使用Lua进行扩展的游戏中,当在脚本中抛出错误时,我想向用户显示错误日志,即错误消息和堆栈跟踪,如下所示:
node_modules
这只打印错误消息,而不是调用堆栈。
我知道我可以使用if (lua_pcall(L, nargs, nresults, 0) != 0) log.printline(lua_tostring(L, -1));
,即通过API从调试表中获取函数然后调用它,但由于安全问题,我根本不想加载调试表,即允许恶意用户编写与系统和其他全局表一致的脚本。 (出于同样的原因,我不加载debug.traceback
而是公开我自己的函数。)
我没有使用任何类型的桥,我直接使用Lua API,通过P / Invoke。
如何在io
调用失败后打印堆栈跟踪,而不必将调试表公开给最终用户?
答案 0 :(得分:3)
void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level);
创建并推送堆栈L1的回溯。如果msg不为NULL,则会在回溯的开头附加。 level参数告诉在哪个级别开始回溯。
您可能想要使用L1=L
。有关使用的示例,请参阅lua.c
的{{3}}。
答案 1 :(得分:0)
lua_pcall中的第四个参数是错误处理程序。所以你可以在这个函数中调用一些像debug.traceback
这样的函数来获取stacktrace并登录这个函数。