c# - Lua:在没有全局方法的情况下获取堆栈跟踪

标签 c# lua

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

最佳答案

调用luaL_traceback :

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

Creates and pushes a traceback of the stack L1. If msg is not NULL it is appended at the beginning of the traceback. The level parameter tells at which level to start the traceback.

您可能想使用 L1=L。查看source lua.c 的使用示例。

关于c# - Lua:在没有全局方法的情况下获取堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35173278/

相关文章:

c# - 如何在没有任何权限检查的情况下从相对路径获取最小绝对路径?

c++ - Lua 脚本 - 再次运行

windows - 是否有允许构建独立可执行文件的 Lua IDE?

lua - 为什么 _VERSION 返回 "Luau"而不是 "Lua 5.1"并且为什么 += 运算符突然起作用?

c# - 如何在 C# 中使用 NUnit 编写 stub 方法

c# - 为什么 ASP.NET Core Startup 类不是接口(interface)或抽象类?

linux - ubuntu 权限被拒绝

lua - Lua中的@at符号是什么意思?

c# - LINQ First/FirstOrDefault 是否迭代整个可枚举?

c# - 在 asp.net 中使用 C# 将数据添加到数据库