Unterschied zwischen "Debug" und "Run"

Status
Nicht offen für weitere Antworten.

JFreak

Bekanntes Mitglied
Hallo,

ich implementiere gerade ein kleines Programm in Eclipse und habe Ewigkeiten im Debugger nach einem Fehler gesucht. Nun ist mir aufgefallen, dass es gar kein Fehler war, sondern das sich das Programm im Debug-Modus (F11) und im Run-Modus (Ctrl-F11) anders verhält. Wenn mich nicht alles täuscht, ist Java doch sowohl determiniert als auch deterministisch... Was ist da los?

Ich arbeite hauptsächlich mit Set<String>. Meine Hauptdatenstruktur ist Set<Set<String>,Set<String>>. Schon beim Initialisieren treten Unterschiede auf:
Code:
[d, c]->[f, e, b]
[e]->[b, c, a]
[f]->[d, c]
[c]->[d, a]
[a]->[b, c]
(run)
Code:
[f]->[d, c]
[d, c]->[f, e, b]
[a]->[b, c]
[e]->[b, c, a]
[c]->[d, a]
(debug)

Ich verändere nichts an der Ausgangssituation... Das ist sehr, sehr seltsam.

Grüße,

Lars
 

Wildcard

Top Contributor
Ich habe zwar keine Ahnung was du uns mit diesen Code Blöcken sagen willst, aber vermutlich ist deine Run Configuration eine andere als deine Debug Configuration
 

JFreak

Bekanntes Mitglied
Ich initialisiere meine Datenstruktur mit diesen Werten und habe sie testweise gleich ausgeben lassen. Offensichtlich gibt es da Unterschiede, wie das HashSet die Strings sortiert.
Run- und Debug-Configuration habe ich unangetastet gelassen, aber nach drüberschauen kann ich keinen Unterschied feststellen. Welcher Schalter könnte das sein? Bei Compiler- und VM-Argumenten gibt es jedenfalls keinen, die sind überall leer.
 
M

maki

Gast
>> Set<Set<String>,Set<String>>

Wassol denn das sein?
Sowas gibt's doch gar nicht in Java, zumindest nicht mit Set, oder meintest du Map?
 

Wildcard

Top Contributor
Vielleicht startest du auch nichtmal die gleiche Klasse. Es wird entweder anhand deiner aktuellen Selektion versucht die passende Configuration zu ermittlen, oder (je nach Einstellung) die zuletzt gestartete.
 

JFreak

Bekanntes Mitglied
Habe mich vertippt... Es ist so etwas wie Map, genauer gesagt Set<FD>, wobei FD eine nicht-statische innere Klasse ist, die als Attribute zwei Set<String>s hat.

[EDIT2] Link zum fehlerhaften Code entfernt.
 

Wildcard

Top Contributor
Dich stört die Reihenfolge? hashCode sagt folgendes:
Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
Da steht nicht das es bei 2 Programmstarts den selben Wert liefert.
 

JFreak

Bekanntes Mitglied
Hmpf. So ein Zufall kommt ja selten... Beim "Run" hat die Reihenfolge der einzelnen Objekte einen Bug überdeckt, der nur beim "Debug" zum Vorschein kommt. Die Idee mit dem hashCode hat mich drauf gebracht.

[gelöst]
 
M

maki

Gast
Beim "Run" hat die Reihenfolge der einzelnen Objekte einen Bug überdeckt, der nur beim "Debug" zum Vorschein kommt.
Welcher Bug war denn das?
Und wieso kommt der nur bei Debug vor?

Persönlich bin ihc kein Fan von Debuggern, eher als Notlösung.
Unittests & Logging bringen imho mehr.
 

JFreak

