Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Exception - Codezeile finden
holgerbremen - Di 09.11.10 08:52
Titel: Exception - Codezeile finden
Ich habe ein Anwendung, in der 8 Threads alle 10 Sekunden gestarten werden, diverse Aufgaben erledigten und dich dann beenden. Auf meinem Entwicklungsrechner läuft die Anwendung ohne Probleme, jedenfall lief sie 15 Stunden. Auf einem Testrechner bekomme ich nach ca. 10 Minuten eine Exception mit der Adresse, wo die Exception aufgetreten ist. Gehe ich im Debugmode zu der Adresse (Suchen-Zu Adresse springen) gelange ich in Sysutils zu der Sprungmarkte "@@S2IsUnicode:". Anscheinend wird ein Stringvergleich gemacht, der fehlschlägt. Das Problem ist nun, wie erfahre, wo der Fehler bei mir im Code aufgetreten ist. Hat jemand eine Idee, wie man am Besten vorgehen kann.
Xion - Di 09.11.10 09:29
Prinzipiell sollte dir ein LogFile da helfen. Immer wenn eine Funktion aufgerufen wird z.B. ballerst du den Namen der Funktion mit Uhrzeit und Parametern in eine TextDatei. Ob mehrere Threads auf die gleiche Datei zugreifen können...fraglich.
Ich hab mir mal sowas gebaut, das schickt die "Log-Zeilen" an eine andere Anwendung per Message. So würde man auf jeden Fall alles in eine Datei bzw MemoFeld bekommen.
Auf diesen Weg solltest du rauskriegen welche Funktion schuldig ist. Danach kannst du dann die einzelnen Befehle überprüfen.
Es kann natürlich auch sein, dass du irgendwo in einem array außerhalb des zulässtigen Bereichs zumschreibst, was erstmal nicht stört, bis dann jemand anderes seinen Speicher lesen will...huch was ist denn da passiert *Exception*
Dann hast du allerdings ein größeres Problem ;) Das zu finden ist ziemlich schwer...vielleicht kann man im Debugger irgendwo Bereichsprüfung einstellen?
Martok - Di 09.11.10 09:35
Zum Loggen gibts OutputDebugString, wenn man das unbedingt will.
Wichtiger wäre hier aber der CallStack eines abstürzenden Threads, da bieten sich MadExcept oder EurekaLog an. Die können den dann ausgeben, je nach Einstellungen als Dialog oder direkt in ein CrashLog.
holgerbremen - Di 09.11.10 10:57
Ich logge schon ziemlich viel in der Datenbank. Da die Anwendung später als Dienst läuft, muss ich diverse Kontrollmöglichkeiten haben. Da Logging kann ich stufenweise ein oder ausschalten.
MadExcept nutzt ich schon. Nur der bringt mir in diesem Fall nicht viel. Kein Hinweis auf Module der Proceduren. Nur die Adresse bekomme ich.
Ich könnte im Prinzip für jeden Thread ein Logfile stellen und alles Loggen. Wäre aber schon ein Aufwand. Beim Letzten Absturz gab mir Madexcept eine Hinweis auf die Procedure "MultiByteToWideChar". Dort ist der Fehler aufgetreten. Die Funktion rufe ich nicht selber auf, irgendwo in den Innereien erfolgt wohl der Aufruf. Íst aber auf jeden Fall schon mal ein Hinweis.
Momentan kommierte ich stufenweise Code aus, um zu sehen wann der Fehler nicht mehr auftritt. Ist nur recht mühselig.
Ich hatte mir gerade mal EurekaLog angeschaut. Hat damit jemand schon Erfahrungen?
BenBE - Di 09.11.10 19:36
Jep. Hab damit Erfahrungen und finde es gegenüber MadExcept, aber das ist ne persönliche Meinung. Wobei man wissen sollte, dass bei EurekaLog in der Backtrace-Routine einige Opcodes fehlen und damit der Stacktrace u.U. unvollständig sein kann. Aber das stört meist nicht, da die wesentlichen Fälle erfasst werden. Aber normal ist es egal, welches von beiden man nimmt, solange man nicht nur die Exception selbst, sondern auch den Backtrace mal anschaut.
jaenicke - Di 09.11.10 20:58
holgerbremen hat folgendes geschrieben : |
Ich habe ein Anwendung, in der 8 Threads alle 10 Sekunden gestarten werden, diverse Aufgaben erledigten und dich dann beenden. |
Also erstens:
Wie wäre es mit einem Threadpool? Jedesmal die Threads erzeugen und wieder beenden hört sich nicht so gelungen an.
Und zweitens:
Benutzt du vielleicht Resume und FreeOnTerminate? Dann solltest du dir einmal die entsprechenden Beiträge im Forum von Embarcadero und in der DP anschauen. Das kann böse ins Auge gehen.
Und da wären wir wieder bei einem Threadpool, der die Threads ordentlich organisiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!