Skills

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] has name, base (load address), uuid, arch for each loaded binary
  • threads[N].frames[M] has imageOffset, imageIndex; frame address = usedImages[imageIndex].base + imageOffset
  • exception.type, exception.signal (e.g., EXC_CRASH / SIGABRT)
  • asi (Application Specific Information) often contains the managed exception message
  • lastExceptionBacktrace has frames from the exception that triggered the crash
  • faultingThread is the index into the threads array
Read the whole SKILL.md on GitHub

More in Testing