Crash report

On this page 7

A crash report is a structured diagnostic record that software or the operating system generates when a program terminates abnormally, capturing the error type, the stack trace of the failing thread and the state of the process at that moment. In software quality, crash reports are the primary evidence for finding and fixing the most severe class of defects: those that stop the application entirely.

Unlike a bug report, which a person writes to describe unexpected behavior, a crash report is produced automatically and contains machine-level facts. It tells developers precisely where the program failed, while the user often knows only that the window disappeared.

What a crash report contains

The core of every crash report is the exception or signal that ended the process and the call stack showing which functions were active. The surrounding metadata identifies the exact build and environment, because the same stack can mean different things in different versions.

The following table lists the usual fields and why each one matters during analysis.

FieldExample contentWhy it matters
Exception or signalSIGSEGV, access violation, unhandled exceptionIdentifies the type of failure
Stack traceFunction names and offsets per frameLocates the failing code path
Build identifierVersion, build number, debug IDMatches the report to symbol files
Loaded modulesLibraries and their load addressesEnables address-to-symbol mapping
Register and thread stateInstruction pointer, other threadsShows concurrency and memory context
EnvironmentOS version, device model, localeReveals platform-specific causes
BreadcrumbsRecent user actions or log linesReconstructs how the crash was reached
Typical fields of a crash report

How crash reports are captured and symbolicated

Capture begins with a crash handler: code that runs when the operating system signals a fatal error. It must work in a damaged process, so robust handlers do as little as possible in-process and often hand the work to a separate monitor process that writes the report.

Native applications usually produce a minidump, a compact file of a few hundred kilobytes to a few megabytes that holds thread stacks and module lists, instead of a full memory dump that can reach gigabytes. Managed runtimes such as Java, .NET or JavaScript engines can generate readable stack traces directly from the exception object.

Release builds are stripped of debug information, so raw stacks contain only memory addresses. Symbolication translates these addresses back into function names, file names and line numbers using symbol files such as PDB on Windows, dSYM on Apple platforms or DWARF data on Linux. For web code, source maps play the same role for minified JavaScript. Without the matching symbols for the exact build, a crash report is close to useless.

Crash reports overlap with several neighboring sources of quality data. The essential distinction is who creates the record and when.

ArtifactCreated byTriggerMain content
Crash reportSoftware or OS automaticallyAbnormal terminationStack, exception, build, environment
Bug reportA user or testerObserved problemSteps, expected and actual behavior
Core dumpThe operating systemFatal signal with dumps enabledFull process memory image
Application logThe applicationContinuous operationTimestamped events and messages
TelemetryThe applicationUsage and performance eventsAggregated metrics and counters
Hang reportOS or watchdogUnresponsive main threadStack of the blocked thread
Crash reports and related diagnostic records

In practice, these sources work together. A spike in crash reports after an update points to a likely regression, telemetry shows how many users are affected, and logs or breadcrumbs explain the sequence of events.

Grouping, prioritizing and measuring crashes

Large applications receive thousands of reports per day, so crash reporting systems group them into signatures, usually by normalizing the top frames of the crashing stack. One signature represents one probable defect. Good grouping is difficult: too coarse merges unrelated bugs, too fine splits one bug into hundreds of buckets.

Teams prioritize signatures by impact rather than raw count, because one device stuck in a crash loop can send hundreds of identical reports. Common quality indicators are listed below.

MetricDefinitionTypical use
Crash-free sessionsShare of sessions without a crashOverall stability target, often above 99 percent
Crash-free usersShare of users without a crash in a periodReflects how many people are affected
Affected users per signatureDistinct users hitting one crashRanks which bug to fix first
New in versionSignatures first seen in a releaseDetects regressions after rollout
Common crash quality metrics

These metrics feed release decisions. Many teams halt a staged rollout when the crash-free rate of a new version drops measurably below the previous one.

Privacy, reliability and common mistakes

Crash reports can contain personal data, because memory and breadcrumbs may include file paths, user names, document fragments or tokens. Responsible collection requires user consent where the law demands it, data minimization, scrubbing of sensitive fields and defined retention periods.

  • Not archiving symbols: if symbol files for a shipped build are lost, its crash reports can never be fully symbolicated.
  • Swallowing exceptions: catching every error to avoid crashes hides defects and can leave data corrupted instead of failing safely.
  • Crashes inside the handler: heavy logic in the crash handler can deadlock or crash again, so the report is never written.
  • Ignoring startup crashes: a crash before the reporter initializes produces no report at all, which makes an app look stable while users cannot start it.
  • Uploading immediately on crash: sending data from a failing process is unreliable; reports should be stored and sent on the next launch.

Understanding it simply

When a program suddenly closes on its own, it has crashed. A crash report is a note the computer writes at that moment, describing what the program was doing when it failed. Developers read these notes to find and fix the problem.

It works like the flight recorder on an airplane. Nobody reads it while everything goes well, but after an incident it tells investigators exactly what happened in the last moments. The key takeaway is that sending crash reports helps fix the problem faster, ideally without exposing private information.

Applied in practice

A team maintains a photo editing application for Windows and macOS. One day after releasing version 4.2 to the first 10 percent of users in a staged rollout, the crash reporting dashboard shows a new signature at the top of the list: an access violation inside the image import module.

The symbolicated stack points to a function that reads metadata from camera files, and the environment fields show that every affected user imported files from one recent camera model. A developer reproduces the crash with a sample file, finds a buffer size calculation that overflows on a new metadata block, and fixes it. The team pauses the rollout, ships version 4.2.1 the next day, and the crash-free session rate returns to its previous level.