Ваш обработчик ошибок может быть перезаписан. Если вы вызываете Lua из C, чтобы всегда печатать стек, вы можете подключиться к функции luaG_errormsg.
В Lua написать:
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
Тогда в ldebug.c, добавить к luaG_errormsg после если (! L-> errfunc = 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);
}
}
Спасибо, я буду экспериментировать с вашими рекомендациями. В связи с этим я вижу, что некоторые ссылки на списки рассылки на «pcall и сопрограммы не ладят». Я использую сопрограммы, следует ли использовать coxpcall и copcall? – proFromDover