Я хочу вызвать функцию lua debug.traceback()
в С++, чтобы получить информацию об обратной связи в С++, поэтому я добавил функцию в С++ следующим образом:
int luaErrorHandler(lua_State *m_state) {
if (!lua_isstring(m_state, 1))
return 1;
lua_getfield(m_state, LUA_GLOBALSINDEX, "debug");
if (!lua_istable(m_state, -1)) {
lua_pop(m_state, 1);
return 1;
}
lua_getfield(m_state, -1, "traceback");
if (!lua_isfunction(m_state, -1)) {
lua_pop(m_state, 2);
return 1;
}
lua_pushvalue(m_state, 1); /* pass error message */
lua_pushinteger(m_state, 2);
lua_call(m_state, 2, 1); /* call debug.traceback */
return 1;
}
а затем я использую lua_pushcfunction(L, luaErrorHandler)
, чтобы поместить его в стек, и использую lua_insert()
, чтобы переместить функцию в конец, затем lua_pcall(L, nArgs, 1, errIndex)
, чтобы вызвать функцию lua. На данный момент стек должен быть таким: ..luaErrorHandler, func, arg1, arg2....
Проблема в том, что когда я вызвал функцию, функция каким-то образом изменила стек внутри себя (я думаю..), поэтому я получаю ошибку «попытка вызвать числовое значение», и она проходит правильно, когда я не использовал обработчик ошибок функция. Есть ли какой-нибудь совет, как правильно использовать debug.traceback()
? Или как я могу отладить эту проблему, потому что я совершенно не понимаю, как она идет не так.