1

c++ でlua 関数を呼び出してdebug.traceback()、c++ でトラックバック情報を取得したいので、次のように 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 に答える