Search code examples
c#exceptionstack-trace

Getting the Exception object in a try..catch to include full stacktrace, currently it's truncated


I am trying to get the full stack trace when within a catch of try..catch. Currently its truncated to include only the current method where the error is.

Let me explain. Currently my stack trace includes the method "Third" where the error happens but First and Second isn't included, I believe this is by design.

private void First()
{
    this.Second();
}

private void Second()
{
    this.Third();
}

private void Third()
{
    try
    {
        throw new SystemException("ERROR HERE!");
    }
    catch (Exception ex)
    {
        // I WILL LOG THE EXCEPTION object "EX" here ! but ex.StackTrace is truncated!
    }
}

I have seen a number of tricks to get the full stack trace in a STRING but problem is my logging framework expects a object of type "Exception", but my variable (ex) which has my exception is valid but the property StackTrace is truncated.

Is there anyway I can receive a FULL exception with a FULL stack trace so I am able to still send along my "EX" but this time it will have an Untruncated stack trace.

UnhandledErrror event seems to work as if I arrive here the Exception has a stack trace and is fully populated.


Solution

  • class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    First();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.StackTrace);
                }
                Console.ReadLine();
            }
    
            private static void First()
            {
                Second();
    
            }
    
            private static void Second()
            {
                Third();
    
            }
    
            private static void Third()
            {
                throw new SystemException("ERROR HERE!");
            }
        }
    

    The output in this case is:

       at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 37
       at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 31
       at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 25
       at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li
    ne 14
    

    Update: I suddenly had doubts, and ran through all the solutions presented thus far. They all work, though Environment.StackTrace is the easiest. Here's what the output looks like:

    ==ex.StackTrace==
       at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35
    
    ==Environment.StackTrace per Guillaume/Jorge Córdoba==
       at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35   at S
    ystem.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
       at System.Environment.get_StackTrace()
       at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 44
       at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 27
       at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 21
       at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li
    ne 15
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySec
    urity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
    ontextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
    
    ==ex.ToString() per danyolgiax==
    System.SystemException: ERROR HERE!
       at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35
    
    ==GetFrame(i) per MBen==
    Void Third(): (line 52)
    Void Second(): (line 27)
    Void First(): (line 21)
    Void Main(System.String[]): (line 15)
    Int32 _nExecuteAssembly(System.Reflection.Assembly, System.String[]): (line 0)
    Int32 ExecuteAssembly(System.String, System.Security.Policy.Evidence, System.Str
    ing[]): (line 0)
    Void RunUsersAssembly(): (line 0)
    Void ThreadStart_Context(System.Object): (line 0)
    Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, Sy
    stem.Object): (line 0)
    Void ThreadStart(): (line 0)