- Published on
Symbolicating Swift Crash Reports in Xcode
- Authors
- Name
- Mick MacCallum
- @0x7fs
When your app crashes in production, the crash logs you receive from App Store Connect or Xcode Cloud are often unsymbolicated, making them difficult to read and debug. Symbolication is the process of converting memory addresses back to human-readable function names and line numbers. This article shows you how to manually symbolicate crash logs using Xcode's built-in tools.
Understanding Crash Logs
Crash logs contain stack traces with memory addresses that point to where the crash occurred. Without symbolication, you'll see addresses like 0x0000000101234567
instead of meaningful function names like MyViewController.viewDidLoad()
. Symbolication requires the corresponding .dSYM
file that was generated when your app was built.
Automatic Symbolication in Xcode
Xcode automatically attempts to symbolicate crash logs when you view them in the Organizer. However, this only works if:
- The crash log is from a build you have locally
- The corresponding
.dSYM
file is available - The build was created with the same source code
If automatic symbolication fails, you'll see a message like "Symbolication failed" or the stack trace will show memory addresses instead of function names.
Manual Symbolication Process
When automatic symbolication doesn't work, you can manually symbolicate crash logs using the symbolicatecrash
tool. Here's the step-by-step process:
Step 1: Locate Your Crash Log
- In Xcode, go to Window → Organizer
- Select the Crashes tab
- Find the unsymbolicated crash you want to analyze
- Right-click on the crash and select Show Package Contents
- Locate the
.crash
file in the package
Step 2: Find Your dSYM File
You'll need the .dSYM
file that corresponds to the build that crashed. You can find this in several places:
From Xcode Cloud:
- Go to Window → Organizer → Archives
- Find the build that matches your crash
- Right-click and select Show Package Contents
- Navigate to
dSYMs
folder
From Local Build:
- Look in
~/Library/Developer/Xcode/DerivedData/[Project]/Build/Products/Release-iphoneos/
Step 3: Set Up Environment Variables
Before running the symbolication tool, ensure your DEVELOPER_DIR
environment variable is set:
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer/
Step 4: Run the Symbolication Tool
Use the symbolicatecrash
tool to process your crash log:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash \
path/to/your/crash.crash \
path/to/your/app.dSYM \
> symbolicated_crash.txt
Replace the paths with your actual crash log and dSYM file locations.
Example Symbolication Command
Here's a complete example of the symbolication process:
# Set the developer directory
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer/
# Run symbolication
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash \
~/Downloads/MyApp_2025-06-21_Device.crash \
~/Downloads/MyApp.app.dSYM \
> symbolicated_crash.txt
Understanding the Output
After symbolication, your crash log will show readable function names instead of memory addresses. Here's an example of what the output looks like:
Before Symbolication:
Thread 0 Crashed:
0 MyApp 0x0000000101234567 0x101000000 + 1234567
1 MyApp 0x0000000101234568 0x101000000 + 1234568
After Symbolication:
Thread 0 Crashed:
0 MyApp 0x0000000101234567 MyViewController.viewDidLoad() + 123
1 MyApp 0x0000000101234568 UIViewController.loadView() + 456
Troubleshooting Symbolication Issues
Missing dSYM Files
If you can't find your .dSYM
file:
- Check Xcode Cloud: Download the build artifacts from Xcode Cloud
- Verify Build Settings: Ensure "Debug Information Format" is set to "DWARF with dSYM File"
- Check Archive: Make sure you archived the build with dSYM generation enabled
Symbolication Fails
If the symbolication tool fails:
- Verify Paths: Ensure both the crash file and dSYM file paths are correct
- Check Permissions: Make sure you have read access to both files
- Validate dSYM: Ensure the dSYM file corresponds to the exact build that crashed
- Update Xcode: Make sure you're using a compatible version of Xcode
Integration with Crash Reporting Services
Many crash reporting services like Firebase Crashlytics, Bugsnag, or Sentry can automatically handle symbolication if you upload your dSYM files:
- Firebase Crashlytics: Upload dSYMs through the build phase script
- Bugsnag: Upload dSYMs via their dashboard or API
- Sentry: Upload dSYMs through their CLI tool
Alternative Tools
While symbolicatecrash
is the most common tool, there are alternatives:
- atos: Command-line tool for address-to-symbol conversion
- dwarfdump: Extract debug information from dSYM files
- Third-party services: Many crash reporting services offer web-based symbolication
Manual symbolication is a crucial skill for debugging production crashes. By following this process, you can transform unreadable crash logs into actionable debugging information that helps you identify and fix issues in your app.