Exemplo n.º 1
0
        public static void Main(string[] args)
        {
            var url = System.Environment.GetEnvironmentVariable("MONO_SENTRY_URL");

            if (url == null)
            {
                Console.WriteLine("MONO_SENTRY_URL missing");
                return;
            }

            var fileRoot = System.Environment.GetEnvironmentVariable("MONO_SENTRY_ROOT");

            if (fileRoot == null)
            {
                Console.WriteLine("MONO_SENTRY_ROOT missing");
                return;
            }

            var os_tag = System.Environment.GetEnvironmentVariable("MONO_SENTRY_OS");

            if (os_tag == null)
            {
                Console.WriteLine("MONO_SENTRY_OS missing");
                return;
            }

            var dsn = new Dsn(url);

            var files = GetFiles(fileRoot);

            if (files.Length == 0)
            {
                return;
            }

            // Find all of the assemblies in tree that could have made the crash dump
            var assemblies = GetAssemblies(fileRoot);
            var codebase   = new CodeCollection(assemblies);

            foreach (var file in files)
            {
                Console.WriteLine($"Processing {file} ...");
                var state = new Uploader(codebase);
                state.Upload(file, os_tag, dsn);
            }
        }
Exemplo n.º 2
0
        public void SendMessage(JObject sentry_message, Dsn url)
        {
            // Console.WriteLine ("Sending {0}", sentry_message.ToString ());

            var request = (HttpWebRequest)WebRequest.Create(url.SentryUri);

            request.Method      = "POST";
            request.ContentType = "application/json";
            request.UserAgent   = "MonoSentryUploader/1.0.0.0";

            var sentryVersion = 7;
            var time          = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
            var key           = url.PrivateKey != null ? ", sentry_secret=" + url.PrivateKey : null;
            var header        = String.Format("Sentry sentry_version={0}" +
                                              ", sentry_client={1}, sentry_timestamp={2}, sentry_key={3}{4}",
                                              sentryVersion, request.UserAgent, time, url.PublicKey, key);

            request.Headers ["X-Sentry-Auth"] = header;

            byte[] byteArray = Encoding.UTF8.GetBytes(sentry_message.ToString());
            request.ContentLength = byteArray.Length;

            Stream dataStream = request.GetRequestStream();

            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            try {
                WebResponse response = request.GetResponse();
                // Display the status.
                // Console.WriteLine(((HttpWebResponse)response).StatusDescription);

                StreamReader reader = new StreamReader(response.GetResponseStream());
                // Read the content.
                string responseFromServer = reader.ReadToEnd();
                // Display the content.
                Console.WriteLine("\t-- HTTP POST Success {0}", responseFromServer);
                // Clean up the streams.
            } catch (WebException ex) {
                Console.WriteLine("\t-- HTTP POST Error:", ex.Response.Headers [""]);
                for (int i = 0; i < ex.Response.Headers.Count; i++)
                {
                    Console.WriteLine("\t\t {0} : {1}", ex.Response.Headers.Keys [i], ex.Response.Headers [i]);
                }
            }
        }
Exemplo n.º 3
0
        public void Upload(string filePath, string os_tag, Dsn url)
        {
            if (!File.Exists(filePath))
            {
                throw new Exception(String.Format("Json file not found {0}", filePath));
            }

            var dump = File.ReadAllText(filePath);
            //var message = new SentryMessage(dump);
            // var blob = new SentryEvent(message);
            var payload = JObject.Parse(dump);

            // Try to extract a test name
            var fileName = Path.GetFileName(filePath);
            var extract  = Regex.Match(fileName, @"mono_crash\.([A-Za-z0-9]+)\.(\d)\.json");

            if (!extract.Success)
            {
                throw new Exception("File name does not match correct format");
            }

            var groups = extract.Groups;
            var hash   = groups[1].Value;
            // var increment = groups[2].Value;

            var     version_string = payload["protocol_version"].ToString();
            JObject sentry_message = null;

            if (version_string == "0.0.2")
            {
                sentry_message = Format_0_0_2(filePath, payload, hash);
            }
            else
            {
                Console.WriteLine("ERROR: Crash reporting version mismatch");
                return;
            }

            // sent to url via post?
            // Console.WriteLine (sentry_message);

            SendMessage(sentry_message, url);
        }
