ChatGPT解决这个技术问题 Extra ChatGPT

How to print the current Stack Trace in .NET without any exception?

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();
}

N
Nimantha

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.


Keep in mind that StackTrace is dog slow - so use it sparingly.
J
John Cummings

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.
@Daniel: Yes, but System.Environment.StackTrace might be a more convenient way of accessing that information.
@AndreiRinea: Actually, I belive you can access line numbers using System.Diagnostics.StackTrace - see msdn.microsoft.com/en-us/library/…
Isn't it annoying that 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.
@Rory, have a look at the constructor StackTrace(int skipFrames, bool fNeedFileInfo), you can skip the starting frame. ipen the method in ILSpy and you can see what it does
C
Community

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?.


Error CS1955 Non-invocable member 'StackTrace' cannot be used like a method.
H
Hank Schultz

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.


If you want to see a stack trace and you're already in the VS debugger at a breakpoint, just go to Debug->Windows->Call Stack.
Yes, but if you do it this way, the program doesn't have to stop for you to see the stack trace.
C
Community
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.


c
cangosta

This worked for me:

Debug.WriteLine(Environment.StackTrace);

J
Jeff Jacobs
   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


This is just generating an obvious exception. Why? Why not simply explicitly instantiate an exception, rather than a flaw that will raise an exception in and of itself? What's the benefit of the additional catch logic required to get to the actual exception? And even then, you're still ignoring the actual posted question on how to get a stack trace without any exception (read the title).
it's a valid answer, but a god awful solution. NOONE SHOULD USE IT... @Jeff wherever you done that, replace it with a descent code like the other answers suggested.