Help us improve
Share bugs, ideas, or general feedback.
From ios-swift-skills
Profile native macOS/iOS apps using Time Profiler via CLI (xctrace). Use when asked to identify performance hotspots, profile CPU usage, or diagnose slow code paths without opening Instruments.
npx claudepluginhub patrickserrano/skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/ios-swift-skills:skills/native-app-profilingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Record Time Profiler via `xctrace`, extract samples, symbolicate, and identify hotspots without opening Instruments.
Profiles iOS app performance with Instruments: Time Profiler for CPU, Allocations and Leaks for memory, Network for traffic, Energy Log for battery impact. Optimizes launch times, scrolling, and energy use.
Debug iOS apps and profile performance using LLDB, Memory Graph Debugger, and Instruments. Use when diagnosing crashes, memory leaks, retain cycles, main thread hangs, or performance bottlenecks.
Debugs iOS, Android, and React Native mobile apps for crashes, memory leaks, performance issues, network problems using Xcode Instruments, Android Profiler, LLDB, Logcat.
Share bugs, ideas, or general feedback.
Record Time Profiler via xctrace, extract samples, symbolicate, and identify hotspots without opening Instruments.
Attach to running process:
# Get the PID first
pgrep -x "AppName"
# Record for 90 seconds
xcrun xctrace record \
--template 'Time Profiler' \
--time-limit 90s \
--output /tmp/App.trace \
--attach <pid>
Launch and record:
xcrun xctrace record \
--template 'Time Profiler' \
--time-limit 90s \
--output /tmp/App.trace \
--launch -- /path/to/App.app/Contents/MacOS/App
List available schemas in the trace:
xcrun xctrace export --input /tmp/App.trace --toc
Export time profile data:
xcrun xctrace export \
--input /tmp/App.trace \
--xpath '/trace-toc/run/data/table[@schema="time-profile"]' \
--output /tmp/time-profile.xml
While the app is running, get the __TEXT segment load address:
vmmap <pid> | grep "__TEXT"
Look for the load address (typically starts with 0x1...).
Use atos to symbolicate addresses:
atos -o /path/to/App.app/Contents/MacOS/App -l 0x100000000 <address>
List all profiling templates:
xcrun xctrace list templates
Common templates:
Time Profiler - CPU samplingAllocations - Memory allocationsLeaks - Memory leak detectionSystem Trace - System-level activityAnimation Hitches - UI performance| Task | Command |
|---|---|
| List templates | xcrun xctrace list templates |
| List devices | xcrun xctrace list devices |
| Record help | xcrun xctrace help record |
| Export help | xcrun xctrace help export |
| Get PID | pgrep -x "AppName" |
| Get load address | vmmap <pid> | grep __TEXT |
| Symbolicate | atos -o <binary> -l <load-addr> <address> |
Look for:
__TEXT load address changes each launch - get it from vmmapsudo for some operationsFor iOS apps on simulator:
xcrun xctrace record \
--template 'Time Profiler' \
--device <simulator-udid> \
--time-limit 60s \
--output /tmp/iOS-App.trace \
--launch -- <bundle-id>
Get simulator UDID:
xcrun simctl list devices | grep Booted
Basic recording script:
#!/bin/bash
set -e
APP_NAME="$1"
DURATION="${2:-60}"
OUTPUT="${3:-/tmp/$APP_NAME.trace}"
if [ -z "$APP_NAME" ]; then
echo "Usage: $0 <app-name> [duration-seconds] [output-path]"
exit 1
fi
PID=$(pgrep -x "$APP_NAME" || true)
if [ -n "$PID" ]; then
echo "Attaching to running $APP_NAME (PID: $PID)"
xcrun xctrace record \
--template 'Time Profiler' \
--time-limit "${DURATION}s" \
--output "$OUTPUT" \
--attach "$PID"
else
echo "App not running. Please start $APP_NAME first."
exit 1
fi
echo "Trace saved to: $OUTPUT"
echo "To analyze: xcrun xctrace export --input $OUTPUT --toc"