Fehlerfindung GUI

JUNIT200

Mitglied
Hallo,

ich arbeite in einem Softwarehaus und bin in der Java Programmierung eher Anfänger. Ich habe folgendes Problem. Es wurde von mir eine Anwendung mit GUI geschrieben. Das Programm friert seit kurzem beim Kunden ab und zu ab. Also er kann es nur über den Taskmanager schließen. Es friert nicht immer an der gleichen Stelle ab. Wie kann ich den hier den Fehler finden? Was hilft da am besten? Einen logger integrieren? Welche Möglichkeiten gibt es da effektiv, auf Fehlersuche zu gehen.

Danke für eure Hilfe!
 

Thallius

Top Contributor
Schreibe ein Batch file welches das jar über eine Konsole startet und lass dir dann vom Kunden die konsolenausgabe geben wenn das programm abstürzt.
 

mrBrown

Super-Moderator
Mitarbeiter
Das klingt eher so, als stürzt es gar nicht ab, sondern hängt einfach nur. Ich würde da auf irgendwelche RaceConditions/Deadlocks im GUI-Thread tippen...

Logger kann immer helfen, man muss halt nur die Stellen finden, an denen Logging sinnvoll ist.
UU hilft schon CodeAnalyse wie zB findbugs, oder sinnvolle Tests (was man beides sowieso machen sollte ;))
 

Mikael

Neues Mitglied
Mein Vorgesetzter sagt auch das es wohl ein Deadlock ist.....nur wie finde ich die Stelle? Bezüglich eine Batchdatei.....wie gehe ich da vor?
 

mrBrown

Super-Moderator
Mitarbeiter
Du müsstest mit jstack -F -l <pid> einen Thread-Dump bekommen können, in dem sind alle Locks aufgeführt. Wenn sich zwei blockieren, dürfte das da zu finden sein, du musst natürlich bei dir den Fehler reproduzieren können, oder den Kunden das machen lassen.

PMD/Findbugs laufen lassen, die finden manchmal auch solche Fehler.

Und ansonsten noch mal händisch das ganze Programm durchgehen, alle Locks die du setzt prüfen auf Reihenfolge etc. und uU ein paar sleeps einbauen, um DeadLocks zu provozieren.
 
Zuletzt bearbeitet:

JUNIT200

Mitglied
Hallo,

wisst ihr was das Problem ist. Wir haben hier im Unternehmen einen Framework....wo im Hintergrund die ganze GUI Verarbeitung funktioniert. Also d.h ich weiß nicht wo überall Threads laufen. Über Findbugs habe ich nichts gefunden....andere Ideen? Bin schon am verzweifeln...
 

JUNIT200

Mitglied
Die Threads vom Framework müssten ja auch angezeigt werden.
Ansonsten frag doch jemandem vom Unternehmen, das grenzt ja schon fast an Business support hier.

Sorry wenn die Frage vielleicht dumm ist. Aber wo bzw wie gehe ich am besten vor um diesen Deadlock zufinden. Wo werden die Threads angezeigt? Hast du für mich vielelicht ein Link, wo ich mich einarbeiten kann. Danke im voraus. Mich kann man eigentlich als Anfänger in Java sehen. Arbeite erst seit paar Monaten im Unternehmen und mir fehlt natürlich noch viel wissen.
 

stg

Top Contributor
Hättest du alle Antworten gelesen, dann wüsstest du jetzt, was der nächste Schritt sein könnte. Tipp: Schau dir insbesondere Beitrag Nr. 5 noch einmal an...
 

JStein52

Top Contributor
Das Kommando gibst du genau so in einem Command-Fenster ein. die Prozess-Id deiner GUI musst du dir z.B. über den Taskmanager raussuchen. Und wenn sie dort nicht angezeigt wird musst du das über "Ansicht-> Spalten auswählen" noch aktivieren.
 

JUNIT200

Mitglied
Das Kommando gibst du genau so in einem Command-Fenster ein. die Prozess-Id deiner GUI musst du dir z.B. über den Taskmanager raussuchen. Und wenn sie dort nicht angezeigt wird musst du das über "Ansicht-> Spalten auswählen" noch aktivieren.


Wenn ich es so angebe jstack -F -l <972> im cmd kommt syntaxfehler.

Und so jstack -F -l 972 befehl onnte nicht gefunden werden. Wo ist das problem?
 

JStein52

Top Contributor
Gib mal jstack ohne Parameter ein ? Stimmt deine PATH-Variable ? Findet er z.B. java wenn du das im Kommand-Fenster aufrufst ?
 

JStein52

Top Contributor
Ach ja: du brauchste ein JDK auf deinem Rechner, JRE reicht nicht ...

Edit: was steht denn bzgl. Java in deiner PATH-Variablen ?
 

Meniskusschaden

