Install any skill in seconds. Free to start, no credit card required.
Get Started Free →dotnet/apple-crash-symbolication
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 libmonosge
Passed 21 of 22 test cases with the skill, and 16 of 22 without it.
and 2 more in the full report
5 fixed17 passed either way1 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 5 test cases the skill fixed. Same model, same prompt, with and without the skill.
When using the `Symbolicate-Crash.ps1` automation script provided in the repository, which parameter allows generating a quick summary of the crash without downloading symbols or running `atos`?
| Checked | Without skill | With skill |
|---|---|---|
| Specifies the -ParseOnly flag. | Missed | Passed |
The instructions your model reads when the skill loads.
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.
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 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 arrayParsing gotcha: Some .ips files have case-conflicting duplicate keys (vmRegionInfo / vmregioninfo). Pre-process the raw JSON to rename the lowercase duplicate before parsing. The asi field may be absent.
Filter usedImages to .NET runtime libraries:
| Library | Runtime |
|---|
test cases passed, vs 16 / 22 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.