使用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
不会返回,程序崩溃。
答案 0 :(得分:3)
问题出在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的错误处理基于函数setjmp
和longjmp
的使用。 -O2
优化标志隐式地使编译器变为omit the frame pointer。为避免这种情况,我们通过-fno-omit-frame-pointer
覆盖此设置。
希望这有帮助。