Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi ihr,
Bevor ich jetzt in eine Mailinglist poste, wollte ich erstmal hier fragen, da hier ja auch ein oder zwei leute sind, die erfahrung mit Lua haben.
Ich habe hier ein Problem. Und zwar bekomme ich bei lua_pcall [edit2]zwischen dem 450. und 550.[/edit2] aufruf einer Funktion eine SigSegV / AccessViolation.
Auf dem Stack liegen zwei dinge, erstens die Funktion und zweitens eine Userdata, die einen Pointer auf ein Objekt erhält (sollte vorher verifiziert werden), mit einer Metatabelle, die ein paar "Methoden" deklariert. Um genau zu sein, diese Funktionen holen sie die Userdata vom Stack, dereferenziert sie und ruft die entsprechende Methode vom Objekt auf.
[edit]Achja, den Virtuellen Lua-Stack habe ich geprüft. Kein Over/Underflow. Und wenn ich nil anstatt der Userdata pushe, gehts auch ohne weiteres.[/edit]
Das kurioseste ist, dass ich überhaupt nichts mit der Userdata mache. Sie wird an die Funktion als Parameter übergeben und die Funktion kehrt sofort zurück, ohne irgendetwas zu machen. Ich habe sicherheitshalber auch einfach mal zu beginn jeder "Methode" ein WriteLn gesetzt, die werden alle nicht aufgerufen.
Hat hier irgendwer eine Idee, wie das zustande kommen kann oder wende ich mich besser an eine Mailinglist?
Gruß Lord Horazont
P.S.: Da hier ja nur zwei oder drei Leute (oder täusche ich mich da?) mit Lua arbeiten, wäre ich auch für "Keine Ahnung"-Meldungen von denen dankbar, damit ich weiss, dass das hier wenigstens gelesen wurde
[edit3]
Nochmal zu der "nummer" der aufgerufenen Funktion. Das scheint irgendwie stärker zu variieren, als ich angenommen habe, vorallem, wenn ich die "Aufrufrate" (kommt durch Partikel zu stande) erhöhe bzw senke. Wenn ich die anzahl der Partikel und somit auch die Aufrufe pro Sekunde verdopple, kommt es eine ganze Zeit lang nicht zu dem Fehler (mehrere Minuten). Wenn ich sie allerdings halbiere, tritt der Fehler ungefähr bei der gleichen "Aufrufnummer" auf wie auch bei dem Ausgangswert...
[/edit3]
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
I used lua, but i do not anymore.
What are those numbers you are refering to? 440 550?
What does your userdata look like?
And as always some example source code helps.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
The numbers were the count of calls to lua_pcall before the error occured, but I solved the problem now.
The userdata objects were Instances of a particle class. The problem were that the userdatas were hold in memory until the next garbage collection and so the pointers to the objects were held there. The reason for the crash was that the garbage collection reached an userdata whose object was freed. The garbage collection handler function in the metatable tried to call a function of the object and the sigsegv occured.
I added now an instance counter for the objects so that they are not freed until all lua instances have been collected. For this I added a new method called SafeFree which sets a boolean which indicated that the application does not need this object anymore and checks if there are any lua instances. If so, nothing more is done, else the object gets freed. In the garbage collector I check now if the collected userdata was the last instance. If so, I free the object.
I hope I have not overseen any free or leak but I think it should work now.
I have not posted code because there are too many classes and methods involved since I was not able to find out the exact point of crash.
greetings Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.