Top Contributor
Vielleicht enthält deine PATH-Variable ein Verzeichnis wie C:\ProgramData\Oracle\Java\javapath, in dem sich Verknüpfungen zu beispielsweise java.exe, javaw.exe etc. befinden, jedoch keine Verknüpfung zur jstack.exe.
 

JUNIT200

Mitglied
java.exe / javaw.exe und jstack.exe befinden sich alle im gleichen ORdner "C:\JAVA\JDK-1-8-Aktuell\bin "

Mein PATH Variable lautet:

Name der Variable: JAVA_HOME
Wert der Variable: C:\JAVA\JDK-1-8-Aktuell\
 

JUNIT200

Mitglied
also meine Path Variable ( unten) sieht so aus

C:\ProgramData\Oracle\Java\javapath;C:\Java\JRE-1-8-Aktuell\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%systemroot%\System32\WindowsPowerShell\v1.0\;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin
 

JStein52

Top Contributor
Da haben wir es ja schon ! In JAVA_HOME kann stehen was will wenn du in deiner path-Variablen das JRE referenzierst findet er jstack natürlich nicht
 

JStein52

Top Contributor
Übrigens könnte das Thema evtl. auch ein Problem bei eurem Kunden werden wenn er kein JDK installieren will. denn du musst das ganze letzten Endes ja beim Kunden aufrufen
 

VfL_Freak

Top Contributor
Moin,

zudem frage ich mich, wo eigentlich die seltsame Benennung herkommt ??
Normalerweise sollte das Verzeichnis bspw. so heißen: jre1.8.0_102 und in C:\Programme\Java\ liegen .....

Gruß Klaus
 

VfL_Freak

Top Contributor
Ich bin mir nicht so sicher, ob wirklich alle Einstellungen und Pfade wirklich sauber angepasst werden, wenn man den Installationspfad ändert!
Wir hatten hier auch schon mal ein Problem damit ...

Gruß Klaus
 

JStein52

Top Contributor
Mhmm, ich habe schon länger da nichts mehr per Hand gesetzt und es hat mindestens die letzten paar Updates problemlos überstanden (unter c:\java\.... ). Und wenn man es richtig macht steht im path sowieso %JAVA_HOME%\bin drinnen.
 

JUNIT200

Mitglied
Hallo,

also ich habe es soweit hinbekommen, das ich selber auf die Anwendung über den Server draufkomme. Das auftrende Problem tritt bei mir selber nicht auf. Da der Kunde(öffentlicher Dienst) nur mit JRE arbeitet funktioniert es mit Jstack nicht. Jetzt wollte ich fragen, wie ich am besten vorgehen kann um das Problem zu finden? Soll ich einen logger integrieren? Aber wie geht den das am besten? Gibt es da ne Möglichkeit einen Logger zu integrieren der mir alle Exceptions automatisch protokolliert? Oder muss ich das an jeder möglichen Stelle selber definieren?

Danke für eure Hilfe
 

thecain

Top Contributor
Jdk beim kunden installieren/einrichten... Wenn jetzt noch kein logger drin ist brauchts sowieso eine neue version. Zudem bringt der Logger wahrscheinlich eh nichts, wenn du micht weisst wo suchen.
 

JStein52

Top Contributor
Das mit dem jdk installieren wird nicht gehen. Ich kenne das weil wir auch für die Justiz arbeiten und da würden 3 Jahre vergehen bis ein Entschluss dazu gefasst ist, falls überhaupt. Die Kunden stehen nämlich zu recht auf dem Standpunkt das ist doch euer Problem, seht zu wie ihr das hinkriegt.
Zu deiner Frage mit den Exceptions: Wie werden denn Exceptions zur Zeit behandelt ? Wenn sie gefangen werden aber nichts weiter getan damit dann hilft dir ein Logger nichts. Im allgemeinen und besonders wenn die Anwendung etwas längerlebiges ist das weiterentwickelt und gewartet wird ist der Einbau eines Logging-Systems aber auf jeden Fall zu empfehlen, auch wenn es im ersten Wurf ein bisschen Action wird.
 

JUNIT200

Mitglied
Das mit JDK installieren geht nicht, da das wirklich sehr lange dauert bis es eventuell installiert wird. Ich habe da keine Rechte was zu installieren. Also wie wäre eure Idee um das Problem am schnellsten zu lösen bzw zu finden. Ich habe die Anwendung hier bei mir(mit der gleichen DB) , hab da vorher getestet. Aber dieses Einfrieren passiert bei mir nicht....

Excpeptions werden gefangen aber nicht weiter behandelt....
 

Joose

Top Contributor
Also wie wäre eure Idee um das Problem am schnellsten zu lösen bzw zu finden.
Bei sowas ist es immer ratsam ein Gerät zu haben das dem Stand eines Kunden PC entspricht was Hardware und Software angeht (nicht 100% 1:1 aber näher als ein Entwickler PC).

