HintergrundLua, C++ und verschwinden Metatables
ich mit Watusimoto Bitfighter auf dem Spiel arbeiten. Wir verwenden eine Variation von LuaWrapper, um unsere C++ - Objekte mit Lua-Objekten im Spiel zu verbinden. Wir verwenden auch eine Variante von Lua, genannt lua-vec, um Vektoroperationen zu beschleunigen.
Wir haben seit einiger Zeit daran gearbeitet, einen Fehler zu beheben, der uns entgangen ist. Zufällige Abstürze werden auftreten, die korrupte Metatables vorschlagen. Siehe here für Watusimotos Beitrag zu diesem Problem. Ich bin nicht sicher, dass es wegen einer korrupten Metatabelle ist und habe ein wirklich merkwürdiges Verhalten gesehen, über das ich hier fragen möchte.
Das Problem Äusserung
Als Beispiel erstellen wir ein Objekt, und fügen Sie es wie folgt auf ein Niveau:
t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
jedoch wird das Spiel manchmal (nicht immer) zum Absturz bringen. Mit einem Fehler:
attempt to call missing or unknown method 'addItem' (a nil value)
einen Vorschlag in Antwort gegeben Verwendung zu Watusimoto der Post oben erwähnt, habe ich die letzte Zeile wie folgt geändert:
local ok, res = pcall(function() levelgen:addItem(t) end)
if not ok then
local s = "Invalid levelgen value: "..tostring(levelgen).." "..type(levelgen).."\n"
for k, v in pairs(getmetatable(levelgen)) do
s = s.."meta "..tostring(k).." "..tostring(v).."\n"
end
error(res..s)
end
Dies gibt die Metatabelle für levelgen
wenn etwas, wenn falsch, eine Methode von ihm aufzurufen.
Allerdings, und das ist verrückt, wenn es fehlschlägt und die Metatabelle ausdruckt, die Metatabelle ist genau, wie es (mit dem richtigen addItem
Anruf und alles) sein sollte. Wenn ich die Metatabelle für levelgen
beim Laden von Skript drucken, und wenn es oben pcall
nicht funktioniert, sind sie identisch, jeder Aufruf und Zeiger auf Benutzerdaten ist identisch und wie es sein sollte.
Es ist, als ob das Metatable für levelgen
spontan zufällig verschwindet.
Würde jemand eine Idee haben, was los ist?
Danke
Hinweis: Dies nicht nur mit dem levelgen
Objekt geschieht. Zum Beispiel ist es auch auf dem oben erwähnten Objekt passiert. In der Tat, stürzt das gleiche Code auf meinem Computer an der Linie levelgen:addItem(t)
aber stürzt auf einen anderen Computer des Entwicklers mit der Linie t:setText("hello")
mit der gleichen Fehlermeldung missing or unknown method 'setText' (a nil value)
Haben Sie versucht, Ihren Code unter Valgrind auszuführen? Sie haben möglicherweise ein Speicherbeschädigungsproblem von C++. – nneonneo
Hallo, ja, wir haben es jetzt mehrere Male durch valgrind laufen lassen, und nachdem wir die Speicherfehler behoben haben, die dort waren (in nicht verwandtem Code), hat das Problem immer noch bestanden – raptor
Sehr neugierig. Können Sie das Problem auf einen kurzen Testfall reduzieren? – nneonneo