Finding Your Crash History in Windows
One crash tells you almost nothing. A timeline of thirty crashes tells you whether a machine is stable, degrading, or already past saving - and it is the difference between a support call that ends in a replacement and one that ends in a suggestion to reinstall Windows. Everything needed to build that timeline is already on the machine.
Start with Reliability Monitor
The fastest overview in Windows, and the least known. Press Win+R and run:
perfmon /relYou get a calendar with a line graph, one column per day, marking every crash, failed update, driver installation and application fault. Click any red marker for details.
What makes it valuable is not the individual entries - it is the shape. A machine that was stable for two years and started producing failures three weeks ago tells a very different story from one that has failed intermittently since the day it was bought. Reliability Monitor shows you that shape in about ten seconds.
Note the date of the first failure, not just the recent ones. Then ask what changed around then - a Windows feature update, a driver, new hardware, a house move, a hot spell. That correlation is often the whole answer.
Event Viewer for the detail
Reliability Monitor is a summary built from the event logs. When you need specifics, go to the source. Run eventvwr, expand Windows Logs, and select System.
The entries that matter for crash work:
| Source | Event ID | What it means |
|---|---|---|
| BugCheck | 1001 | The machine rebooted from a stop error. The message contains the full bugcheck code and all four parameters. |
| Kernel-Power | 41 | The system rebooted without shutting down cleanly. Present after every crash, but also after a power loss or a hard lock with no dump. |
| WHEA-Logger | 17, 18, 19, 47 | Hardware errors reported by the platform itself. See Event 17. |
| Display | 4101 | The display driver timed out and recovered - the non-fatal form of VIDEO_TDR_FAILURE. |
| disk / Ntfs | 7, 51, 55, 98 | Storage errors. Bad blocks, controller problems, filesystem corruption. |
| EventLog | 6008 | The previous shutdown was unexpected. |
A Kernel-Power 41 with no accompanying BugCheck 1001 is worth noticing specifically: it means the machine died without managing to write a dump, which is a harder failure than an ordinary blue screen and leans toward power or hardware.
Building the timeline with PowerShell
Clicking through Event Viewer does not scale past a handful of entries. These pull the same data into something you can actually read.
Every stop error, with its parameters:
Get-WinEvent -FilterHashtable @{LogName='System'; Id=1001} |
Where-Object { $_.Message -match 'bugcheck was' } |
Select-Object TimeCreated, Message |
Format-ListCount of every hardware error by event ID:
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-WHEA-Logger'} |
Group-Object Id | Sort-Object Count -Descending |
Format-Table Name, Count -AutoSizeEvent IDs are only unique within a provider. If you filter the System log on Id=17,18,19,47 without naming a provider you will also collect unrelated events - ID 19 in the System log is also Windows Update reporting a successful installation, and it fires constantly. A crash timeline padded with update entries is worse than no timeline, because it buries the signal you are trying to show someone.
The queries below pair each provider with its own IDs for that reason.
A combined timeline of everything relevant:
$since = (Get-Date).AddDays(-90)
$filters = @(
@{ LogName='System'; ProviderName='Microsoft-Windows-WHEA-Logger' }
@{ LogName='System'; ProviderName='Microsoft-Windows-Kernel-Power'; Id=41 }
@{ LogName='System'; ProviderName='Microsoft-Windows-WER-SystemErrorReporting'; Id=1001 }
@{ LogName='System'; ProviderName='EventLog'; Id=6008 }
@{ LogName='System'; ProviderName='Display'; Id=4101 }
)
$events = foreach ($f in $filters) {
$f['StartTime'] = $since
try { Get-WinEvent -FilterHashtable $f -ErrorAction Stop } catch { }
}
$events | Sort-Object TimeCreated |
Select-Object TimeCreated,
@{n='Source';e={$_.ProviderName -replace '^Microsoft-Windows-',''}},
Id,
@{n='Summary';e={($_.Message -split "`n")[0]}} |
Format-Table -AutoSize -WrapThat last one is the useful artefact. It shows you what preceded each crash, which is where the actual diagnosis usually lives - a burst of WHEA entries in the ninety seconds before a stop error is a completely different finding from a stop error arriving out of nowhere.
Exporting it properly
If there is any chance this becomes a warranty conversation, export before you troubleshoot. Reinstalling Windows destroys the evidence, and the evidence is what makes the case.
To CSV, for reading and sharing:
$filters = @(
@{ LogName='System'; ProviderName='Microsoft-Windows-WHEA-Logger' }
@{ LogName='System'; ProviderName='Microsoft-Windows-Kernel-Power'; Id=41 }
@{ LogName='System'; ProviderName='Microsoft-Windows-WER-SystemErrorReporting'; Id=1001 }
@{ LogName='System'; ProviderName='EventLog'; Id=6008 }
@{ LogName='System'; ProviderName='Display'; Id=4101 }
)
$events = foreach ($f in $filters) {
try { Get-WinEvent -FilterHashtable $f -ErrorAction Stop } catch { }
}
$events | Sort-Object TimeCreated |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Export-Csv "$env:USERPROFILE\Desktop\crash-history.csv" -NoTypeInformation -Encoding UTF8The raw log, which a technician can open directly:
wevtutil epl System "$env:USERPROFILE\Desktop\system-log.evtx"Copy your minidump folder alongside it. Between the timeline, the exported log and the dumps, you have a case rather than an anecdote.
Reading the pattern
What the timeline tells you, in rough order of how much it matters:
- Frequency over time. Stable, or accelerating? An accelerating rate is the clearest single indicator of hardware degradation, and it is the argument that gets machines replaced.
- One stop code or several. The same code repeating suggests one broken thing, usually software. Several unrelated codes - plus silent reboots - is the signature of memory corruption or a board-level fault, because the damage lands somewhere different each time.
- Load or idle. Crashes under sustained load point at thermals, power delivery or an unstable overclock. Crashes at idle or shortly after waking point at power-management transitions, which is a hardware-leaning signature and one that stress testing will never reproduce.
- What arrives just before. WHEA entries, disk errors or display timeouts in the minutes preceding a crash usually identify the subsystem. A crash with a completely clean log before it is a different investigation.
- What changed at the start. Line the first failure up against Windows update history and driver installation dates.
Why this matters more than any single dump
Vendor diagnostics run short synthetic tests. They are good at catching components that have failed outright and poor at catching components that fail intermittently - which is most of the interesting cases. A passing diagnostic on a machine that crashes weekly is not a contradiction, it is a predictable limitation of the test.
What a support conversation cannot easily dismiss is a documented history: thirty-eight recorded failures across four months, an accelerating rate, six distinct stop codes, and WHEA entries clustering before each one. That is a pattern no short test would catch and no reimage will fix, and it shifts the conversation from have you tried reinstalling to which part gets replaced.
Build the timeline early, keep it, and add to it. The single most common mistake in this whole area is reinstalling Windows to fix a hardware fault, which destroys the only evidence you had.
Frequently asked
Reliability Monitor is empty or barely populated. Is something wrong?
It depends on the Reliability Analysis scheduled task running, and that occasionally gets disabled by optimisation utilities or on heavily customised installs. Event Viewer and the PowerShell queries read the underlying logs directly, so they still work even when Reliability Monitor shows nothing. If you want it back, look for the RACAgent task under Task Scheduler in the Microsoft Windows RAC folder.
How far back does the System log go?
Until it fills and starts overwriting - by default a few weeks to a few months, depending on how noisy the machine is. If you are diagnosing something intermittent, raise the log size early: in Event Viewer, right-click the System log, choose Properties, and increase the maximum size to something like 100 MB. That costs nothing and preserves history you will want later.
I have Kernel-Power 41 events but no BugCheck 1001. What does that mean?
The machine stopped without writing a dump. That happens with a genuine power interruption, a hard lock where the kernel never regained enough control to write anything, or a fault severe enough to kill the machine outright. It is a harder failure mode than an ordinary blue screen and leans toward power delivery or hardware. If the machine is on a desktop with no power interruptions to explain it, treat repeated bare 41s as a significant finding.
Should I clear the logs to start fresh?
No. The history is the asset. If you want a clean view of whether a fix worked, note the timestamp when you made the change and filter from there - the PowerShell queries above take a StartTime for exactly that. Clearing logs throws away the trend data that makes the case, and it cannot be recovered.
Related errors
- GuideHow to Read a Windows Crash Dump File with WinDbgInstall WinDbg, open the dump, run one command. Fifteen minutes, and it usually names the driver.
- WHEA-Logger 17A corrected hardware error has occurredHardware reported an error and recovered. One is noise. A burst of them is a warning.
- 0x00000124WHEA_UNCORRECTABLE_ERRORThe hardware reported a fatal error directly. The most hardware-specific stop code there is.