scripts/README_SYMBOLICATION.md
This directory contains scripts for symbolicating macOS crash logs. Different scripts are needed for different crash log formats.
# Traditional text format crash logs
./symbolicate_crash_simple.sh MacCrash.log
# JSON format crash logs (macOS 15+)
./symbolicate_json_crash.sh crash.log
# Batch process all crashes in a directory
./symbolicate_all_crashes.sh /path/to/crash/logs
For standard macOS crash logs (plain text format with "Process:", "Binary Images:", etc.):
symbolicate_crash.sh - Full-featured symbolication script
atosDEBUG=1 optionsymbolicate_crash_simple.sh - Uses Apple's symbolicatecrash tool (recommended)
symbolicate_all_crashes.sh - Batch process multiple crash logs
symbolicate_crash.sh internallyFor newer JSON-format crash logs (as seen in macOS 15 and later):
symbolicate_json_crash.sh - Handles JSON crash log format
jq (install with: brew install jq)Process: NetNewsWire [12345]
Path: /Applications/NetNewsWire.app/Contents/MacOS/NetNewsWire
Identifier: com.ranchero.NetNewsWire-Evergreen
Version: 6.2 (6200)
Code Type: ARM-64
Binary Images:
0x100000000 - 0x100ffffff +NetNewsWire arm64 <uuid> /path/to/app
Process: NetNewsWire [12345]
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x1821a2388 __pthread_kill + 8
3 NetNewsWire 0x103017460 0x102ef0000 + 1209440
Advantage: System frameworks are already symbolicated, only your app code needs symbolication
{"app_name":"NetNewsWire","timestamp":"2025-11-17 06:48:17.00 -0800",...}
{
"uptime" : 2300000,
"procRole" : "Foreground",
"threads" : [...],
"usedImages" : [...]
}
Key difference: JSON format has two JSON objects - a header on line 1, and the main crash data starting on line 2.
# Auto-find archive by UUID
./symbolicate_crash_simple.sh MacCrash.log
# Or use advanced script with debug output
DEBUG=1 ./symbolicate_crash.sh MacCrash.log
# Specify archive path manually
./symbolicate_crash.sh MacCrash.log ~/Library/Developer/Xcode/Archives/2024-11-28/MyApp.xcarchive
# Auto-find archive by UUID
./symbolicate_json_crash.sh crash.log
# Specify archive path manually
./symbolicate_json_crash.sh crash.log ~/Library/Developer/Xcode/Archives/2024-11-28/MyApp.xcarchive
# Process all .crash files in current directory
./symbolicate_all_crashes.sh
# Process crashes in specific directory
./symbolicate_all_crashes.sh /path/to/crash/directory
# Specify custom dSYM directory
./symbolicate_crash_simple.sh MacCrash.log ~/path/to/dSYMs
# Enable debug output
DEBUG=1 ./symbolicate_crash.sh MacCrash.log
# Process specific pattern
find . -name "*production*.log" -exec ./symbolicate_crash_simple.sh {} \;
The scripts symbolicate your app's code:
Example:
Before: 0 NetNewsWire 0x00000001059feea0 0x1058d0000 + 1240736
After: 0 NetNewsWire 0x00000001059feea0 closure #1 in ReaderAPICaller.retrieveEntries(articleIDs:completion:) (ReaderAPICaller.swift:527)
0 Account 0x1059feea0 closure #1 in ReaderAPICaller.retrieveEntries(articleIDs:completion:) (ReaderAPICaller.swift:527)
0 (top of stack)closure #1 in ReaderAPICaller.retrieveEntriesReaderAPICaller.swift527All scripts create a *_symbolicated.log file with:
The output maintains Apple's standard crash log format and can be:
~/Library/Developer/Xcode/Archivesjq command-line JSON processor
brew install jqbrew install jq
dSYMs directoryatos or Apple's symbolicatecrash tool*_symbolicated.log - Output file with symbolsjq to be installed