Short answer
Open ios/Runner.xcworkspace, check the Runner target has the [firebase_crashlytics] Crashlytics Upload Symbols run script as its last build phase, and set Debug Information Format to DWARF with dSYM File for every build configuration. For a version already out, upload its dSYMs from the archive with the upload-symbols script or the dSYMs tab in the Crashlytics dashboard.
Why Crashlytics has no dSYM, and the fix
01
The upload run script is missing or not last
“Make sure this new Run Script phase is your project's last build phase.” Firebase, Get readable crash reports (Flutter)
flutterfire configure tries to add the script, but it can be skipped or end up above other phases. In the Runner target’s Build Phases, check the script is there and drag it to the bottom.
02
Xcode isn’t producing a dSYM
“Set Debug Information Format to DWARF with dSYM File for all your build types.” Firebase, Get readable crash reports (Apple platforms)
If Release builds use DWARF without the dSYM file, there is nothing to upload. In the Runner target’s Build Settings, search for debug information format and set it for every configuration, then rebuild.
03
The script runs but can’t read the files (Xcode 15 and later)
“Specifically, Xcode 15 and later requires that you provide a more complete set of file locations.” Firebase, Get readable crash reports (Apple platforms)
With user script sandboxing, the script only sees files listed in its Input Files. An error such as Unable to process Info.plist means the list is short. Add the dSYM, Info.plist, GoogleService-Info.plist and executable paths from Firebase’s guide.
04
A version is already in users’ hands
“Within .xcarchive is a dSYMs directory that contains dSYMs generated as part of Xcode's archiving process.” Firebase, Get readable crash reports (Apple platforms)
Upload that build’s dSYMs by hand. flutter build ipa leaves them in build/ios/archive/Runner.xcarchive/dSYMs; for an Xcode archive, show the package contents in Organizer. Zip them and drop the zip on the dSYMs tab of the Crashlytics dashboard, which works however Crashlytics was installed. The upload-symbols command below is the CocoaPods path; with Swift Package Manager there is no ios/Pods folder, so use the zip upload.
ios/Pods/FirebaseCrashlytics/upload-symbols \ -gsp ios/Runner/GoogleService-Info.plist -p ios \ build/ios/archive/Runner.xcarchive/dSYMs
Checked against the vendor’s docs on : Firebase: Get readable crash reports (Flutter); Firebase: Get readable crash reports (Apple platforms).
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
Related: Google Play “native code, no debug symbols” · Xcode PhaseScriptExecution failed · Flutter pod install failed · Firebase missing permissions