Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift/Objective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.
.ips JSON format, iOS 15+ / macOS 12+), atos (from Xcode), optionally a connected iOS device to pull crash logs from..ips JSON format. The first line must be valid JSON. If the file is plain text (e.g., Android tombstone with #NN pc frame lines, or legacy Apple .crash text format), stop immediately — this workflow does not apply. Report the format mismatch to the user and do not attempt any symbolication..ips file is two-part JSON: line 1 is a metadata header; the remaining lines are a separate JSON crash body. Parse them separately:lines = open('crash.ips').readlines()
metadata = json.loads(lines[0]) # app_name, bundleID, os_version, slice_uuid
crash = json.loads(''.join(lines[1:])) # Full crash report
usedImages[N] has name, base (load address), uuid, arch for each loaded binarythreads[N].frames[M] has imageOffset, imageIndex; frame address = usedImages[imageIndex].base + imageOffsetexception.type, exception.signal (e.g., EXC_CRASH / SIGABRT)asi (Application Specific Information) often contains the managed exception messagelastExceptionBacktrace has frames from the exception that triggered the crashfaultingThread is the index into the threads arrayvmRegionInfo / vmregioninfo). Pre-process the raw JSON to rename the lowercase duplicate before parsing. The asi field may be absent.usedImages to .NET runtime libraries:| Library | Runtime |
|---|---|
libcoreclr | CoreCLR runtime |
libmonosgen-2.0 | Mono runtime |
libSystem.Native | .NET BCL native component |
libSystem.Globalization.Native | .NET BCL globalization |
libSystem.Security.Cryptography.Native.Apple | .NET BCL crypto |
libSystem.IO.Compression.Native | .NET BCL compression |
libSystem.Net.Security.Native | .NET BCL net security |
.framework bundles, so image names may omit .dylib. Match using substring (e.g., libcoreclr not libcoreclr.dylib). The app binary may appear twice in usedImages with different UUIDs.xamarin_process_managed_exception (managed exception bridged to ObjC NSException), xamarin_main, mono_jit_exec, coreclr_execute_assembly.libSystem.* BCL libraries remain separate. The app binary needs its own dSYM from the build output.libsystem_kernel.dylib, UIKitCore, and other Apple system frameworks unless specifically asked.asi (Application Specific Information) — for .NET crashes, it often contains the managed exception type and message (e.g., XamlParseException, NullReferenceException). The root cause may already be visible here.threads[faultingThread]). Explain what frames #0 and #1 mean before examining other threads. Cross-thread context (GC state, thread pool) is useful for validation but not evidence of causation.lastExceptionBacktrace for the managed exception path through bridge functions like xamarin_process_managed_exception.usedImages, particularly on macOS when using shared-framework installs or NuGet-pack-style layouts (e.g., .../Microsoft.NETCore.App/10.0.4/libcoreclr.dylib). On iOS, however, image paths are typically inside the app bundle (for example, .../Frameworks/libcoreclr.framework/libcoreclr) and do not embed the runtime version, so you usually need to infer it via the Mach-O UUID by matching against SDK packs or symbol-server downloads rather than relying on the path alone..dwarf via https://msdl.microsoft.com/download/symbols/_.dwarf/mach-uuid-sym-{UUID}/_.dwarf (UUID lowercase, no dashes). Convert to .dSYM bundle (use the image name from usedImages[].name, e.g., libcoreclr):
mkdir -p libcoreclr.dSYM/Contents/Resources/DWARF
cp _.dwarf libcoreclr.dSYM/Contents/Resources/DWARF/libcoreclr
bin/Debug/net*-ios/ios-arm64/<App>.app.dSYM/$DOTNET_ROOT/packs/Microsoft.NETCore.App.Runtime.<rid>/<version>/runtimes/<rid>/native/~/.nuget/packages/microsoft.netcore.app.runtime.<rid>/<version>/runtimes/<rid>/native/dotnet-symbol: dotnet-symbol --symbols -o symbols-out <path-to-binary.dylib>dwarfdump --uuid <dsym> must match the UUID from the crash log exactly.atos -arch arm64 -o <path.dSYM/Contents/Resources/DWARF/binary_name> -l <load_address> <frame_addresses...>
-o points to the DWARF binary inside the .dSYM bundle (Contents/Resources/DWARF/), not the bundle itself-l is the load address from usedImages[N].basearch from usedImages[N].arch (usually arm64, may be arm64e)# Example: symbolicate libcoreclr frames
atos -arch arm64 -o libcoreclr.dSYM/Contents/Resources/DWARF/libcoreclr -l 0x104000000 0x104522098 0x1043c0014
/__w/1/s/ CI workspace prefix from output — meaningful paths start at src/runtime/, mapping to the dotnet/dotnet VMR.# $SKILL_DIR is the directory containing this SKILL.md
pwsh "$SKILL_DIR/scripts/Symbolicate-Crash.ps1" -CrashFile MyApp-2026-02-25.ips
-ParseOnly for a fast overview without requiring atos. The script automatically downloads symbols from the Microsoft symbol server when local dSYMs are missing.-CrashingThreadOnly, -OutputFile path, -ParseOnly, -SkipVersionLookup, -SkipSymbolDownload, -SymbolCacheDir path, -DsymSearchPaths path1,path2.idevicecrashreport (from libimobiledevice):idevicecrashreport -e /tmp/crashlogs/
find /tmp/crashlogs/ -iname '*MyApp*' -name '*.ips'
~/Library/Logs/CrashReporter/ (Mac Catalyst), ~/Library/Logs/DiagnosticReports/ (macOS).dwarfdump --uuid <dsym> matches UUID from the crash logsrc/coreclr/, mono/metadata/, mono/mini/).ips JSON (e.g., Android tombstone with #NN pc stack frames, legacy .crash text format), stop immediately — report the format mismatch to the user and do not proceed with any symbolication. Do not attempt to symbolicate using other tools or workflows.atos commands for the user to run. Do not install Xcode. atos ships with Xcode Command Line Tools (xcode-select --install).