Load this when decoding a kernel panic report from /Library/Logs/DiagnosticReports/. macOS doesn't use numeric bugcheck codes the way Windows does — instead, panics carry strings. The string + the loaded kext list together identify the cause.
| Era | Path | Format |
|---|---|---|
| macOS 10.x → 11 | /Library/Logs/DiagnosticReports/*.panic |
Plain text |
| macOS 12+ | /Library/Logs/DiagnosticReports/Kernel_*.ips |
JSON header + plain-text body |
| User-mode crashes | ~/Library/Logs/DiagnosticReports/*.ips |
App crashes (not kernel panics) |
.ips files have a JSON metadata header on the first line, then the panic body below. To extract the body:
tail -n +2 /Library/Logs/DiagnosticReports/Kernel-2026-05-15-031422.ips
A typical panic report contains:
panic(cpu N caller 0x...): "<panic string>"@<source-file>:<line>
Backtrace (CPU N), Frame : Return Address
0xffffffaeb01: 0xffff80019c... addr2line: __ZN16IOPlatformPlugin...
...
Mac OS version: 23F79
Kernel version: Darwin Kernel Version 23.5.0...
Kernel UUID: ABC...
iBoot version: iBoot-10151.121.1
secure boot?: YES
roots installed: 0
Paniclog version: 14
Loaded kexts:
com.apple.driver.AppleEFIRuntime 1
com.apple.iokit.IOACPIFamily 1.5
com.example.product.kext 2.1.7 <— third-party suspect
...
The panic string identifies the failure class. The call stack points at the kext / function. The kext list narrows the suspect.
| String fragment | Likely cause | First action |
|---|---|---|
"Sleep wake failure in EFI" |
Driver hung crossing sleep/wake | Check USB / BT / GPU driver versions; remove third-party kext |
"unresponsive bootstrap subsystem" |
launchd deadlock at boot | Boot safe mode; audit /Library/LaunchDaemons/ |
"VFS error mounting volume" |
Filesystem mount failed | Boot recoveryOS, run diskutil verifyVolume |
"APFS reaper: ... corruption" |
APFS metadata corruption | Image first; do NOT fsck_apfs -y |
"IOPlatformPanicAction" |
Hardware-initiated panic (often thermal / power) | Check pmset -g log for power events around panic time |
| Fragment | Cause |
|---|---|
"Kernel trap at ... page_fault" |
Kernel-mode memory access fault — driver bug or RAM fault |
"double_fault" |
Kernel handler itself crashed during fault handling — very serious |
"general_protection" |
Kernel touched invalid memory region |
"Kernel data abort" (Apple Silicon) |
Memory access violation in kernel/kext |
| Fragment | Cause |
|---|---|
"WindowServer panic" or "AGXFirmwareKernExt" |
GPU driver fault. Try external display, alternative GPU mode |
"Bluetooth panic" or "IOBluetoothFamily" |
BT stack issue — unpair recent devices |
"AppleACPIPlatform" |
ACPI / firmware interaction — rare but tied to motherboard |
"AppleAHCIPort" / "AppleNVMeFamily" |
Storage controller. Check disk-health |
"IOAudioFamily" / "AppleHDA" |
Audio driver. Often triggered by external audio interface |
"IOUSBHostFamily" |
USB driver fault — unplug recent USB devices |
"IOFireWireFamily" |
FireWire (legacy) — rare on modern Macs |
| Fragment | Cause |
|---|---|
"Sleep wake failure" |
Driver crossing power state. Look at backtrace for kext name |
"Wake transition timed out" |
Specific driver took too long to wake |
"smc panic" (rare) |
SMC firmware issue. Reset SMC (Intel only — Apple Silicon doesn't have user-resetable SMC) |
| Fragment | Cause |
|---|---|
"panic_kthread" |
Kernel watchdog timeout — a driver was in infinite loop |
"Hard hang on cpu N" |
Specific CPU stuck — possibly hardware |
The most important triage: is the panic in an Apple kext, or a third-party kext?
| Prefix | Origin | Diagnostic value |
|---|---|---|
com.apple.* |
Apple-shipped | Harder to fix — likely a bug. Check for OS updates. |
com.<vendor>.* (Adobe, Paragon, Eltima, ESET, etc.) |
Third-party | Primary suspect. Try removing/updating the kext. |
Common third-party kexts that show up in panics:
| Kext label | Vendor | Reason |
|---|---|---|
com.eltima.ProductX |
Eltima Software | USB virtualization, often crashes |
com.paragon-software.fs.kext.ntfs |
Paragon NTFS | Filesystem driver |
com.eset.kext.esets-eset_ctl |
ESET | Anti-virus / firewall |
com.kaspersky.kext.* |
Kaspersky | AV |
com.driver.AcmeUSB |
Misc. drivers | Various |
com.intel.driver.EnergyDriver |
Intel (Boot Camp era) | Power management |
If you see ANY com.<thirdparty> kext in the panic kext list, that's your starting point — especially if it appears in the call stack itself, not just the loaded-kext inventory.
Note: many vendors now ship System Extensions instead of kexts (especially on Apple Silicon). System extensions show up differently — see references/launchd-deep-dive.md.
Apple Silicon panics use a slightly different format and include more hardware context. Key differences:
Kernel-YYYY-MM-DD-HHMMSS.panic and .ips"Kernel data abort" (ARM64) vs "page_fault" (x86)The panic record is the symptom. The events in the 10 minutes before are usually the cause. Use:
# Replace TIME with the panic timestamp
log show --start '2026-05-15 03:04:22' --end '2026-05-15 03:14:22' --style compact \
--predicate '(subsystem == "com.apple.kernel" OR subsystem == "com.apple.iokit") AND (messageType == "Error" OR messageType == "Fault")'
What to look for:
The scripts/panic-triage.sh script automates this window query.
Two common reasons:
/Library/Logs/DiagnosticReports/. Check pmset -g log for "Standby" → sudden "Wake" without preceding "Sleep".For Apple Silicon: the system reset record (which IS preserved across hard power loss) is queryable via:
log show --predicate 'eventMessage CONTAINS "previous shutdown cause"' --last 30d | head
Negative values indicate unclean shutdown:
-3 = hard power loss-20 = no associated cause / unexpected-128 = thermal shutdown5 = clean shutdown initiated by userscripts/panic-triage.sh — automated panic decode + pre-panic timelinestorage-events.mdwindows-ops/references/bugcheck-codes.mdrecovery-patterns.md