Apple Crash Symbolication
Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac...
Install
npx skills add dotnet/skills --skill apple-crash-symbolication -g -a claude-code -y- Repository
- dotnet/skills5.8k
- Category
- Testing
- Updated
- 3d ago
- License
- MIT
- Context cost
- Mediumabout 2,186 tokens
- Runs scripts
- No, instructions only
What it does
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.
Apple Platform Crash Log .NET Symbolication
Resolves native backtrace frames from .NET MAUI and Mono app crashes on Apple platforms (iOS, tvOS, Mac Catalyst, macOS) to function names, source files, and line numbers using Mach-O UUIDs and dSYM debug symbol bundles.
Inputs: Crash log file (.ips JSON format, iOS 15+ / macOS 12+), atos (from Xcode), optionally a connected iOS device to pull crash logs from.
Do not use when: The crashing library is not a .NET component (e.g., pure Swift/UIKit), or the crash log is an Android tombstone.
Workflow
Step 1: Parse the .ips Crash Log
Format check: Before proceeding, verify the file is .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.
The .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
Key fields in the crash body:
usedImages[N]hasname,base(load address),uuid,archfor each loaded binarythreads[N].frames[M]hasimageOffset,imageIndex; frame address =usedImages[imageIndex].base + imageOffsetexception.type,exception.signal(e.g.,EXC_CRASH/SIGABRT)asi(Application Specific Information) often contains the managed exception messagelastExceptionBacktracehas frames from the exception that triggered the crashfaultingThreadis the index into thethreadsarray