Bekanntes Mitglied
Das ist die Berechnung der kanonischen Überdeckung einer Menge von funktionalen Abhängigkeiten bei einer Relation. Grob gesagt ist eine funktionale Abhängigkeit (FD) eine Abbildung von einer Menge von Spalten einer Tabelle auf eine andere Menge. Für diese Abbildungen gelten nun Transitivität etc.
Für eine Menge von FDs möchte man nun erreichen, dass diese minimal ist. Also entfernt man Elemente aus der Abbildung und sieht nach, ob alles noch funktioniert, d. h. ob keine Information verlorengeht. Der Algorithmus entfernt schrittweise. Weil ich aber während des Iterierens über ein Set keine strukturellen Veränderungen machen darf, habe ich ein zweites Set, welches sich die Änderungen "merkt" und am Ende der Berechnung zurückschreibt. Dummerweise hatte ich vergessen, die Änderungen nach jedem Schritt rückgängig zu machen, damit immer dieselben Ausgangsbedingungen herrschen. Es war also ein Zufall, dass es bei "Run" geklappt hat. Tatsächlich scheinte der Debugger andere Speicherbereiche zu verwenden als im "Run"-Modus, daher hat sich der Hashcode geändert, dadurch wiederum die Reihenfolge im Set, dadurch die Abarbeitungsreihenfolge im Algorithmus...

Im Entstehen eines Programmes bin ich doch recht froh, dass Java für solch mächtige Debugging-Features ausgelegt ist. Unittest bringen eher zur Fehlerentdeckung etwas als zur Fehlersuche. Logging finde ich persönlich für solche Zwecke unhandlich, aber für eine echte Aussage darüber habe ich noch zu wenig damit gearbeitet.

[EDIT] vgl: http://paste.frubar.net/9551 (neu) und http://paste.frubar.net/9550 (alt)
 
M

maki

Gast
Unittest bringen eher zur Fehlerentdeckung etwas als zur Fehlersuche.
Das wüde ich nicht unterschreiben, widerspricht meiner Erfahrung.

Trotzdem ist es schräg & verunsichernd das Programme im Debug Mode anders laufen als im "Normalmodus", noch nein Grund von Debugging abstand zu halten imho.
 

Zed

Bekanntes Mitglied
Ich nehme mal an dein Set war ein HashSet und deine Map war eine HashMap. Die beiden garantieren keine feste Reihenfolge. LinkedHashSet und LinkedHashMap dagagen schon.

Und zum Thema Hashcode der ist immer gleich ausser das Programm wurde neu gestartet.
 
M

maki

Gast
Seltsamerweise hat das Programm immer identische Werte & Reichenfolgen produziert, der Unterschied war einzig und allein zwischen Run und Debug.
 

Wildcard

Top Contributor
maki hat gesagt.:
Seltsamerweise hat das Programm immer identische Werte & Reichenfolgen produziert, der Unterschied war einzig und allein zwischen Run und Debug.
Der Default Hashcode verwendet Speicheradressen. Durchaus möglich das beim Eclipse Debug andere Speicheradressen verwendet werden um das hot swapping zu ermöglichen.
Ist doch aber auch völlig egal ob Run immer die gleichen Werte produziert, wenn etwas als unsortiert deklariert ist, sollte man keinerlei Annahmen über die Reihenfolge treffen.
 

JFreak

Bekanntes Mitglied
Eben das war ja das Problem, es war ein Bug, der in einer gewissen Reihenfolge (nämlich die bei Run) nicht aufgetreten ist. Wenn Unittest so wärmstens empfohlen werden, dann sehe ich die mir mal genauer an.
 
M

maki

