Programm hängt sich manchmal (selten) auf

Samuel72

Aktives Mitglied
Hallo zusammen,

ich habe das Spiel "Risiko" programmiert.
Offensichtlich ist da irgendwo ein Fehler:
Wenn den Computer gegen sich selbst spielen lasse (ein Spiel dauert ca. 70ms), hängt sich das Programm etwa in einem von 200 Spielen auf.
Mein Problem ist: Da der Fehler so selten auftritt, tue ich mir schwer, irgendwelche Anhaltspunkte zu finden, wo nun der Fehler steckt.

Wenn der Spiel-Thread nach 1000 ms nicht terminiert hat, kann ich davon ausgehen, dass er sich aufgehängt hat.
Meine Frage: Gibt es nun eine Möglichkeit, von außen festzustellen, wo der Thread feststeckt?

Ich bitte um Verständnis, dass ich keine Code poste. Das Projekt ist sehr umfangreich, und wenn ich einen Anhaltspunkt hätte, wo der Fehler steckt, dann hätte ich ihn wohl schon gefunden.
 
Hast du mit mehreren Threads gearbeitet?
Könnte an einem Deadlock liegen.
Ansonsten fällt mir bei diesen Informationen nicht mehr ein.
Meine Frage: Gibt es nun eine Möglichkeit, von außen festzustellen, wo der Thread feststeckt?
So direkt, meines Wissens nach: nein.
Aber du könntest an strategisch wertvollen Stellen Breakpoints setzen, und schauen ob du das Problem auch im Debugger reproduzieren kannst.
 
Ich würde da eher mit Debugausgaben arbeiten. Gibt zwar eine große Menge Text in der Consoloe aber da sieht man sofort was der letzte System.out war und kann entsprechend eingrenzen
 
Ich würde da eher mit Debugausgaben arbeiten. Gibt zwar eine große Menge Text in der Consoloe aber da sieht man sofort was der letzte System.out war und kann entsprechend eingrenzen
Ich hab damit angefangen, bin allerdings noch nicht recht weiter gekommen.

Immerhin: Einen Fehler habe ich inzwischen entdeckt:
Ich habe eine enum La für die 42 Länder und zu Berechnungszwecken
etwa
Code:
Map<La, Integer> truppen1, truppen2
Vergleiche habe ich fälschlicherweise durchgeführt mit
Code:
 truppen1.get(land)==truppen2.get(land)
was (bei gleicher Anzahl) fast immer true ergibt, aber eben nicht immer.
 
Ah, das dürft dann eine Eigenheit von Integer sein. Meines Wissens gibt es da einen Pool. Ähnlich dem String Pool. Keine Ahnung wie der genau funktioniert, aber es lässt sich folgendes feststellen:

Code:
Integer one;
Integer two;

one = 1;
two = 1;
System.out.println(one == two);

one = 127;
two = 127;
System.out.println(one == two);

one = 128;
two = 128;
System.out.println(one == two);

System.out.println(one.intValue() == two.intValue());

Ausgabe:
true
true
false
true

Für Literale bis 127 scheinen die Integers ge-poolt zu werden. Bei größeren Werten werden wohl neue Instanzen erzeugt. Um sicher zu gehen benutze ich bei sowas immer den Rückgabewert ( intValue() ). Wie in der letzten Codezeile.
 
Interessant. Kommt denn Integer#valueOf() auch zum Einsatz beim Initialisieren á la:
Code:
Integer i = 100;
? Vom Verhalten her, könnte man schon davon ausgehen...
 
Nett. Das bestätigt ja das, was ich als Post#6 geschrieben habe. Gut zu wissen, dass es dafür eine offizielle Beschreibung gibt.
 

Neue Themen


Zurück
Oben