Exemple #1
0
        internal static ErrorExceptionAndBinaries CreateModelExceptionAndBinaries(System.Exception exception)
        {
            var modelException = new ModelException
            {
                Type       = exception.GetType().ToString(),
                Message    = exception.Message,
                StackTrace = exception.StackTrace
            };

            if (exception is AggregateException aggregateException)
            {
                if (aggregateException.InnerExceptions.Count != 0)
                {
                    modelException.InnerExceptions = new List <ModelException>();
                    foreach (var innerException in aggregateException.InnerExceptions)
                    {
                        modelException.InnerExceptions.Add(CreateModelExceptionAndBinaries(innerException).Exception);
                    }
                }
            }
            if (exception.InnerException != null)
            {
                modelException.InnerExceptions = modelException.InnerExceptions ?? new List <ModelException>();
                modelException.InnerExceptions.Add(CreateModelExceptionAndBinaries(exception.InnerException).Exception);
            }

            // Binary information is not required on this platform.
            return(new ErrorExceptionAndBinaries {
                Exception = modelException, Binaries = null
            });
        }
        private static ModelException ProcessException(System.Exception exception, ModelException outerException, Dictionary <long, ModelBinary> seenBinaries)
        {
            var modelException = new ModelException
            {
                Type       = exception.GetType().ToString(),
                Message    = exception.Message,
                StackTrace = exception.StackTrace
            };

            if (exception is AggregateException aggregateException)
            {
                if (aggregateException.InnerExceptions.Count != 0)
                {
                    modelException.InnerExceptions = new List <ModelException>();
                    foreach (var innerException in aggregateException.InnerExceptions)
                    {
                        ProcessException(innerException, modelException, seenBinaries);
                    }
                }
            }
            if (exception.InnerException != null)
            {
                modelException.InnerExceptions = modelException.InnerExceptions ?? new List <ModelException>();
                ProcessException(exception.InnerException, modelException, seenBinaries);
            }
            var stackTrace = new StackTrace(exception, true);
            var frames     = stackTrace.GetFrames();

            // If there are native frames available, process them to extract image information and frame addresses.
            // The check looks odd, but there is a possibility of frames being null or empty both.
            if (frames != null && frames.Length > 0 && frames[0].HasNativeImage())
            {
                foreach (var frame in frames)
                {
                    // Get stack frame address.
                    var crashFrame = new ModelStackFrame
                    {
                        Address = string.Format(CultureInfo.InvariantCulture, AddressFormat, frame.GetNativeIP().ToInt64()),
                    };
                    if (modelException.Frames == null)
                    {
                        modelException.Frames = new List <ModelStackFrame>();
                    }
                    modelException.Frames.Add(crashFrame);

                    // Process binary.
                    var nativeImageBase = frame.GetNativeImageBase().ToInt64();
                    if (seenBinaries.ContainsKey(nativeImageBase) || nativeImageBase == 0)
                    {
                        continue;
                    }
                    var binary = ImageToBinary(frame.GetNativeImageBase());
                    if (binary != null)
                    {
                        seenBinaries[nativeImageBase] = binary;
                    }
                }
            }
            outerException?.InnerExceptions.Add(modelException);
            return(modelException);
        }