I have a regular C# code. I have no exceptions. I want to programmatically log the current stack trace for debugging purpose. Example:
public void executeMethod()
{
logStackTrace();
method();
}
Have a look at the System.Diagnostics namespace. Lots of goodies in there!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
This is really good to have a poke around in to learn what's going on under the hood.
I'd recommend that you have a look into logging solutions (Such as NLog, log4net or the Microsoft patterns and practices Enterprise Library) which may achieve your purposes and then some.
StackTrace is dog slow - so use it sparingly.t.ToString() to get a string representation of the stack trace, which is probably what the OP wanted.new System.Diagnostics.StackTrace(true).new System.Diagnostics.StackTrace(true) and then t.ToString() prints out useful stack trace. Without the true the printout will look like this Stack trace: StackTrace { FrameCount: 36 }. Thank you guys!An alternative to System.Diagnostics.StackTrace is to use System.Environment.StackTrace which returns a string-representation of the stacktrace.
Another useful option is to use the $CALLER and $CALLSTACK debugging variables in Visual Studio since this can be enabled run-time without rebuilding the application.
Environment.StackTrace just new's up an instance of StackTrace.System.Environment.StackTrace might be a more convenient way of accessing that information.System.Diagnostics.StackTrace - see msdn.microsoft.com/en-us/library/…Environment.StackTrace always starts out with at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()? That's not part of the current stack trace as at the point that someone's looking for it.There are two ways to do this. The System.Diagnostics.StackTrace() will give you a stack trace for the current thread. If you have a reference to a Thread instance, you can get the stack trace for that via the overloaded version of StackTrace().
You may also want to check out Stack Overflow question How to get non-current thread's stacktrace?.
You can also do this in the Visual Studio debugger without modifying the code.
Of course, this doesn't help if you're running the code on a different machine, but it can be quite handy to be able to spit out a stack trace automatically without affecting release code or without even needing to restart the program.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
The output will be similar to:
at YourNamespace.Program.executeMethod(String msg)
at YourNamespace.Program.Main(String[] args)
Replace Console.WriteLine with your Log method. Actually, there is
no need for .ToString() for the Console.WriteLine case as it accepts
object. But you may need that for your Log(string msg) method.