In C# how to collect stack trace of program crash
Solution 1
To catch all unhandled exceptions, Add this to 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);
}
Stack trace you can get by exception.StackTrace
Solution 2
If I were you, I would consider an all-in-one solution, such as the free and open source NBug framework,
Solution 3
Take a look at Crypto Obfuscator which has a Automatic Exception Reporting feature.
Automatic exception reporting makes it extremely easy for you to catch any unhandled exceptions that occur in your software and for your users to easily report these exceptions to you with a single click of a button.
The exception reports include all pertinent information including full stack trace info along with the values of all method arguments and local variables, plus the system information, the time of the exception, the build number, and optional developer defined custom data like log files, screenshots, etc.
DISCLAIMER: I work for LogicNP Software, the developer of Crypto Obfuscator.
Solution 4
If you wrap your code in a try-catch, and an Exception occurs, you can get at the Exception to see the stack trace. Yes, you would add a try-catch to wrap your main entry point.
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
}
Related videos on Youtube
Ahmed
Updated on June 04, 2022Comments
-
Ahmed almost 2 years
I am new to C#. I am writing a small desktop form based application and I need to have this feature in the app.
If the application crashes at any time, there should be a last opportunity for the app to collect stack trace and send it back to me...
Please give me directions on this.
Do I need a try catch covering the main the entry point of my app ?? or what is the best way to handle such things in a C# app.
thank you,
-
Alexei Levenkov about 12 years"phone home" features of programs need to be designed carefully. Make sure you warn users and consider what data you'd better not to receive (passwords, names, be extremly careful if it can contain child information). Check this out too - Windows Error Reporting: Getting Started, at least privacy links.
-
-
Ahmed about 12 yearsthanks for the answer. I am comparing your answer with Lynn Crumbling's and I am wondering what is the benefit of this approach vs his ..?
-
Pavel Gatilov about 12 years@user1185422 Aseem's approach is a global solution and will catch even startup-time errors, .NET internal exceptions, asynchronous operations errors, etc. Lynn's approach is a local one and will catch only exceptions that occur inside methods called from
MainEntryPoint
synchronously. I wouldn't recommend Lynn's approach as a crash-report solution because you can miss whole classes of errors. -
Lex Li about 12 yearsThere are other similar commercial tools, such as Red-Gate's SmartAssembly, red-gate.com/products/dotnet-development/smartassembly :)
-
A G about 12 yearstry catch blocks are good, but wrapping each and every line of code inside a try-catch can be tedious, plus there can be exceptions due to third party libraries, this approach solves these two issues as well. You can go ahead with the try-catch block approach, even then this is absolutely necessary.
-
Lynn Crumbling about 12 years@Pavel and Aseem -- thanks for the explanation. I'll be adopting this method in the future.
-
Kun Ren over 8 yearsThanks for the answer. I tried making exception in main thread or manually setup threads and it works, but in when I make exceptions in an
ActionBlock
method defined inSystem.Threading.Tasks.Dataflow
the program does not throw the exception nor does it seem to triggercurrentDomain.UnhandledException
and the console program simply stuck.