2012-04-18 11 views
14

Ich bin neu in C#. Ich schreibe eine kleine Desktop-Formular-basierte Anwendung und ich muss diese Funktion in der App haben.In C# Wie sammle ich Stack-Trace von Programmabsturz

Wenn die Anwendung abstürzt jederzeit, es gibt eine letzte Gelegenheit für die App-Stack-Trace zu sammeln und es mir sein sollte ...

Bitte geben Sie mir Anweisungen hierzu zurückschicken.

Benötige ich einen Versuch zu fangen, die den Haupteingangspunkt meiner App abdecken? oder was ist der beste Weg, um solche Dinge in einer C# -App zu behandeln.

danke,

+2

"Telefon Heim" Funktionen von Programmen müssen sorgfältig konzipiert werden. Stellen Sie sicher, dass Sie die Benutzer warnen und überlegen Sie, welche Daten Sie besser nicht erhalten sollten (Passwörter, Namen, seien Sie äußerst vorsichtig, wenn sie untergeordnete Informationen enthalten können). Überprüfen Sie dies auch - [Windows Fehlerberichterstattung: Erste Schritte] (http://msdn.microsoft.com/en-us/windows/hardware/gg487440), zumindest Datenschutzlinks. –

Antwort

22

alle nicht behandelten Ausnahmen zu fangen, Fügen Sie diese auf Program.cs:

[STAThread] 
    static void Main() 
    { 
    AppDomain currentDomain = default(AppDomain); 
    currentDomain = AppDomain.CurrentDomain; 
    // Handler for unhandled exceptions. 
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
    // Handler for exceptions in threads behind forms. 
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 
    ... 
    } 

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = (Exception)e.ExceptionObject; 
    ILog log = LogManager.GetLogger(typeof(Program)); 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = e.Exception; 
    ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

Stapelüberwachung Sie von exception.StackTrace

+2

danke für die Antwort. Ich vergleiche deine Antwort mit Lynn Crumblings und ich frage mich, was ist der Vorteil dieses Ansatzes gegenüber seinem ..? – Ahmed

+4

@ user1185422 Der Ansatz von Aseem ist eine globale Lösung und fängt sogar Fehler beim Startup-Start, .NET interne Exceptions, asynchrone Operationsfehler usw. ab. Lynns Ansatz ist lokal und fängt nur Ausnahmen ein, die innerhalb von 'MainEntryPoint' genannten Methoden auftreten. * synchron **. Ich würde Lynns Ansatz nicht als Crash-Report-Lösung empfehlen, da Sie ganze Fehlerklassen übersehen können. –

+2

versuchen Catch-Blöcke sind gut, aber jede Codezeile in einem try-Catch wickeln kann mühsam sein, und es kann Ausnahmen aufgrund von Bibliotheken von Drittanbietern sein, löst dieser Ansatz diese beiden Probleme auch. Sie können mit dem Try-Catch-Block-Ansatz fortfahren, auch dann ist dies absolut notwendig. –

1

Wenn Sie wickeln erhalten können Ihre Code in einem try-catch, und eine Exception auftritt, können Sie auf die Ausnahme zugreifen, um den Stack-Trace zu sehen. Ja, Sie würden einen Try-Catch hinzufügen, um Ihren Haupteinstiegspunkt zu umschließen.

try 
{ 
    MainEntryPoint(); 
} 
catch (Exception exc) 
{ 
    System.Diagnostics.Debug.Print(exc.Message); // get at entire error message w/ stacktrace 
    System.Diagnostics.Debug.Print(exc.StackTrace); // or just the stacktrace 
} 
+0

Ich würde gerne wissen, welche Vorteile die UnhandledException gegenüber diesem Ansatz bietet. –

+2

Ja, ich versuche einen Grund zu finden, diese Methode auch hier anzuwenden. Werden möglicherweise Ausnahmen für andere Nicht-UI-Threads in der App abgefangen? Ich bin mir nicht sicher, ob Ihre Lösung auch Ausnahmen für andere Threads abfängt. – Ahmed

3

Wenn ich Sie wäre, würde ich ein All-in-one-Lösung, wie zum Beispiel die freie und Open-Source-NBug Rahmen,

http://nbug.codeplex.com/

+0

Verweilte 30 Minuten mit den bereitgestellten Beispielen .. Auch die Beispielkonfiguration App stürzte ziemlich viel .. Die Idee scheint aber gut .. – Ahmed

3

Werfen Sie einen Blick auf Crypto Obfuscator betrachten, die hat eine Automatic Exception Reporting Funktion.

Automatische Ausnahmebedingungsberichte machen es Ihnen extrem einfach, alle nicht behandelten Ausnahmen in Ihrer Software zu erkennen und Ihre Benutzer diese Ausnahmen einfach mit einem einzigen Klick auf eine Schaltfläche zu melden.

Die Ausnahmebedingungsberichte enthalten alle relevanten Informationen einschließlich vollständiger Stack-Trace-Informationen zusammen mit den Werten aller Methodenargumente und lokalen Variablen sowie den Systeminformationen, dem Zeitpunkt der Ausnahmebedingung, der Build-Nummer und optionalen vom Entwickler definierten benutzerdefinierten Daten Log-Dateien, Screenshots, etc.

DISCLAIMER: Ich arbeite für LogicNP Software, der Entwickler von Crypto Obfuscator.

+1

Es gibt andere ähnliche kommerzielle Werkzeuge, wie SmartAssembly von Red-Gate, http://www.red-gate.com/products/dotnet-development/smartassembly/ :) –

Verwandte Themen