Некоторые мысли о том, что может быть неправильным. Вы передаете L
за lua_pcall
, а LuaErrorReport
вместо этого принимает State()
. Они могут работать с разными lua_State
, которые могут произойти, как в контексте сопрограммы. Если это преднамеренно, по крайней мере, укажите, почему это делается.
lua_pushvalue
внутри LuaErrorReport
также выглядит подозрительно. Как вы знаете, что нижнее значение в стеке содержит сообщение, которое вы сообщаете? Эта функция вызывается из других функций, которые могут накапливать больше значений в стеке. Я бы либо изменить, что
lua_pushvalue(L, -3);
или
lua_pushstring(L, msg);
Наконец, следует также с учетом прохождения debug.traceback
как функции ошибки в lua_pcall
получить сообщение об ошибке более значимое StackTrace. Что-то вроде:
void LUA::PerformCall(int return_amount)
{
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_remove(L, -2);
int errindex = -p_iArgCount - 2;
lua_insert(L, errindex);
int error = lua_pcall(L, p_iArgCount, return_amount, errindex);
// ...
И избавиться от debug.trace
вызова в LuaErrorReport
.
Эй, спасибо за ответ. Весь код находится в классе LUA, который имеет частный член lua_State * L. Он также имеет публичную функцию lua_State * State(), которая возвращает L. Я не думаю, что это вызывает ошибку. Завтра я попробую отдохнуть. – Freakyy
Я проверил код и все работает сейчас. Большое спасибо. – Freakyy
У меня есть другой вопрос. Когда ошибка обрабатывается функцией обработки ошибок, происходит ошибка (ее спам консоли). Любой способ остановить это? – Freakyy