Wie finde ich den Fehler?

Thomasio

Erfahrenes Mitglied
Ich habe eine Anwendung, die in einer Schleife immer wieder das Selbe macht.
Irgendwo da drin stürzt das Ganze ab, aber nicht jedes Mal, eher selten, und immer verschieden oft.
Mal läuft das Ganze 10 Mal, mal läuft es 1000 Mal ohne Probleme, aber irgendwann kommt die berühmte Windows-Fehlermeldung "Diese Anwendung hat einen Fehler verursacht und muss geschlossen werden."
Mit Debug-Modus geht da wohl nicht viel, also wie komme ich dahinter, wo im Code er abstürzt?
 
Der Code verarbeitet einen string mit wechselndem Inhalt, die Funktion dazu ist ewig lang, an die 1000 Zeilen.
Ich vermute, dass ich irgendwo einen leeren Wert verwende, wo das nicht geht, array sort mit einem leeren array, weil ich vergessen habe if(array.size() > 1) drumrum zu bauen, oder sowas ähnliches.
 
Warum soll mit dem Debugmodus da nicht viel gehen?
So findest du wenigstens die Stelle heraus, an der der Absturz kommt.

Und ohne Code, egal wie lang, können wir dir auch nicht helfen...
 
Das Problem ist, es dauert ewig.
Gerade im Moment läuft die Schleife seit 4 Stunden ohne Absturz und die kann auch noch viel länger laufen, der Rekord liegt bei 2 Monate.
Bis ich auf die Art mit einem try/catch den Fehler finde habe ich 3 Jahre zu tun.

Ich werd mal schauen, ob ich den Code halbwegs übersichtlich rauskopieren kann, wenn ichs schaffe poste ich ihn hier.
 
[...] die Funktion dazu ist ewig lang, an die 1000 Zeilen[...]

Dann solltest du als erstes an deinem Programmierstil arbeiten. Ich zitiere hier mal meinen guten Bekannten Niklaus Wirth, als ihm die Frage gestellt wurde, ob er sagen kann, dass ein Programm immer funktioniert:
Ich kann Ihnen nicht sagen, ob Ihr Programm fehlerfrei ist. Ich kann Ihnen jedoch mit einer Frage sagen, dass es einen Fehler hat. Hat es mehr als 50 Zeilen?
 
Was hat das Eine mit dem Anderen zu tun?
50 Zeilen ist wohl etwas übertrieben, aber dass ein Programm bei über 50 Zeilen leicht Fehler enthalten kann ist wohl jedem klar.
Es gibt aber so gut wie kein Programm, was weniger als 50 Zeilen hat, ein leeres Fenster unter Windows hat schon um die 200 Zeilen, in OOP um die 400 Zeilen.
Ein komplettes Programm wie Wordpad oder andere Windows-Programme hat leicht 500 000 Zeilen oder noch mehr und die haben definitiv eine Menge Bugs.
Sollte deswegen jetzt Microsoft seinen Programmierstil ändern?

Natürlich ist das alles in Klassen und Funktionen aufgeteilt, die sind nochmal aufgeteilt in Subklassen und Subfunktionen und irgendwo ganz unten landet man bei SubSubSubfunktionen, die nur noch 10 Zeilen oder so haben.
Aber wenn ich ein Problem in einer Funktion habe, die ihrerseits ein Dutzend weitere Funktionen aufruft, dann müsste ich, um den Code hier verständlich zu machen, alle diese Funktionen hier posten, auch dann wenn diese Subfunktionen definitiv funktionieren und das ergibt dann 1000 Zeilen.
Ich glaube nicht, dass es irgendein halbwegs seriöses Programm gibt, wo das anders wäre.

WENN ich aber hier 1000 Zeilen Code poste, von denen 950 nur fürs Verständnis nötig sind, dann brauche ich schon eine Stunde um die Funktionen zusammenzusuchen, und dann wird sich kaum einer der wirklich netten Helfer hier da durch arbeiten, weil er dafür vermutlich Stunden brauchen würde.

Schon klar, dass Hilfe in dem Fall schwierig ist, ich wollte von Anfang an keine Hilfe ala in Zeile 123 fehlt ein Komma, ich wollte gundsätzliche Methoden solche Fehler einzugrenzen, wie z.B. try und catch, ich wusste halt nicht, ob es eine Methode gibt, die in diesem Fall schneller oder besser ist als try und catch.
Keine Ahnung wie das aussehen könnte, irgendwas, was Ausnahmefehler abfängt und als Letztes vorm Crash genauere Angaben ausgibt.

Immerhin habe ich mit try und catch über Nacht den Fehler schon etwas eingrenzen können, weil es (zum Glück?) nur 8 Stunden bis zum Crash gedauert hat.
Jetzt läuft das Ganze innerhalb dieser Grenzen wieder vor sich hin und wenn der Fehler wieder halbwegs schnell auftaucht, werde ich ihn auch finden.
 
Hi.

Warum verwendest du denn nicht einen JIT Debugger?

Oder du baust in deinen Code die Möglichkeit ein, ein Minidump zu erstellen, den du dann später mit WinDbg untersuchen kannst.

Hast du schonmal nach Speicherlecks geschaut?

Gruß
 
Ein JIT Debugger? Ähm, ja, wenn ich wüsste was das ist oder wie man das verwendet?

Wie erstellt man bei crash einen Minidump solange man nicht mal weiss, wo oder wann es crasht?

Speicherlecks habe ich keine, zumindest nichts was im Taskmanager sichtbare wäre, CPU, Speicher, Handles, GDI Objekte, usw., alles stabil ohne Veränderung während der gesamten Laufzeit, ist auch logisch, weil die Funktion nichts anderes macht als diesen string zu verarbeiten und alle anderen Funktionen im Moment deaktiviert sind.
 
Zurück