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 whats 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. Good luck mate!
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.
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.
- Create a breakpoint where you want to see the stack trace.
- Right-click the breakpoint and select "Actions..." in VS2015. In VS2010, select "When Hit...", then enable "Print a message".
- Make sure "Continue execution" is selected.
- Type in some text you would like to print out.
- Add $CALLSTACK wherever you want to see the stack trace.
- Run the program in the debugger.
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.
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
Seems to work for me
来源:https://stackoverflow.com/questions/531695/how-to-print-the-current-stack-trace-in-net-without-any-exception