stride3d/stride · warning · IOException

Crash report upload failed:

Error message

Crash report upload failed: 

What it means

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.

Solutions

  1. Check the concatenated failure detail after the colon for the root cause (DNS, TLS, proxy)
  2. Verify the DSN/network configuration (CrashReportSender.ResolveDsn) is correct
  3. Wrap report sending so upload failures do not mask the original crash report; retry later or keep the run directory for manual upload

Example fix

// before
await sender.SendAsync(report); // throws on failure, crash handling stops
// after
try { await sender.SendAsync(report); }
catch (IOException) { store.KeepForLaterUpload(report); }
Defensive patterns

Strategy: try-catch

Validate before calling

// before sending
dsn ??= CrashReportSender.ResolveDsn(null);
if (string.IsNullOrWhiteSpace(dsn))
    return; // nothing configured; skip upload instead of failing

Try / catch

try { await sender.SendAsync(report); }
catch (IOException e) when (e.Message.StartsWith("Crash report upload failed:"))
{ log.Warn(e, "Crash upload failed; keeping report on disk"); }

Prevention

When it happens

Trigger: 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.

Common situations: No internet connection on the end-user machine when a crash happens; Sentry DSN misconfigured or blocked by firewall/proxy.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/5eaab59fe1fcda35. Report an issue: GitHub.

Appendix: source

Thrown at sources/crashreport/Stride.CrashReport/CrashReportSender.cs:209

            {
                var response = await base.SendAsync(request, cancellationToken);
                if (response.IsSuccessStatusCode)
                    Interlocked.Increment(ref succeeded);
                else
                    failure ??= $"HTTP {(int)response.StatusCode} {response.ReasonPhrase}";
                return response;
            }
            catch (Exception exception)
            {
                failure ??= exception.Message;
                throw;
            }
        }

        public void ThrowIfNothingLanded()
        {
            if (failure != null)
                throw new IOException("Crash report upload failed: " + failure);
            if (succeeded == 0)
                throw new IOException("Crash report upload timed out.");
        }
    }

    /// <summary>
    /// Maps report entries onto Sentry structures: searchable tags, GPU/memory contexts, log lines and
    /// undo/redo actions as breadcrumbs, everything else as extra data. The full report text stays
    /// attached as report.txt, which is exactly what the window's View report shows.
    /// </summary>
    private static void MapReport(Scope scope, CrashReportData report)
    {
        var gpus = new Dictionary<string, Dictionary<string, string>>();
        var memory = new Dictionary<string, string>();
        string activeAdapter = null;

        foreach (var (key, value) in report.Data)
        {

View on GitHub (pinned to 96fad776d2)