Ansonsten eine genaue Beschreibung liefern lassen bei welchen Tätigkeiten bzw. nach welchen Tätigkeiten (bestimmte Aktionen im UI) oder laden bestimmter Daten das Einfrieren passiert. (je mehr unterschiedliche User hier Beschreibungen liefern können umso besser)
Du als Entwickler der Anwendung solltest ca. wissen was bei diesen Tätigkeiten für Code ausgeführt wird und ob dort etwas mit Threads/Deadlocks oder mögl. Endlosschleifen passiert und an diesen Stellen würde ich eben ansetzen. --> Logging einbauen, zusätzliche Prüfungen/Bedingungen einbauen um mögliche Deadlocks oder ähnliches zu verhindern.

Excpeptions werden gefangen aber nicht weiter behandelt....
Schlecht -> mindesten loggen sollte man sie!
 

stg

Top Contributor
Im allgemeinen und besonders wenn die Anwendung etwas längerlebiges ist das weiterentwickelt und gewartet wird ist der Einbau eines Logging-Systems aber auf jeden Fall zu empfehlen, auch wenn es im ersten Wurf ein bisschen Action wird.

Sei doch nicht so zaghaft mit der Wahrheit. Die Wahrheit ist doch ganz einfach, dass, wenn da wirklich ein System beim Kunden gelandet ist ohne gescheites Logging, dann hat da jemand in der Projekt-Leitung gewlatig scheiße gebaut. Bei so einer Aktion sollte man sich in keinster Weise auch nur ansatzweise wundern, wenn man deswegen seinen Job verliert.

Der besagten Firma muss es ja prächtig gehen, dass die eigene Reputation und Kunden, die zuverlässig zahlen, so egal sind. So was unprofessionelles würde ich allerhöchstens von irgendeiner Studi-Start-Up-Kitsche erwarten.

Ich habe die Anwendung hier bei mir(mit der gleichen DB) , hab da vorher getestet. Aber dieses Einfrieren passiert bei mir nicht....
Selbst ausführen und ein bisschen rumklicken hat nichts mit Testen zu tun. Sondern einfach nur mit sinnlosem ausführen und rumklicken.


Also wie wäre eure Idee um das Problem am schnellsten zu lösen bzw zu finden.
Testen.

Excpeptions werden gefangen aber nicht weiter behandelt....
Ohne Worte...

Da kommt so viel zusammen, dass ich eigentlich nur glauben kann und will, dass es sich beim TE entweder um einen Troll handelt, der gerade ein bisschen langedweile hat. Oder dass es das besagte Problem eigentlich gar nicht gibt bzw es vorsätzlich herbeigeführt wird, um zu schauen, ob/wie der TE eine Lösung findet.
 

JStein52

Top Contributor
Wir haben z.B. für jedes Bundesland ein dem Kunden möglichst 1:1 passendes Gerät da stehen. Aber erfahrungsgemäss ist es schwierig den gleichen Datenbestand wie der Kunde zu haben (bei uns sogar unmöglich, Datenschutz !) also nutzt es bei kniffligen Dingen nichts sooo viel. Ich will aber nicht sagen es ist sinnlos.

Und die Frage ob es sich um einen Deadlock oder eine Endlosschleife handelt sollte jetzt auch jetzt
schon zu klären sein indem man im Fehlerfall mal im Taskmanager nachsieht ob der Prozess CPU-Zeit frisst. (habt ihr wahrscheinlich schon geklärt)
und an diesen Stellen würde ich eben ansetzen. --> Logging einbauen
Ich würde falls das möglich ist (Versionsplanung etc.) generell ein Loggingsystem einbauen denn früher oder später wird es andere Probleme geben die du darüber dann auch viel leichter findest. Und dieses Logging würde ich jetzt erst mal von Grund auf neu entwerfen also nicht nur im Hinblick auf den aktuellen Fehler.
 

JUNIT200

Mitglied
Nur mal als info das ist ein "interner Kunde" als unser Fachbereich... und das Programm wird nicht veröffentlicht sondern wird intern als hilfstool genutzt.

Ich habe den Fehler jetzt doch selber auch erhalten:

java.io.IOException: Server returned HTTP response code: 500 for URL: http://y-XXX/XXXXtool/Servlet
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.access$200(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessController.doPrivilegedWithCombiner(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at XXXX.soap.SoapObjekt.aufruf(SoapObjekt.java:290)
at XXXX.soap.SoapObjekt.aufruf(SoapObjekt.java:246)
at XXXX.client.Funktion.aufruf(Funktion.java:94)
at client.data.Artikelliste.initTable(Artikelliste.java:538)
at client.data.Artikelliste.<init>(Artikelliste.java:96)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at XXXX.client.Client$Aktivieren.run(Client.java:614)
at java.lang.Thread.run(Unknown Source)


jemand ne Idee?
 

Ähnliche Java Themen

Neue Themen


Oben