I need to write up a whole guide, but here’s the short version:

You can use a tool like MXSymbolicate to symbolicate MXCrashDiagnostic payloads, but aside from the debug symbols for the version of the app the crash came from, you’ll also want the symbols of all the system frameworks for the exact version of iOS the crash occurred on. The most straightforward way to do this, is to connect the device in question to Xcode, which starts a process like “Preparing device for development” or “Copying shared cache symbols”. This populates your ~/Library/Developer/Xcode/iOS DeviceSupport folder with the debug symbols from the iOS version running on the device. MXSymbolicate can then use them to symolicate the report.

But what if you don’t have every iOS device running every iOS version handy? The alternative is to locate the IPSW file for the device/version combo you need, and unzip it (it’s just a zip file, just like .ipa). Inside you’ll find several .dmg files. Some of them will, depending on the iOS version, either the .dylib files you want, or something called a dyld_shared_cache. A tool like dyld-shared-cache-extractor can then turn that back into .dylib files.

You end up with a lot of symbol files this way. MXSymbolicate just iterates over all the ones in can find, but that gets slow fast. You’ll want to build an index using dwarfdump --uuid to get the identifier for each symbol file, and use that to quickly look up the binaryUUID that the MXCrashDiagnostic payload lists for each frame.