Exemplo n.º 4
0
        public void Upload(string filePath, string os_tag, Dsn url)
        {
            if (!File.Exists(filePath))
            {
                throw new Exception(String.Format("Json file not found {0}", filePath));
            }

            var dump    = File.ReadAllText(filePath);
            var message = new SentryMessage(dump);
            // var blob = new SentryEvent(message);
            var payload = JObject.Parse(dump);

            // Try to extract a test name
            var fileName  = Path.GetFileName(filePath);
            var groups    = Regex.Match(fileName, @"mono_crash.(\d+).(\d+).json").Groups;
            var hash      = groups[1].Value;
            var increment = groups[2].Value;

            // var version_string = Regex.Match(payload["configuration"]["version"].ToString(), @"").Groups;

            var event_id     = new JProperty("event_id", Guid.NewGuid().ToString("n"));
            var timestamp    = new JProperty("timestamp", DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
            var exc_objs     = new List <JObject> ();
            var failure_type = "Unhandled Managed Exception";

            var stackTraces = payload["threads"] as JArray;

            if (stackTraces.Count > 1)
            {
                failure_type = "Unhandled Unmanaged Exception";
            }

            var culprit = new JProperty("culprit", failure_type);


            for (int i = 0; i < stackTraces.Count; i++)
            {
                var thread_id          = stackTraces[i]["native_thread_id"].ToString();
                var managed_frame_name = "";

                var unmanaged_frames = new List <JObject>();
                var managed_frames   = new List <JObject>();

                var payload_unmanaged_frames = stackTraces[i]["managed_frames"] as JArray;
                for (int fr = 0; payload_unmanaged_frames != null && fr < payload_unmanaged_frames.Count; fr++)
                {
                    var fn_filename = new JProperty("filename", "unknown");
                    var module      = new JProperty("module", "mono-sgen");
                    var function    = new JProperty("function", "");

                    unmanaged_frames.Add(new JObject(fn_filename, function, module));
                }

                var payload_managed_frames = stackTraces[i]["managed_frames"] as JArray;
                for (int fr = 0; payload_managed_frames != null && fr < payload_managed_frames.Count; fr++)
                {
                    var frame = payload_managed_frames [fr] as JObject;
                    if (frame["is_managed"] != null && frame["is_managed"].ToString() == "true")
                    {
                        var guid_val   = frame["guid"].ToString();
                        var token_val  = Convert.ToUInt32(frame["token"].ToString(), 16);
                        var offset_val = Convert.ToUInt32(frame["il_offset"].ToString(), 16);

                        var output_frame = codebase.Find(guid_val, token_val, offset_val);
                        if (output_frame == null)
                        {
                            continue;
                        }

                        var guid      = new JProperty("guid", guid_val);
                        var token     = new JProperty("token", token_val);
                        var il_offset = new JProperty("il_offset", offset_val);

                        output_frame.Add(new JProperty("vars", new JObject(guid, token, il_offset)));

                        managed_frames.Add(output_frame);
                    }
                    else
                    {
                        var native_address = frame["native_address"].ToString();
                        var unmanaged_name = frame["unmanaged_name"].ToString();

                        var fn_filename = new JProperty("filename", "native");
                        var function    = new JProperty("function", string.Format("Offset {0}", unmanaged_name));
                        var module      = new JProperty("module", unmanaged_name);
                        var vars        = new JProperty("vars", frame);

                        managed_frames.Add(new JObject(fn_filename, function, module));
                    }
                }

                if (managed_frames.Count > 0)
                {
                    var managed_st = new JObject(new JProperty("frames", new JArray(managed_frames.ToArray())));

                    exc_objs.Add(new JObject(
                                     new JProperty("module", String.Format("{0}_managed_frames", thread_id)),
                                     new JProperty("type", failure_type),
                                     new JProperty("value", managed_frame_name),
                                     new JProperty("stacktrace", managed_st)));
                }

                if (unmanaged_frames.Count > 0)
                {
                    var unmanaged_st = new JObject(new JProperty("frames", new JArray(unmanaged_frames.ToArray())));

                    exc_objs.Add(new JObject(
                                     new JProperty("module", String.Format("{0}_unmanaged_frames", thread_id)),
                                     new JProperty("type", failure_type),
                                     new JProperty("value", managed_frame_name),
                                     new JProperty("stacktrace", unmanaged_st)));
                }
            }

            var exception = new JProperty("exception", new JArray(exc_objs.ToArray()));
            // Bake in the whole blob
            var embedded       = new JProperty("extra", payload);
            var sentry_message = new JObject(timestamp, event_id, culprit, exception, embedded);

            // sent to url via post?
            Console.WriteLine(sentry_message);

            var request = (HttpWebRequest)WebRequest.Create(url.SentryUri);

            request.Method      = "POST";
            request.ContentType = "application/json";
            request.UserAgent   = PacketBuilder.UserAgent;

            var header = PacketBuilder.CreateAuthenticationHeader(url);

            request.Headers ["X-Sentry-Auth"] = header;

            byte[] byteArray = Encoding.UTF8.GetBytes(sentry_message.ToString());
            request.ContentLength = byteArray.Length;

            Stream dataStream = request.GetRequestStream();

            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            Console.WriteLine("break");

            try {
                WebResponse response = request.GetResponse();
                // Display the status.
                Console.WriteLine(((HttpWebResponse)response).StatusDescription);

                StreamReader reader = new StreamReader(response.GetResponseStream());
                // Read the content.
                string responseFromServer = reader.ReadToEnd();
                // Display the content.
                Console.WriteLine(responseFromServer);
                // Clean up the streams.
            } catch (WebException ex) {
                Console.WriteLine("{0}", ex.Response.Headers [""]);
            }
        }