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
- 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
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
- 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
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
- Crash report upload timed out.
- Could not restore package
- ' ' has no parent app directory.
- ' ' has no store base directory.
- Could not connect to server
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)