Lua:没有全局方法就可以获得堆栈跟踪

时间:2016-02-03 09:38:16

标签: c# lua

在使用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调用失败后打印堆栈跟踪,而不必将调试表公开给最终用户?

2 个答案:

答案 0 :(得分:3)

致电luaL_traceback

  

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并登录这个函数。