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()
正しい使い方のアドバイスはありますか?または、この問題をデバッグするにはどうすればよいですか。どのように問題が発生するのかまったくわかりません。