public RaygunErrorMessage(Exception exception)
        {
            var exceptionType = exception.GetType();

#if IOS
            MonoTouchException mex = exception as MonoTouchException;
            if (mex != null && mex.NSException != null)
            {
                Message   = string.Format("{0}: {1}", mex.NSException.Name, mex.NSException.Reason);
                ClassName = mex.NSException.Name;
            }
            else
            {
#endif
            Message   = string.Format("{0}: {1}", exceptionType.Name, exception.Message);
            ClassName = exceptionType.FullName;
#if IOS
        }
#endif

            StackTrace = BuildStackTrace(exception);
            Data       = exception.Data;

            if (exception.InnerException != null)
            {
                InnerError = new RaygunErrorMessage(exception.InnerException);
            }
        }
示例#2
0
        public static RaygunErrorMessage Build(Exception exception)
        {
            RaygunErrorMessage message = new RaygunErrorMessage();

            var exceptionType = exception.GetType();

            MonoTouchException mex = exception as MonoTouchException;

            if (mex != null && mex.NSException != null)
            {
                message.Message   = mex.NSException.Reason;
                message.ClassName = mex.NSException.Name;
            }
            else
            {
                message.Message   = exception.Message;
                message.ClassName = FormatTypeName(exceptionType, true);
            }

            message.StackTrace = BuildStackTrace(exception);
            message.Data       = exception.Data;

            AggregateException ae = exception as AggregateException;

            if (ae != null && ae.InnerExceptions != null)
            {
                message.InnerErrors = new RaygunErrorMessage[ae.InnerExceptions.Count];
                int index = 0;
                foreach (Exception e in ae.InnerExceptions)
                {
                    message.InnerErrors[index] = Build(e);
                    index++;
                }
            }
            else if (exception.InnerException != null)
            {
                message.InnerError = Build(exception.InnerException);
            }

            return(message);
        }
示例#3
0
        public void ObjCException()
        {
#if !__WATCHOS__
            if (Runtime.Arch == Arch.DEVICE)
            {
                Assert.Ignore("This test requires wrapper functions, which are not enabled for monotouch-test on device.");
            }
#endif

#if !DEBUG && !__WATCHOS__
            if (Runtime.Arch != Arch.DEVICE)
            {
                Assert.Ignore("This test only works in debug mode in the simulator.");
            }
#endif
            InstallHandlers();

            try {
                using (var e = new ObjCExceptionTest()) {
                    MonoTouchException thrownException = null;
                    try {
                        objcTargetMode = MarshalObjectiveCExceptionMode.ThrowManagedException;
                        e.ThrowObjCException();
                        Assert.Fail("managed exception not thrown");
                    } catch (MonoTouchException ex) {
                        thrownException = ex;
                    }
                    Assert.AreEqual("exception was thrown", thrownException.Reason, "objc reason");
                    Assert.AreEqual("Some exception", thrownException.Name, "objc name");
                    Assert.AreEqual(1, objcEventArgs.Count, "objc exception");
                    Assert.AreEqual(thrownException.NSException.Handle, objcEventArgs [0].Exception.Handle, "objc exception");
                    Assert.AreEqual(defaultObjectiveCExceptionMode, objcEventArgs [0].ExceptionMode, "objc mode");
                    Assert.AreEqual(0, managedEventArgs.Count, "managed exception");
                }
            } finally {
                UninstallHandlers();
            }
        }
