1

我想debug.traceback()在c++中调用lua函数来获取c++中的trackback信息,所以我在c++中添加了这样的函数:

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()正确使用的建议?或者我该如何调试这个问题,因为我完全不知道它是怎么出错的。

4

1 回答 1

1

用 a 注册的 C 函数lua_State应该返回它们推入堆栈的返回值的数量。你的函数没有返回任何东西(到 Lua 堆栈),而是告诉 Lua 它推送了一个值。因此,Lua 会在你的函数完成后弹出一个值并将其传递给调用者。可能弹出的值是您打算调用的值,但最终却调用了堆栈上的下一个东西 - 一个数字。

尝试用适当的return 1语句替换return 0并仔细考虑每个语句之前的堆栈内容,return以确保您不会弹出任何内容。

于 2012-09-26T09:49:15.430 回答