отладка Lua.traceback

Я хочу вызвать функцию 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()? Или как я могу отладить эту проблему, потому что я совершенно не понимаю, как она идет не так.


person Listen    schedule 26.09.2012    source источник


Ответы (1)


Функции C, зарегистрированные с помощью lua_State, должны возвращать количество возвращаемых значений, которые они помещают в стек. Ваша функция ничего не возвращает (в стек Lua), но сообщает Lua, что она отправила одно значение. В результате Lua вытолкнет значение после завершения вашей функции и передаст его вызывающей стороне. Вероятно, выталкиваемое значение — это то, что вы намеревались вызвать, но вместо этого вызвали следующую вещь в стеке — число.

Попробуйте заменить соответствующие операторы return 1 на return 0 и внимательно подумайте о содержимом стека перед каждым return, чтобы убедиться, что вы ничего не выталкиваете.

person mtsvetkov    schedule 26.09.2012