ios-ettrace-performance

Capture and analyze symbolicated ETTrace flamegraph profiles from iOS simulator apps.

Updated Jul 31, 2026
One-click install
npx skills add https://github.com/AarnavBaddam/skills --skill ios-ettrace-performance-aarnavbaddam
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: ios-ettrace-performance
Source: https://github.com/AarnavBaddam/skills/tree/main/ios-ettrace-performance
Command: npx skills add https://github.com/AarnavBaddam/skills --skill ios-ettrace-performance-aarnavbaddam

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes scripts (resource) components.

What problem does it solve? Profiling iOS app launch and runtime latency on the simulator is hard when traces are unsymbolicated, overwritten between runs, or mixed with idle thread noise. This Skill provides a repeatable workflow to link ETTrace into a simulator app, collect UUID-matched dSYMs, capture one focused flow, and analyze the processed flamegraph JSON for CPU-heavy stacks. ## Core Features & Use Cases - Guided ETTrace capture: Step-by-step instructions to build a simulator ETTrace.xcframework, link it into the app target, and record launch or runtime traces with the Homebrew ettrace runner. - dSYM collection script: scripts/collect_ios_dsyms.sh gathers UUID-matched dSYMs for the app executable and embedded frameworks, with required-framework enforcement so symbolication gaps fail loudly. - Flamegraph analysis script: scripts/analyze_flamegraph_json.py validates the ETTrace v1.1.0 processed JSON shape and reports top active self frames and inclusive stacks, excluding idle and unattributed frames. - Use Case: An engineer investigating slow cold launch links ETTrace into the debug simulator build, captures a launch trace with matching dSYMs, and reads the ranked hotspot report to find the first-party functions dominating startup time. ## Quick Start Ask the agent to capture a symbolicated ETTrace profile of one focused flow in your iOS simulator app and report the top CPU-heavy stacks.

Frequently Asked Questions about ios-ettrace-performance

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I profile iOS app launch time on the simulator?

Link ETTrace into the simulator app target, collect matching dSYMs, then run ettrace --simulator --launch --dsyms with your dSYM folder. The processed output_<thread>.json flamegraph shows which stacks dominate startup time.

How do I symbolicate an ETTrace flamegraph for an iOS app?

Run scripts/collect_ios_dsyms.sh with your built .app and search roots to gather UUID-matched dSYMs for the executable and embedded frameworks. Pass that folder to ettrace with --dsyms so the processed flamegraph resolves first-party symbols.

Why does my ETTrace flamegraph show unsymbolicated frames?

Unsymbolicated frames mean the dSYM UUIDs do not match the profiled binary, usually because the app was rebuilt after dSYMs were collected. Rebuild with dSYM generation enabled, re-run the collection script, and verify UUIDs with dwarfdump before tracing.

Can I use ETTrace on a physical iOS device with this workflow?

This workflow is validated only for the iOS Simulator using the Homebrew ettrace runner in simulator mode, which listens on a fixed localhost port. It builds a simulator-only ETTrace.xcframework and does not cover on-device capture.

What is the difference between output.json and output_<thread>.json in ETTrace?

Processed flamegraph results are written as output_<thread>.json files with a top-level nodes tree, which is what the analyzer accepts. The output.json name is also used by ETTrace's viewer route and raw emerge-output captures, which are not symbolicated flamegraphs.