Autor Beitrag
holgerbremen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 120



BeitragVerfasst: Di 09.11.10 08:52 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
holgerbremen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 120



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.11.10 20:58 
user profile iconholgerbremen hat folgendes geschrieben Zum zitierten Posting springen:
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.