【问题标题】:Lua: get stack trace without global methodsLua:在没有全局方法的情况下获取堆栈跟踪
【发布时间】:2016-05-12 10:15:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你总是可以对 Lua 进行沙盒处理,因为我不相信还有其他方法。
  • 除非 xpcall 能帮上忙(?)我没怎么搞砸
  • 您不必为了访问debug.traceback而加载整个调试库。

标签: c# lua


【解决方案1】:

致电luaL_traceback:

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

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

您可能想使用L1=L。使用示例见lua.csource

【讨论】:

【解决方案2】:

lua_pcall 中的第四个参数是错误处理程序。所以你可以在这个函数中调用一些像debug.traceback 这样的想法来获取堆栈跟踪并登录这个函数。

【讨论】:

  • 出于安全考虑,我无法从 Lua 函数调用 debug.traceback。这就是整个问题。
猜你喜欢
  • 2013-12-31
  • 2013-08-03
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2016-09-03
  • 2010-10-31
相关资源
最近更新 更多