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