Durch Kombination von Protokollierung und Ablaufverfolgung von Ausnahmen. Das würde bedeuten, dass Ihr System mit Debug-Informationen bereitgestellt werden müsste. Scheint kein Problem für Sie, aber manchmal ist ein Problem für Box-Software.
Es gibt eine Menge Werkzeuge, aber vielleicht sind nicht alle Delphi-6-kompatibel. Ein paar zu nennen:
So müssten Sie Standard-Exception-Handler ändern (in TApplication
, ExceptProc
oder was auch immer - diese Werkzeuge in ihre Quellen würden Ihnen zeigen, wie es geht) und Gleitkommaausnahmen protokollieren (an denen Sie kaum interessiert wären) ALLE möglichen Ausnahmen jetzt).
Dies bringt eine andere Frage: ein Protokollierungs-Framework. Einige libs oben haben es bereits, einige würden eine zusätzliche Bibliothek benötigen. Sie würden es jetzt schon brauchen und Sie würden es später noch brauchen.
Jetzt laufen Sie Ihren Dienst für eine Weile und es hält alle FP bezogenen Ausnahmen mit ihren Stack-Traces zu speichern. Wenn Sie es mit einigen deaktivierten Optimierungen kompiliert haben (wie "immer Stapelrahmen generieren"), würde es wahrscheinlich auch einige lokale Variablen und Parameter auf dem Weg zeigen.
Wenn Sie Glück haben - das wäre genug für Sie zu verstehen, wie der Fehler passiert. Aber höchstwahrscheinlich würden Sie die sofortige Fehlerbedingung sehen, aber nicht, wie sie sich aus fehlgeschlagenen Anfangsannahmen entwickelt haben.
In diesem Fall hätten Sie zumindest den Stack-Trace (Ausführungspfad) zum Fehler (oder wenige Pfade zu einigen ähnlichen Fehlern, von denen Sie wissen, dass sie einer sind). An diesem Punkt verschieben Sie Ihre Hauptaufgabe in die Protokollierung. Wenn Sie Ihren Ausführungspfad kennen, können Sie alle interessanten Funktionsparameter und lokalen Variablen entlang des Ausführungspfads protokollieren und sehen, wie diese Variablen abnormale Werte vor der protokollierten Ausnahme erhalten (und wie Werte normal sind, wenn jetzt eine Ausnahme auftritt).
Sie müssten mehrere Iterationen durchführen, zuerst erweitern Sie Ihre Suche in den Aufruf-Stack, fügen Sie weitere Parameter und vars zum Protokollieren, und vielleicht einige Nebenrollen zur Protokollierung, die nicht direkt in der Aufruf-Stack aber wurden vor der Ausnahme aufgerufen und beeinflussten lokale vars-Werte vor dem Fehler.
Setzen Sie madExcept in Ihren Prozess und lesen Sie die Stack-Traces vom resultierenden Fehlerbericht –