示例#4
0
        private static RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception)
        {
            var lines = new List <RaygunErrorStackTraceLineMessage>();

      #if !__UNIFIED__
            MonoTouchException mex = exception as MonoTouchException;
            if (mex != null && mex.NSException != null)
            {
                var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols"));
                var arr = NSArray.StringArrayFromHandle(ptr);
                foreach (var line in arr)
                {
                    lines.Add(new RaygunErrorStackTraceLineMessage {
                        FileName = line
                    });
                }
                return(lines.ToArray());
            }
      #endif

            string stackTraceStr = exception.StackTrace;
            if (stackTraceStr == null)
            {
                var line = new RaygunErrorStackTraceLineMessage {
                    FileName = "none", LineNumber = 0
                };
                lines.Add(line);
                return(lines.ToArray());
            }

            try
            {
                RaygunErrorStackTraceLineMessage[] array = ParseStackTrace(exception.StackTrace);
                if (array.Length > 0)
                {
                    return(array);
                }
            }
            catch { }

            var stackTrace = new StackTrace(exception, true);
            var frames     = stackTrace.GetFrames();

            if (frames == null || frames.Length == 0)
            {
                var line = new RaygunErrorStackTraceLineMessage {
                    FileName = "none", LineNumber = 0
                };
                lines.Add(line);
                return(lines.ToArray());
            }

            foreach (StackFrame frame in frames)
            {
                MethodBase method = frame.GetMethod();

                if (method != null)
                {
                    int lineNumber = frame.GetFileLineNumber();

                    if (lineNumber == 0)
                    {
                        lineNumber = frame.GetILOffset();
                    }

                    var methodName = GenerateMethodName(method);

                    string file = frame.GetFileName();

                    string className = method.ReflectedType != null ? method.ReflectedType.FullName : "(unknown)";

                    var line = new RaygunErrorStackTraceLineMessage
                    {
                        FileName   = file,
                        LineNumber = lineNumber,
                        MethodName = methodName,
                        ClassName  = className
                    };

                    lines.Add(line);
                }
            }

            return(lines.ToArray());
        }
        private RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception)
        {
            var lines = new List <RaygunErrorStackTraceLineMessage>();

#if WINRT
            string[] delim      = { "\r\n" };
            string   stackTrace = exception.StackTrace ?? exception.Data["Message"] as string;
            if (stackTrace != null)
            {
                var frames = stackTrace.Split(delim, StringSplitOptions.RemoveEmptyEntries);

                foreach (string line in frames)
                {
                    lines.Add(new RaygunErrorStackTraceLineMessage()
                    {
                        ClassName = line
                    });
                }
            }
#elif WINDOWS_PHONE
            if (exception.StackTrace != null)
            {
                char[] delim  = { '\r', '\n' };
                var    frames = exception.StackTrace.Split(delim);
                foreach (string line in frames)
                {
                    if (!"".Equals(line))
                    {
                        RaygunErrorStackTraceLineMessage stackTraceLineMessage = new RaygunErrorStackTraceLineMessage();
                        stackTraceLineMessage.ClassName = line;
                        lines.Add(stackTraceLineMessage);
                    }
                }
            }
#else
#if IOS
            MonoTouchException mex = exception as MonoTouchException;
            if (mex != null && mex.NSException != null)
            {
                var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols"));
                var arr = NSArray.StringArrayFromHandle(ptr);
                foreach (var line in arr)
                {
                    lines.Add(new RaygunErrorStackTraceLineMessage {
                        FileName = line
                    });
                }
                return(lines.ToArray());
            }
#endif
            var stackTrace = new StackTrace(exception, true);
            var frames     = stackTrace.GetFrames();

            if (frames == null || frames.Length == 0)
            {
                var line = new RaygunErrorStackTraceLineMessage {
                    FileName = "none", LineNumber = 0
                };
                lines.Add(line);
                return(lines.ToArray());
            }

            foreach (StackFrame frame in frames)
            {
                MethodBase method = frame.GetMethod();

                if (method != null)
                {
                    int lineNumber = frame.GetFileLineNumber();

                    if (lineNumber == 0)
                    {
                        lineNumber = frame.GetILOffset();
                    }

                    var methodName = GenerateMethodName(method);

                    string file = frame.GetFileName();

                    string className = method.ReflectedType != null
                       ? method.ReflectedType.FullName
                       : "(unknown)";

                    var line = new RaygunErrorStackTraceLineMessage
                    {
                        FileName   = file,
                        LineNumber = lineNumber,
                        MethodName = methodName,
                        ClassName  = className
                    };

                    lines.Add(line);
                }
            }
#endif
            return(lines.ToArray());
        }