Gast
Speziell testgetribenes Vorgehen (Test Driven Development) hat viele Vorteile.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
M Unterschied zwischen Win 7/2008R2 und Win8.1/2012R2? Allgemeine Java-Themen 8
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
D Exakte Unterschied zwischen diesen Elementen? Allgemeine Java-Themen 5
N Unterschied zwischen "Java" und "Java mit Eclipse" Allgemeine Java-Themen 17
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
Lufti Unterschied zwischen Djava.library.path und Class-Path im Manifest? Allgemeine Java-Themen 2
B Unterschied zwischen Klasse und Objekt? Allgemeine Java-Themen 8
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
O Unterschied zwischen Semaphoren/Lock und ExecutorService Allgemeine Java-Themen 3
I Unterschied zwischen Applet und JApplet Allgemeine Java-Themen 2
R Der Unterschied zwischen 2.1 und 2.10 Allgemeine Java-Themen 2
P Was ist der Unterschied zwischen JSP und Servlet ? Allgemeine Java-Themen 4
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2
M Unterschied zwischen // und \\ Allgemeine Java-Themen 6
E Unterschied zwischen Adapterklassen und abstracten Klassen? Allgemeine Java-Themen 5
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
P Unterschied Java SE und Java EE Allgemeine Java-Themen 2
J Unterschied: Polymorphie und Dynamisches Binden Allgemeine Java-Themen 8
VfL_Freak JDK installieren Unterschied zw. JDK 8_151 und 8_152 Allgemeine Java-Themen 3
T Unterschied Oracle JDK 8u111 8u112 Allgemeine Java-Themen 3
W Unterschied Standalone und Applet Allgemeine Java-Themen 1
O [log4J] Unterschied SocketServer <-> SimpleSocketServer Allgemeine Java-Themen 0
M Unterschied CPU Auslastung Allgemeine Java-Themen 0
N Unterschied Hobby-Codung und Professionelle Softwareentwicklung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
G UnterSchied OpenJDK vs JDK Allgemeine Java-Themen 11
G Unterschied MyClass.class vs this Allgemeine Java-Themen 2
H Unterschied EventQueue.invoke... und thread.start() Allgemeine Java-Themen 4
Semox Unterschied bei Thread Erstellung Allgemeine Java-Themen 11
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
G Unterschied Enterprise Anwendung und Web Anwendung Allgemeine Java-Themen 30
Q Unterschied der Logger Allgemeine Java-Themen 9
G Unterschied Long - Int Allgemeine Java-Themen 9
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
M Unterschied der java.exe des JDK und der JRE Allgemeine Java-Themen 15
K Unterschied Compilierung Eclipse 3.2 und Ant Allgemeine Java-Themen 3
V Unterschied FileOutputStream und FileWriter? Allgemeine Java-Themen 8
B Unterschied: jar <-> konsole Allgemeine Java-Themen 9
G Unterschied abstrakte Klasse und Interface? Allgemeine Java-Themen 3
T abstract - interface Unterschied Allgemeine Java-Themen 22
K Unterschied Core Java / Desktop Allgemeine Java-Themen 12
J Unterschied PrintJob & PrinterJob Allgemeine Java-Themen 11
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
N Unterschied Calendar und GregorianCalendar Allgemeine Java-Themen 9
T Unterschied Dämon - Thread (läuft später auf RMI hinaus...) Allgemeine Java-Themen 6
B Unterschied: Java - Java 2 Allgemeine Java-Themen 5
B (String) und toString(), woliegt der Unterschied? Allgemeine Java-Themen 4
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
B Sent and Receive Funktionen zwischen Objekten ermöglichen? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
Kirby.exe Schauen ob ein Kante zwischen Knoten existiert Allgemeine Java-Themen 4
L Schlüsselworte Wie kann ich am Besten ein LocalDate zwischen Anfangs und EndDate checken Allgemeine Java-Themen 10
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
N Kollision zwischen ImageIcon und Rechteck Allgemeine Java-Themen 1
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
B Zufällig zwischen vorgegebenen Zahlen auswählen Allgemeine Java-Themen 6
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
L Kommunikation zwischen C# und Java? Allgemeine Java-Themen 5
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
S Eclipse Abhängigkeiten zwischen den Projekten in Eclipse Allgemeine Java-Themen 2
G nervendes Problem mit unterschieden zwischen Javax64 und x86 | je nach Programmbedarf beides nötig Allgemeine Java-Themen 2
S Threads Kommunikation zwischen SocketThread und WorkerThread Allgemeine Java-Themen 11
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
B Unteschiede zwischen Kantenoperatoren Allgemeine Java-Themen 3
A Kommunikation zwischen 2 Jar-dateien Allgemeine Java-Themen 16
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
Z zeit zwischen maus drücken und loslassen Allgemeine Java-Themen 7
C Komisches Verhalten zwischen Set und List bei contains Allgemeine Java-Themen 6
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
N Gridbaglayout - Abstände zwischen Komponenten einstellen Allgemeine Java-Themen 2
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
X Bild im Memory zwischen speichern Allgemeine Java-Themen 11
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
S Assoziation zwischen 2 klassen Allgemeine Java-Themen 14
V Threads & Pipes Datenaustausch zwischen Threads Allgemeine Java-Themen 2
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
E kommunikation zwischen Fenstern Allgemeine Java-Themen 3
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
S Datenformat zum Austausch zwischen Java und Python? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben