【问题标题】:Lua 5.2 compiled with MINGW32 crashes my host program when a Lua error occurs发生 Lua 错误时,使用 MINGW32 编译的 Lua 5.2 使我的主机程序崩溃
【发布时间】:2013-11-11 10:13:50
【问题描述】:

使用 MINGW32 编译 Lua 5.2 会创建一个库 (lua52.dll),当发生 Lua 错误时,该库可能会使主机应用程序崩溃。

我通过在测试脚本中出现 Lua 语法错误检测到了这个错误。如果脚本完全没有错误,则主机程序成功运行它。但是,当加载无效脚本时(例如,在 IF 块中缺少 THEN),主机程序崩溃了。

这是我的代码片段:

//Load the script    
int status = luaL_loadfile(L, "foo.lua");
if (status == 0) {
    //Run the script
    ....
} else {
    warn("LUA script error: %d. %s", status, lua_tostring(L, -1));       
    lua_pop(L, 1);
}    

如果脚本没有语法错误,status为0,脚本成功执行。否则,luaL_loadfile 不会返回,程序会崩溃。

【问题讨论】:

    标签: c lua mingw32


    【解决方案1】:

    问题出在 Lua 的 Makefile 中指定的 CFLAGS 中。最初,src/Makefile 包含以下行:

    CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)
    

    问题改成:

    CFLAGS= -O2 -fno-omit-frame-pointer -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)
    

    解释

    Lua 的错误处理基于函数setjmplongjmp 的使用。 -O2 优化标志隐式地使编译器成为omit the frame pointer。为避免这种情况,我们通过 -fno-omit-frame-pointer 覆盖此设置。

    希望这会有所帮助。

    【讨论】:

    • 这之前已经报道过:lua-users.org/lists/lua-l/2011-10/msg00549.html。还是谢谢。
    • 哦,很高兴我最终得到了相同的解决方案!我无法通过谷歌搜索找到这个问题,所以我决定在 StackOverflow 中发布这条消息。还是谢谢你!
    猜你喜欢
    • 2011-01-04
    • 2014-11-22
    • 2013-03-31
    • 2012-09-19
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多