Пример #1
0
            private void Collect()
            {
                var detectedError = AcLogHelper.DetermineWhatsGoingOn(_log)?.GetDescription();

                if (detectedError != null)
                {
                    Group("Detected issue");
                    Add("Error", detectedError);
                }

                Group("Versions");
                Add("AC", Match(@"AC VERSION : (.*)"));
                Add("CSP", Match(@"Custom Shaders Patch, (\S*)").TrimEnd('.'));

                Group("Hardware");
                Add("Cores", Match(@"LOGICAL CPU DETECTED: (.*)"));
                Add("GPU", Match(@"ADAPTER DESCRIPTION\s+DESCRIPTION: (.*)"));
                Add("VRAM", Match(@"VIDEO MEM: (.*)"));

                Group("Configuration");
                Add("Mode", _video["CAMERA"].GetNonEmpty("MODE"));
                Add("Resolution", $"{_video["VIDEO"].GetInt("WIDTH", 0)}×{_video["VIDEO"].GetInt("HEIGHT", 0)}");
                Add("Fullscreen", _video["VIDEO"].GetBool("FULLSCREEN", false));
                Add("YEBIS", _video["POST_PROCESS"].GetBool("ENABLED", false));
                Add("FXAA", _video["EFFECTS"].GetBool("FXAA", false));
                Add("AC blur", _video["EFFECTS"].GetBool("MOTION_BLUR", false));
                Add("Apps", _python.Keys.Where(x => _python[x].GetBool("ACTIVE", false)).OrderBy(x => x)
                    .JoinToString(", ").ToLowerInvariant());
                Add("Input", _controls["HEADER"].GetNonEmpty("INPUT_METHOD"));
                Add("Devices", _controls["CONTROLLERS"].Where(x => x.Key.StartsWith("CON")).Select(x => x.Value).JoinToString(", "));

                Group("Race");
                Add("Type", _race["REMOTE"].GetBool("ACTIVE", false) ? "Online"
                        : _race["REPLAY"].GetBool("ACTIVE", false) ? "Replay" : "Offline");
                Add("Track", _race["RACE"].GetNonEmpty("TRACK"));
                Add("Layout", _race["RACE"].GetNonEmpty("CONFIG_TRACK"));
                Add("Car", _race["RACE"].GetNonEmpty("MODEL"));

                Group("Errors");
                Add("Clean", Contains("CLEAN EXIT"));
                Add("Online", Match("ACClient:: (.+)"));
                Add("Race", Match("ERROR: RaceManager :: (.+)"));
                Add("CSP", _cspLog.Split('\n').Where(x => x.Contains("| ERROR |"))
                    .Select(x => x.Split(new[] { '|' }, 3).ElementAtOrDefault(2)?.TrimStart()).NonNull().JoinToString("\n"));
                Add("Stack", _log.Split(new[] { "CRASH in:" }, StringSplitOptions.None).ElementAtOrDefault(1).Or("none").Trim());

                Group("Other logs");
                Add("Python", _pyLog);
                Add("Warnings", _acErrors);
            }
Пример #2
0
        private static void UnwrapReport(string filename)
        {
            var location = OptionLocation;

            if (string.IsNullOrWhiteSpace(location))
            {
                location = FilesStorage.Instance.GetTemporaryDirectory("Reports");
            }

            try {
                using (var stream = File.OpenRead(filename))
                    using (var archive = new ZipArchive(stream)) {
                        var log           = archive.ReadString(@"log.txt");
                        var detectedError = AcLogHelper.DetermineWhatsGoingOn(log)?.GetDescription();

                        /*if (detectedError != null) {
                         *  if (MessageDialog.Show($"Crash seems familiar: {detectedError.ToSentenceMember()}.\n\nContinue unwrapping?", "Crash report", MessageDialogButton.YesNo) != MessageBoxResult.Yes) {
                         *      return;
                         *  }
                         * }*/

                        var username = Regex.Match(log, @"Steam Name:(\S*)").Groups[1].Value;
                        username = Regex.Replace(username, "[^A-Za-z0-9-]+", "");

                        if (string.IsNullOrEmpty(username))
                        {
                            username = IniFile.Parse(archive.ReadString(@"race.ini"))["CAR_0"].GetNonEmpty("DRIVER_NAME") ?? "";
                            username = Regex.Replace(username, "[^A-Za-z0-9-]+", "").Or("-");
                        }

                        var crashId     = username + "_" + Path.GetFileNameWithoutExtension(filename).Replace(@"crash_", "");
                        var destination = Path.Combine(location, crashId);
                        if (!Directory.Exists(destination))
                        {
                            Directory.CreateDirectory(destination);
                        }

                        var dump = archive.Entries.FirstOrDefault(x => x.Name.EndsWith(".dmp"))?.Open().ReadAsBytesAndDispose();
                        if (dump != null)
                        {
                            File.WriteAllBytes(Path.Combine(destination, crashId + ".dmp"), dump);
                        }

                        if (detectedError != null)
                        {
                            var name = FileUtils.EnsureFileNameIsValid(detectedError, false);
                            if (name.Length > 120)
                            {
                                name = name.Substring(0, 120);
                            }
                            File.WriteAllText(Path.Combine(destination, name), detectedError);
                        }
                        File.WriteAllText(Path.Combine(destination, crashId + ".txt"), new SummaryGenerator(archive).Run());
                        File.WriteAllText(Path.Combine(destination, crashId + ".report-launch"), "");
                        File.WriteAllBytes(Path.Combine(destination, crashId + ".zip"), File.ReadAllBytes(filename));

                        WindowsHelper.ViewDirectory(destination);
                    }
            } catch (Exception e) {
                NonfatalError.Notify("Failed to load report", e);
            }
        }