Crash in jedem Fall verhindern

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    Crash in jedem Fall verhindern

    Hallo,

    wir haben im Moment eine C# Software in der Massenproduktion welche auf 3rdParty Bibliotheken (Common Vision Blox WPF Bindings) zugreift.
    Leider ungefähr alle 2-3 Tage (aber unregelmäßig) crasht die Anwendung komplett. Durch meine Log Einträge weiß ich, das es beim Speichern von einem DeviceImage auftritt. Ich kann die Exception aber nicht abfangen. Laut Windows Event Log ist es eine System.AccessViolationException die eben in den Common Vision Blox Bibliotheken auftritt. Das Programm nimmt alle paar Sekunden Sekunden 4-5 Bilder auf und speichert diese auf ein NAS Laufwerk ab. Das geht 2-3 Tage einwandfrei gut, aber irgendwann kommt es eben vor, dass beim Speichern auf einem diese AccessViolationException auftritt und ich weiß nicht wieso. Ich habe schon ein CrashDump erzeugt, das ich aber erst nächsten Montag von der Anlage ziehen kann weil die Anlage in der Produktion ist. Es darf auf keinen Fall passieren das die Anwendung crasht.... Es wäre nicht soooo tragisch wenn dieses eine Bild dann nicht abgespeichert wird, aber wenn die Anwendung crasht werden auch alle folgenden Bilder nicht gespeichert. Gibt es irgend eine Möglichkeit die Anwendung nicht zu crashen? Ich verstehe auch nicht, warum ein Try Catch (Exception e) die Exception nicht abfängt, das Try Catch wird einfach ignoriert. Auch ein AppDomain.UnhandledException fängt die Exception nicht ab.

    Jemand ein Tipp für mich?
    Ich habe eine Testanwendung geschrieben in der ich eine System.AccessViolation erzwinge. Die wird von nem TryCatch auch ned behandelt.
    Wenn ich aber diese zwei Attribute über die Methode packe:

    [SecurityCritical] und [HandleProcessCorruptedStateExceptions]
    dann funktioniert das catchen.

    Ich werde mal noch weitere Tests versuchen anzustellen.

    Nochmal zur Erwähnung, mir ist durchaus bewusst dass dies keine Lösung ist, ich suche nur nach einer temporären Lösung bis ich den wahren Grund für die AccessViolation gefunden habe, dafür brauche ich das CrashDump was ich an Stemmer schicken werde.
    Gibt man in Google System.AccessViolationException ein, landet man mit dem ersten oder zweiten link In den Microsoft Docs (ehemals MSDN):
    Dort steht, dass seit .NET 4 von der Runtime geworfene AccessViolationExceptions nicht mehr einfach so gefangen werden können. Entsprechende Methoden müssen mit dem HandleProcessCorruptedStateExceptionsAttribute versehen sein. Diese Exception deutet darauf hin, dass mindestens einmal, i.d.R. jedoch schon mehrfach mit invaliden Pointern gearbeitet wurde, entweder durch unsafe oder bei der Interaktion mit unverwaltetem code. Es wäre gut möglich, dass ein simples Abfangen und Weiterarbeiten, nur in noch mehr Exceptions endet, was zu noch mehr nicht gespeicherten Bildern führt.
    Ich vermute deine beste Chance ist es, bis der Entwickler das fixt, das Programm bei auftreten des Fehler sich selbst neustarten zu lassen.

    Edit:
    Deine Antwort auf dich selbst, habe ich erst nach dem Absenden gesehen @seh

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    EaranMaleasi schrieb:

    das Programm bei auftreten des Fehler sich selbst neustarten zu lassen.


    Ja darüber hab ich auch schon nachgedacht. Dann werde ich jetzt mit der temporären Lösung (dem [HandleProcessCorruptedStateExceptionsAttribute]) die Exception abfangen und die Anwendung beim Abfangen neustarten. Mir fällt im Moment auch nichts besseres ein.
    Vielen Dank @EaranMaleasi