示例#6
0
        private static RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception)
        {
            var lines = new List <RaygunErrorStackTraceLineMessage>();

      #if !__UNIFIED__
            MonoTouchException mex = exception as MonoTouchException;
            if (mex != null && mex.NSException != null)
            {
                var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols"));
                var arr = NSArray.StringArrayFromHandle(ptr);
                foreach (var line in arr)
                {
                    lines.Add(new RaygunErrorStackTraceLineMessage {
                        FileName = line
                    });
                }
                return(lines.ToArray());
            }
      #endif

            string stackTraceStr = exception.StackTrace;
            if (stackTraceStr == null)
            {
                var line = new RaygunErrorStackTraceLineMessage {
                    FileName = "none", LineNumber = 0
                };
                lines.Add(line);
                return(lines.ToArray());
            }
            try
            {
                string[] stackTraceLines = stackTraceStr.Split('\n');
                foreach (string stackTraceLine in stackTraceLines)
                {
                    int    lineNumber   = 0;
                    string fileName     = null;
                    string methodName   = null;
                    string className    = null;
                    string stackTraceLn = stackTraceLine;
                    // Line number
                    int index = stackTraceLine.LastIndexOf(":");
                    if (index > 0)
                    {
                        bool success = int.TryParse(stackTraceLn.Substring(index + 1), out lineNumber);
                        if (success)
                        {
                            stackTraceLn = stackTraceLn.Substring(0, index);
                            // File name
                            index = stackTraceLn.LastIndexOf("] in ");
                            if (index > 0)
                            {
                                fileName     = stackTraceLn.Substring(index + 5);
                                stackTraceLn = stackTraceLn.Substring(0, index);
                                // Method name
                                index = stackTraceLn.LastIndexOf("(");
                                if (index > 0)
                                {
                                    index = stackTraceLn.LastIndexOf(".", index);
                                    if (index > 0)
                                    {
                                        int endIndex = stackTraceLn.IndexOf("[0x");
                                        if (endIndex < 0)
                                        {
                                            endIndex = stackTraceLn.Length;
                                        }
                                        methodName   = stackTraceLn.Substring(index + 1, endIndex - index - 1).Trim();
                                        methodName   = methodName.Replace(" (", "(");
                                        stackTraceLn = stackTraceLn.Substring(0, index);
                                    }
                                }
                                // Class name
                                index = stackTraceLn.IndexOf("at ");
                                if (index >= 0)
                                {
                                    className = stackTraceLn.Substring(index + 3);
                                }
                            }
                            else
                            {
                                fileName = stackTraceLn;
                            }
                        }
                        else
                        {
                            index = stackTraceLn.IndexOf("at ");
                            if (index >= 0)
                            {
                                index += 3;
                            }
                            else
                            {
                                index = 0;
                            }
                            fileName = stackTraceLn.Substring(index);
                        }
                    }
                    else
                    {
                        fileName = stackTraceLn;
                    }
                    var line = new RaygunErrorStackTraceLineMessage
                    {
                        FileName   = fileName,
                        LineNumber = lineNumber,
                        MethodName = methodName,
                        ClassName  = className
                    };

                    lines.Add(line);
                }
                if (lines.Count > 0)
                {
                    return(lines.ToArray());
                }
            }
            catch { }



            var stackTrace = new StackTrace(exception, true);
            var frames     = stackTrace.GetFrames();

            if (frames == null || frames.Length == 0)
            {
                var line = new RaygunErrorStackTraceLineMessage {
                    FileName = "none", LineNumber = 0
                };
                lines.Add(line);
                return(lines.ToArray());
            }

            foreach (StackFrame frame in frames)
            {
                MethodBase method = frame.GetMethod();

                if (method != null)
                {
                    int lineNumber = frame.GetFileLineNumber();

                    if (lineNumber == 0)
                    {
                        lineNumber = frame.GetILOffset();
                    }

                    var methodName = GenerateMethodName(method);

                    string file = frame.GetFileName();

                    string className = method.ReflectedType != null ? method.ReflectedType.FullName : "(unknown)";

                    var line = new RaygunErrorStackTraceLineMessage
                    {
                        FileName   = file,
                        LineNumber = lineNumber,
                        MethodName = methodName,
                        ClassName  = className
                    };

                    lines.Add(line);
                }
            }

            return(lines.ToArray());
        }