GCCollect() stürzt ab...
Übersicht

![]() |
FirstdeathmakerBetreff: GCCollect() stürzt ab... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Irgend jmd. ne Ahnung was den GCCollect() zum Absturz bringen könnte?
Hab hier in nem großen Programm das Problem, das es nach dem Beenden eines Levels beim Aufruf von GCCollect() hängen bleibt. Ich benutze GC im Mode 2 (also manuelles Aufrufen). Edit: Ach ja, single-Threaded. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ungewissenhafte nutzen von Pointern und/oder Pointern in verbindung mit C-Libs. Ansonsten ist es nicht möglich, den GC aus dem takt zu bringen. | ||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Doch da gibt es noch diverse andere Möglichkeiten. Sollte ich mal ne Liste zu schreiben, bei der umfangreichen Erfahrung, die ich damit gemacht habe. xD
Spontan fallen mir dazu noch Probleme in Delete()-Methoden ein, deren Fehler nicht direkt erkannt werden und den GC ohne Hinweis abkacken lassen. |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja genau so etwas hab ich hier wohl. Liegt definitiv nicht an C-lib pointern, weil ich diese in dem Teil des Programmes nicht benutze. Das Problem habe ich durch ausprobieren schon ziemlich weit eingekreist, aber ich seh einfach nicht was es verursacht. Folgende Version funktioniert (remove() sind meine Destruktoren):
Code: [AUSKLAPPEN] Method remove()
Print "TObjectController.remove() init()" GCCollect() Assert Not _removed, "TObjectController.remove() trying to remove it twice" For Local obj:TObject = EachIn Self.objects obj.remove() Next 'objects = null For Local objs:TObjectSet = EachIn Self.objectSets objs.remove() Next 'objectSets = Null Print "TObjectController.remove() call GCCollect" GCCollect() level = Null print "TObjectController.remove() finished" End Method Aber wenn ich den oberen GCCollect rausnehme, dann crasht er beim unteren. Alles in Allem lösche ich immer nur Listen und Links (über RemoveLink(l:TLink)). @ Ava: Für ne Liste wäre ich echt dankbar (und ich denke andere hier auch) |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da du vor dem oberen GCCollect noch überhaupt nichts gemacht hast, ist die Crash-Ursache nicht in diesem Code-Teil zu finden. Oder hast du eine Delete-Method, die rein zufällig diese remove-funktion aufruft? Unter gewissen umständen könnte dies eventuell zu einer endlos-schleife führen. | ||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich benutze generell keine delete-methoden, weil diese ja nur dazu da sind, mem freizugeben den man manuell reserviert hat, wenn ich das richtig verstanden habe. Meine Taktik ist also nur, alle Verlinkungen zu entfernen, sodass das Objekt vom Garbage-Collector geschnappt wird.
Also wie gesagt, wenn ich den oberen GC-Collect rausnehme, dann crasht es beim unteren Aufruf des gc's. Der Fehler muss also in diesem Teil liegen, bzw. ich muss etwas machen was mit den vorhergegangenen Aktionen zusammen den GC abschießt. Leider ist das ganze viel zu groß um das hier zu posten... |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Methode heißt remove und ruft weitere remove-Methoden auf... sicher das da keine Kreis-Beziehung entsteht ? | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja, weil der Code ja noch durchläuft (terminiert) und es eine Hirarchische Beziehung ist. Wenn ich das untere GCCollect ganz woanders weiter hinten plaziere, stürzt es auch ab.
Dazu noch etwas: Ich habe mein Program in States strukturiert, also für jeden Menübildschirm ein State und für das Spiel selbst auch einen State namens Game_sc Dieser Gamestate beinhaltet eine Instanz von TLevel. TLevel beinhaltet eine Instanz von TObjectController, aus welchem die gepostete remove() methode stammt. Wenn der State Game_sc beendet wird, wird seine remove() methode aufgerufen. Dieser ruft dann level.remove() auf, welches wiederrum den objectManager.remove() ausführt. Wenn ich das GCCollect jetzt in den komplett nächsten State verfrachte, und zwischendrin keine weiteren GCCollects() kommen, dann stürzt er in dem anderen State ab. D.h. der Code läuft bis dorthin durch, ohne Schleifen! Was ich auch schon überprüft habe: Ob Links vllt. doppelt removed wurden, ob vllt. noch irgendwelche Verbindungen nicht genullt werden (bei jedem Objekt sind nach dem remove() aufruf ALLE Verbindungen, egal ob listen, normale links oder TLink's entfernt und genullt). |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die tatsache, dass das erste GCCollect bereits crasht, bevor irgend etwas in der methode gemacht wurde, ist ja wohl ein eindeutiges zeichen, dass der Fehler nichti n der methode liegt.
Übrigens ist es nicht nötig, GCCollect manuell aufzurufen, ausser für messungen. der GC bekommt das schon ganz gut alleine hin. |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo bitte habe ich geschrieben, dass es beim ersten GCCollect() crasht? Es crasht immer erst beim zweiten, wenn ich den ersten rausnehme. Lasse ich den drin, dann crasht es überhaupt nicht.
Und ich benutze den manuellen GCCollect, damit ich besser nach Memoryleaks suchen kann. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group