当给定脚本出现语法错误时,luaL_dostring()崩溃
我尝试在Cortex-M4上使用GCC将Lua集成到嵌入式项目中。我能够加载并运行Lua脚本,从C调用Lua函数,从Lua调用C函数。但是,当luaL_dostring()中作为参数传递的给定脚本包含任何Lua语法错误时,C程序崩溃(HardFault_Handler陷阱上升) 以下是由于Lua中的语法错误而崩溃的相关C代码:当给定脚本出现语法错误时,luaL_dostring()崩溃,lua,Lua,我尝试在Cortex-M4上使用GCC将Lua集成到嵌入式项目中。我能够加载并运行Lua脚本,从C调用Lua函数,从Lua调用C函数。但是,当luaL_dostring()中作为参数传递的给定脚本包含任何Lua语法错误时,C程序崩溃(HardFault_Handler陷阱上升) 以下是由于Lua中的语法错误而崩溃的相关C代码: //create Lua VM... luaVm = lua_newstate(luaAlloc, NULL); //load li
//create Lua VM...
luaVm = lua_newstate(luaAlloc, NULL);
//load libraries...
luaopen_base(luaVm);
luaopen_math(luaVm);
luaopen_table(luaVm);
luaopen_string(luaVm);
//launch script...
luaL_dostring(luaVm, "function onTick()\n"
" locaal x = 7\n" //syntax error
"end\n"
"\n" );
当使用正确的Lua语法执行相同操作时,它将起作用:
luaL_dostring(luaVm, "function onTick()\n"
" local x = 7\n"
"end\n"
"\n" );
当调试和单步执行luaL_dostring()时,我可以一行一行地跟踪Lua解析,当到达带有语法错误的行时,C程序崩溃
有人能帮忙吗?谢谢
以以下方式禁用Lua源代码中的
setjmp/longjmp
:
//#define LUAI_THROW(L,c) longjmp((c)->b, 1) //TODO oli4 orig
//#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } //TODO oli4 orig
#define LUAI_THROW(L,c) while(1) //TODO oli4 special
#define LUAI_TRY(L,c,a) { a } //TODO oli4 special
…因此不再使用setjmp/longjmp,但我仍然有崩溃:-(
一定有其他原因???发现了问题:这是在Lua语法错误上调用的sprintf函数。事实上,在我的平台上sprintf似乎不支持浮点表示。因此我用以下方式更改了luaconf.h,将表示形式限制为整数格式
//#define LUA_NUMBER_FMT "%.14g"
#define LUA_NUMBER_FMT "%d"
一定还有别的原因
是的:你不能在这里使用Lua
Lua的错误处理系统建立在setjmp/longjump
的框架上。你不能只让LUAI_抛出和LUAI_尝试
什么都不做。这意味着Lua_错误
和所有内部错误处理停止工作。语法错误是Lua内部错误处理的一部分
如果您的C编译器没有为C标准库提供适当的支持,那么Lua将无法在该环境中正常运行。您可以尝试LuaJIT,但我怀疑这会更好。您的平台是否支持longjmp
?此程序在运行时是否崩溃:错误“boom”
?该平台是ST microelectronics的STM32F4。它似乎支持longjmp(比方说:它在使用这些函数时进行编译)。但事实上,Lua在运行错误“foo”时崩溃。所以似乎longjmp不能正常工作???在我看来,longjmp
是第一件要看的东西。我用setjmp/longjmp
在我的平台上跳出一个函数进行了一些简单的测试,它可以正常工作。我同意。我的目标不是禁用Lua错误处理。我只是暂时禁用了它,以隔离错误原因。