首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lua debug.traceback

lua debug.traceback
EN

Stack Overflow用户
提问于 2012-09-26 13:08:12
回答 1查看 3.3K关注 0票数 1

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

代码语言:javascript
复制
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()有什么建议吗?或者我如何调试这个问题,因为我完全不知道它是如何出错的。

EN

回答 1

Stack Overflow用户

发布于 2012-09-26 17:49:15

注册到lua_State的C函数应该返回它们推送到堆栈的返回值的数量。您的函数不会返回任何内容(到Lua堆栈),但会告诉Lua它推送了一个值。因此,Lua将在函数完成后弹出一个值,并将其传递给调用者。可能弹出的值就是您打算调用的值,但最终却调用了堆栈中的下一个对象-一个数字。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12594892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档