Sto sviluppando un programma che utilizza Lua per lo scripting e talvolta si blocca. Con GDB penso di aver trovato il problema, ma non so se lo ha risolto, poiché il segfault si sarebbe verificato solo sporadicamente. Così, il vecchio codice era questo:Lua: può causare un segfault
void Call(std::string func){
lua_getglobal(L, func.c_str()); //This is the line GDB mentioned in a backtrace
if(lua_isfunction(L,lua_gettop(L))) {
int err = lua_pcall(L, 0, 0,0);
if(err != 0){
std::cout << "Lua error: " << luaL_checkstring(L, -1) << std::endl;
}
}
}
Il fatto è che questa funzione sarebbe chiamato un paio di volte al secondo, ma la funzione di cui ha bisogno per chiamare, non è sempre definito, così ho pensato che la pila sarebbe traboccare. Ho aggiunto la riga seguente:
lua_pop(L,lua_gettop(L));
E il segfault non si è più verificato. Questo potrebbe essere stato il problema?
Va notato che in Lua-> C la transizione lua garantisce di avere una pila nuova e in quel C-> lua la transizione lua assicura che lo stack sia ripulito da qualunque cosa tu abbia lasciato su di esso è necessario un bilanciamento in questi punti (potrebbe comunque essere una buona pratica). Finché si rimane in C, tuttavia, è richiesta la gestione dello stack (e il bilanciamento dello stack delle funzioni). –