Su controlador de errores puede sobrescribirse. Si llama a Lua desde C, para imprimir siempre la pila, puede enganchar en la función luaG_errormsg.
En lua, escribir:
local _HandlingError = 0
function _ErrorHandler (errobj)
if(_HandlingError == 0) then
_HandlingError = 1
local errStr = tostring(errobj) or ""
if(type(errobj)=='table') then
errStr = "Table: {" .. table.concat(errobj, ',') .. "}"
end
print("Error: \"" .. errStr .. "\"")
--for k,v in pairs(_G) do print("GLOBAL:" , k,v) end
if(type(errobj)=='thread') then
print(debug.traceback(errobj))
else
print(debug.traceback('',2))
end
_HandlingError = 0
end
return false
end
Luego, en ldebug.c, añadir a luaG_errormsg después if (! L-> funcerr = 0)
else
{
lua_getfield(L, LUA_GLOBALSINDEX, "_ErrorHandler");
if (!lua_isfunction(L, -1)) {
lua_pop(L, 1);
}
else {
lua_pushvalue(L, 1);
lua_call(L, 2, 1);
lua_pop(L, 1);
}
}
Gracias, voy a experimentar con sus recomendaciones. Relacionado con esto, veo algunas referencias en listas de correo para "pcall y las corutinas no se llevan bien". Uso coroutines, ¿debería usar coxpcall y copcall? – proFromDover