crash - Lua:如何正确清理 lua_pcall 返回的错误

标签 crash lua stack-overflow

Lua 的崩溃问题已经有一段时间了,我终于发现了我认为的问题所在。为了方便起见,我允许脚本省略试图调用的函数。我希望我的应用程序尝试调用 TestFun(作为示例),如果它存在则执行它,否则优雅地静默失败。

我遇到的问题是我只是调用了 lua_pcall(L, 0, 0, 0) 并忽略了返回值,因为这对我来说无关紧要。我发现的是,当 Lua 生成错误“attempt to call nil”时,它会将它放在堆栈上,而我并没有弹出它。由于堆栈大小增长太大,下面的代码在运行后不久出现崩溃:

int _tmain(int argc, _TCHAR* argv[])
{
    std::string script = "";
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_loadstring(L, script.c_str());
    lua_pcall(L, 0, LUA_MULTRET, 0);

    while (true)
    {
        lua_getglobal(L, "TestFunc");
        lua_pcall(L, 0, 0, 0);
    }

    return 0;
}

我只是将 while 循环中的代码修改为:

while (true)
{
    lua_getglobal(L, "TestFunc");
    if (lua_pcall(L, 0, 0, 0))
        lua_pop(L, -1);
}

这解决了我的崩溃问题。我的问题是这是否在所有 lua_pcall() 错误结果的情况下都有效,或者我是否通过不专门检查我是否应该 pop -1(或可能其他?)来为另一个错误/崩溃做好准备。也许我应该只在 -1 是一个字符串时弹出,或者可能有一个标准的“清理堆栈”函数我可以调用?

谢谢

最佳答案

除了需要弹出 1 而不是 -1 之外,您修改后的代码很好。

关于crash - Lua:如何正确清理 lua_pcall 返回的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530056/

相关文章:

java - XML 文档转换 StackOverflowError

Android:不幸的是应用程序已停止

Lua字符串,在每个备用索引处插入一个整数

c++ - Wireshark Dissector VoidString 类型

string - 检查字符串是否以 Lua 中的特定模式开头和结尾

java - 使用图形填充颜色时出现 StackOverFlowException - 包含代码

recursion - 无限循环和没有停止条件的递归函数何时最终停止?

crash - Java 7支持的应用程序在Mojave上崩溃

java - jvm 在使用 jni 从 java 类读取 arraylist 时崩溃

Qt 应用程序在没有调试信息的情况下立即崩溃。我如何追踪问题?