When a Windows application or service crashes, a dump file can preserve the process state needed to move beyond a generic error message. This guide explains how to collect a useful dump with Windows Error Reporting (WER), open it in WinDbg, configure symbols, read exception and stack information, and maintain a repeatable triage record for recurring failures.
Overview
Crash dump analysis is most effective when collection and investigation are treated as two separate steps. First, capture the right kind of evidence at the time of failure. Then inspect that evidence in a debugger with matching symbols, application binaries, and enough context to reproduce or classify the problem.
For most desktop applications, installers, test builds, and user-mode services, a user-mode dump is the appropriate starting point. It records information about one process, including threads, loaded modules, exception state, and selected memory. A kernel dump is more appropriate when the entire operating system crashes, a driver is suspected, or the failure involves system-wide behavior. Application logs are not a replacement for either type of dump, but they often provide the timeline and inputs needed to interpret one.
| Evidence | Best use | Typical limitation |
|---|---|---|
| User-mode dump | Application, installer, or service crash | Usually does not explain failures outside the captured process |
| Kernel dump | Stop errors, driver problems, and system-wide faults | Larger, more sensitive, and more complex to analyze |
| Application logs | Inputs, configuration, timing, and business context | May omit the failing instruction or memory state |
Before collecting a dump, document the executable name, version, build identifier, operating system version, account or service context, time of failure, and the action that triggered it. This small record prevents a technically valid dump from becoming ambiguous later.
What to track
Choose a dump type deliberately
A mini dump is smaller and easier to transfer, making it useful for routine triage. It may contain enough thread and module information to identify an access violation or a consistently failing call path. A full user-mode dump captures the process's virtual memory and is more useful when the failure depends on heap contents, managed objects, corrupted state, or data that is not present in a mini dump. Use the smallest dump that answers the question, and treat every dump as potentially sensitive because it can contain credentials, tokens, documents, or request data.
Configure Windows Error Reporting LocalDumps
For a repeatable application-crash workflow, WER LocalDumps can be configured for a particular executable. The usual registry location is:
HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\AppName.exe
Within that key, commonly used values include DumpFolder for the destination directory, DumpCount for retention, and DumpType to select the dump level. A value of 1 is commonly used for a mini dump and 2 for a full dump. Confirm the setting against the Windows environment and your organization's collection policy before relying on it in production.
Use a writable local directory with sufficient space, restrict access to the dump folder, and define a cleanup process. A dump that fills a system volume or remains accessible to every local user creates an operational and security problem. For a service, test the configuration under the service's actual account rather than only under an administrator session.
Track the files that make a dump useful
Record the exact application binary, private symbols, third-party modules, configuration, and source revision associated with each dump. Keep the dump filename tied to a case or build identifier, but do not place secrets or personal data in filenames. Preserve the original file before running analysis commands, and calculate a hash if the file will be copied between systems.
Install and prepare WinDbg
Install WinDbg through a Microsoft-provided distribution or the Debugging Tools component of the Windows SDK. Open the debugger with the permissions needed to read the dump and its symbol files. A practical symbol setup for public Windows symbols is:
.symfix C:\Symbols
.reload
This configures a local cache for symbols retrieved from the Microsoft public symbol server. Add private symbol locations for your own binaries when available. Symbol matching depends on the binary identity, not merely the filename, so copy-and-renaming a DLL does not make its symbols compatible. If a module is built again, treat its previous symbols as a different artifact.
Cadence and checkpoints
Crash analysis benefits from a lightweight recurring review rather than a new investigation every time an incident becomes urgent. For an actively changing application, review dump collection monthly or at each release checkpoint. For a stable service, a quarterly review may be sufficient unless crashes are recurring.
- Collection check: Confirm that WER is producing dumps, the destination is writable, retention is bounded, and permissions are appropriate.
- Symbol check: Open a representative dump and verify that application and system modules resolve to the expected versions.
- Classification check: Group failures by exception code, faulting module, stack pattern, build, and triggering operation.
- Trend check: Compare crash frequency, affected builds, environments, and time since the last code or configuration change.
- Documentation check: Ensure each recurring signature has an owner, a known workaround if one exists, and a next diagnostic step.
When a crash is reported, capture the dump before changing the environment. Note whether the failure is repeatable, whether it affects one machine or many, and whether the same signature appears after a deployment. A concise incident record should include the dump path, hash, build, exception code, faulting module, first useful stack frame, and any associated application log entries.
How to interpret changes
Open the dump in WinDbg and begin with the automatic analysis command:
!analyze -v
Read the result as a starting point, not a verdict. It may identify an exception code, a process, a suspected faulting module, and a stack summary. Common user-mode codes include an access violation, an illegal instruction, and a stack overflow, but the code alone does not prove which component introduced the defect.
Inspect the current thread and call stack:
k
~* k
The first command displays the current stack; the second displays stacks for all threads. Look for the first frame belonging to your code, the transition into a third-party component, and repeated waiting or worker-thread patterns. A crash in a system DLL can be the final point of detection rather than the original source of corruption.
For an exception context, use:
.ecxr
Then inspect registers, arguments, and the relevant stack again. For a suspected module, check its version and symbol status with:
lmvm module_name
If symbols are missing, fix that before drawing conclusions. Commands such as !sym noisy can help diagnose symbol-loading problems, but noisy output is best enabled temporarily. A stack full of addresses without function names is a signal to repair the symbol path or obtain private symbols, not evidence that the stack is meaningless.
Compare multiple dumps by signature. A stable exception code and similar application frames across builds suggest a recurring defect. A changed faulting module after an update may indicate a regression, a changed dependency, or a shift in where existing memory corruption becomes visible. A changing stack with the same user action can point toward timing, concurrency, data-dependent behavior, or an environmental difference.
When to revisit
Revisit this workflow monthly or quarterly, depending on release frequency and incident volume. Update it immediately when the application changes its executable name, service account, installation path, dump destination, or symbol publication process. Recheck the procedure after installing a new WinDbg or Windows SDK release, changing Windows Error Reporting policy, moving builds to a new pipeline, or adopting a new runtime.
Use these practical checkpoints after a new crash:
- Confirm that the dump belongs to the failing build and was captured close to the incident time.
- Verify symbols for the application, runtime, and relevant system modules.
- Run
!analyze -v, inspect the exception context with.ecxr, and review all relevant stacks. - Compare the signature with earlier dumps instead of treating every report as unrelated.
- Record uncertainty explicitly: missing symbols, incomplete logs, suspected corruption, or an unverified theory.
- After a fix, retain one pre-fix and one post-fix example so the result can be checked during the next review.
A dependable crash process is not just a debugger command list. It is a maintained chain from failure collection to symbols, context, classification, and follow-up. Keeping those checkpoints current makes the next Windows crash faster to reproduce, safer to share, and easier to explain.