{"record":{"id":"5eaab59fe1fcda35","repo":"stride3d/stride","slug":"crash-report-upload-failed","errorCode":null,"errorMessage":"Crash report upload failed: ","messagePattern":"Crash report upload failed: ","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"warning","filePath":"sources/crashreport/Stride.CrashReport/CrashReportSender.cs","lineNumber":209,"sourceCode":"            {\n                var response = await base.SendAsync(request, cancellationToken);\n                if (response.IsSuccessStatusCode)\n                    Interlocked.Increment(ref succeeded);\n                else\n                    failure ??= $\"HTTP {(int)response.StatusCode} {response.ReasonPhrase}\";\n                return response;\n            }\n            catch (Exception exception)\n            {\n                failure ??= exception.Message;\n                throw;\n            }\n        }\n\n        public void ThrowIfNothingLanded()\n        {\n            if (failure != null)\n                throw new IOException(\"Crash report upload failed: \" + failure);\n            if (succeeded == 0)\n                throw new IOException(\"Crash report upload timed out.\");\n        }\n    }\n\n    /// <summary>\n    /// Maps report entries onto Sentry structures: searchable tags, GPU/memory contexts, log lines and\n    /// undo/redo actions as breadcrumbs, everything else as extra data. The full report text stays\n    /// attached as report.txt, which is exactly what the window's View report shows.\n    /// </summary>\n    private static void MapReport(Scope scope, CrashReportData report)\n    {\n        var gpus = new Dictionary<string, Dictionary<string, string>>();\n        var memory = new Dictionary<string, string>();\n        string activeAdapter = null;\n\n        foreach (var (key, value) in report.Data)\n        {","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/crashreport/Stride.CrashReport/CrashReportSender.cs#L191-L227","documentation":"The crash-report uploader tracks whether any of its upload attempts (succeeds/failures) completed. ThrowIfNothingLanded converts a recorded failure into an IOException reporting the underlying failure message.","triggerScenarios":"Calling SendCoreAsync / Send for a crash report when the upload attempt itself failed (e.g. network unreachable, invalid DSN, server returned an error) — the stored failure is surfaced here with the empty base prefix.","commonSituations":"No internet connection on the end-user machine when a crash happens; Sentry DSN misconfigured or blocked by firewall/proxy.","solutions":["Check the concatenated failure detail after the colon for the root cause (DNS, TLS, proxy)","Verify the DSN/network configuration (CrashReportSender.ResolveDsn) is correct","Wrap report sending so upload failures do not mask the original crash report; retry later or keep the run directory for manual upload"],"exampleFix":"// before\nawait sender.SendAsync(report); // throws on failure, crash handling stops\n// after\ntry { await sender.SendAsync(report); }\ncatch (IOException) { store.KeepForLaterUpload(report); }","handlingStrategy":"try-catch","validationCode":"// before sending\ndsn ??= CrashReportSender.ResolveDsn(null);\nif (string.IsNullOrWhiteSpace(dsn))\n    return; // nothing configured; skip upload instead of failing","typeGuard":null,"tryCatchPattern":"try { await sender.SendAsync(report); }\ncatch (IOException e) when (e.Message.StartsWith(\"Crash report upload failed:\"))\n{ log.Warn(e, \"Crash upload failed; keeping report on disk\"); }","preventionTips":["Never let crash-report upload failures propagate during crash handling","Log the underlying failure detail after the colon","Verify DSN and network reachability before upload"],"tags":["network","crash-reporting"],"backgroundTag":"http-request-failed","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}