none
Forms: Anwendung beendet sich plötzlich/wird "abgeschossen". Wie kann ich das loggen? RRS feed

  • Frage

  • Hallo zusammen!

    Es geht um eine große, komplizierte Windows-Forms-Anwendung (C#) mit Datenbankanbindung (SQL Server über OLEDB).
    Diese hat seit einiger Zeit die Angewohnheit, sich manchmal kommentarlos und ohne Fehlermeldung zu verabschieden. Weder steht etwas im Ereignisprotokoll, noch in den anderen Logs die die Anwendung erzeugt. Die Anwendung läuft auf ca. 30 Windows 7 Rechnern, und dieser Absturz passiert auf allen Rechnern in unterschiedlichen Abständen. (Es könnte evtl. auch sein, dass ein Virenschutzprogramm etwas damit zu tun hat, also dass meine Anwendung von "extern" abgeschossen wird, aber sicher bin ich mir da nicht.)

    Ich möchte gerne loggen, wann genau der Absturz passiert und was im Programm vorher gemacht wurde. Welche Möglichkeiten habe ich da?

    Übrigens, in diesem Thread:  http://social.msdn.microsoft.com/Forums/de-DE/445b785d-f828-400c-ad4e-e819ee1f75aa/forms-anwendung-beendet-sich-kommentarlos   wird etwas ähnliches behandelt, und es könnte tatsächlich sein, dass es sich bei mir auch um so eine Form Handle Geschichte handelt, da mir die meisten Benutzer erzählen, dass gerade ein Fortschrittsdialog angezeigt wird, wenn die Anwendung sich verabschiedet. Da hoffe ich, mit dem Logging Genaueres zu erfahren.

    Dienstag, 20. August 2013 09:58

Antworten

  • Hallo,

    du kannst beispielsweise in den Zuverlässigkeitsverlauf von Windows gucken. In diesem sollten auch deine Programmabstürtze mit einigen Extradaten dokumentiert werden.

    Außerdem kannst du noch einen Globalen Exception-Handler hinzufügen. Wie das geht wird hier beschrieben.
    Dann musst du nurnoch die Daten entsprchend irgendwie abspeichern.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Dsungaro Mittwoch, 21. August 2013 05:51
    Dienstag, 20. August 2013 10:05
    Moderator

Alle Antworten

  • Hallo,

    du kannst beispielsweise in den Zuverlässigkeitsverlauf von Windows gucken. In diesem sollten auch deine Programmabstürtze mit einigen Extradaten dokumentiert werden.

    Außerdem kannst du noch einen Globalen Exception-Handler hinzufügen. Wie das geht wird hier beschrieben.
    Dann musst du nurnoch die Daten entsprchend irgendwie abspeichern.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Dsungaro Mittwoch, 21. August 2013 05:51
    Dienstag, 20. August 2013 10:05
    Moderator
  • Danke für die Hinweise!

    Im Zuverlässigkeitsverlauf wird leider nie etwas abgespeichert :(

    Aber die Application.ThreadException klingt super! Ich implementiere die mal und melde mich dann, ob sie wirklich ausgelöst wird.
    (Ich vermute, sie wird nicht ausgelöst, wenn ich die Anwendung über den Windows Taskamanger unter "Prozesse" mit "Prozess beenden" würde - oder?)

    Dienstag, 20. August 2013 11:24
  • Beim Prozessbeenden wird garnichts mehr in der Anwendungs ausgelöst. Das ist auch der Grund warum der Taskmanager nochmal nachfragt.

    PS: Beachte bitte das es unter Umständen mehrere Threads gibt in den Exception geworfen werden können. Du musst also das Event für jeden Thread abfangen.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Dienstag, 20. August 2013 12:14
    Moderator
  • Ich verwende für Hintergrundthreads ausschließlich den BackgroundWorker. Muss ich bei dem auch irgendetwas machen? Meines Wissens gibt es da ja die "Error" Eigenschaft bei den RunWorkerCompletedEventArgs, die man abfragen muss, wenn der BackgroundWorker fertig ist, das mache ich auch.

    Dienstag, 20. August 2013 12:34
  • Ich verwende für Hintergrundthreads ausschließlich den BackgroundWorker. Muss ich bei dem auch irgendetwas machen? Meines Wissens gibt es da ja die "Error" Eigenschaft bei den RunWorkerCompletedEventArgs, die man abfragen muss, wenn der BackgroundWorker fertig ist, das mache ich auch.

    Das sollte ausreichen.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Dienstag, 20. August 2013 14:07
    Moderator