我们正在使用多台计算机,执行以c/C++编码的程序并使用lua api,并且每个计算机都会因不同的错误而崩溃。它通常是一个分段错误,它的回溯导致我们调用bululua函数,或者通常在尝试调用一个nil值的时候给出它,就像它是一个函数一样。Lua C api:太多lua_states导致错误?
奇怪的是,直到我们达到了许多国家(不,我们绝对需要多个国家中,只有一个是不够的)的它工作得很好。他们可能会引用相同的文件-again,它可以正常工作,直到不到多个状态打开或不打开。
这里是他们是如何打开,登记,并关闭,万一有使用多种状态时有些不对劲:
lua_State *state=lua_open();
luaL_openlibs(state)
luaL_loadfile(filename.c_str());
...
lua_register(state,"function",function); //dozens of them
...
lua_close(state);
创建任何其他状态,直到所有的寄存器都做了,无论是封闭或不取决于国家在哪里使用。
这就是我分割故障期间得到:
#0 0x0013fe79 in ??() from /usr/lib/liblua5.1.so.0
#1 0x0013325b in lua_pushlstring() from /usr/lib/liblua5.1.so.0
#2 0x001442ba in ??() from /usr/lib/liblua5.1.so.0
#3 0x00144b61 in luaL_pushresult() from /usr/lib/liblua5.1.so.0
#4 0x00144de5 in luaL_gsub() from /usr/lib/liblua5.1.so.0
#5 0x0014fb52 in ??() from /usr/lib/liblua5.1.so.0
#6 0x0014ffb7 in ??() from /usr/lib/liblua5.1.so.0
#7 0x0013839a in ??() from /usr/lib/liblua5.1.so.0
#8 0x00138834 in ??() from /usr/lib/liblua5.1.so.0
#9 0x001337a5 in lua_call() from /usr/lib/liblua5.1.so.0
#10 0x0014f3ea in ??() from /usr/lib/liblua5.1.so.0
#11 0x0013839a in ??() from /usr/lib/liblua5.1.so.0
#12 0x00138834 in ??() from /usr/lib/liblua5.1.so.0
#13 0x00133761 in ??() from /usr/lib/liblua5.1.so.0
#14 0x00137ea3 in ??() from /usr/lib/liblua5.1.so.0
#15 0x00137f05 in ??() from /usr/lib/liblua5.1.so.0
#16 0x00133588 in lua_pcall() from /usr/lib/liblua5.1.so.0
和相关代码:
lua_getglobal(L,"require");
lua_pushstring(L,"function");
if(!lua_pcall(L,1,0,0))
{
...
给出的函数的字符串是没有错的,它工作正常用不到打开的州数。
当它输出“nil value”错误时,这意味着我们没有在程序内部使用相关的lua_register调用,但是对于所有其他状态它都是一样的,并且它们再一次没有任何问题地工作。
我认为这可能是由于一些内存泄漏,我真的不明白为什么因为所有的状态都关闭。
这与lua api本身有关吗?(就像有可能一次打开一个预定数量的状态,也许)?我知道我没有提供太多的细节,但这几乎是所有与lua有关的代码。
编辑:我忘了包括“require”语句(我称之为推模块),但它已经在代码中(因此,不是它不起作用的原因),对此很抱歉。
程序是单线程的。一些对象具有lua状态作为它们的属性,因此具有多个状态。
该错误消息表示无法找到它应该使用的文件......这实际上是那里再次,可以没有任何问题较少的状态打开使用。
确保您使用LUA_APICHECK进行编译以在运行时捕获一些错误。如果您可以将代码缩减为具有相同问题的小示例,请在此处发布完整代码,并且可能还会通过电子邮件发送lua列表。 – u0b34a0f6ae 2010-07-09 13:29:54
是否存在多个线程或只有一个线程驱动多个状态? – 2010-07-09 19:19:18
为了确保我们不会错过真正显而易见的事情,在关闭它之后,请注意不要使用Lua状态*,对吗?这样做不可避免地会带来某种错误,但墨菲可能会让事情暂时停滞不前。 – RBerteig 2010-07-12 22:30:30