mcpField
N
native-app-profiling

native-app-profiling

github.com/patrickserrano開発1363 回インストール41 週間前に更新
リポジトリ

native-app-profiling について

`xcrun xctrace`でネイティブアプリを計測し、サンプルの書き出しやスタックフレームのシンボル化を行うCLIスキルです。Instrumentsを開かずに、macOSアプリやiOSシミュレーターアプリの性能上のホットスポットを調べられます。

主な機能

  1. 01Time Profilerトレースの記録
  2. 02サンプルのXML書き出し
  3. 03`atos`によるスタックフレームのシンボル化
  4. 04CPUホットスポットの特定
  5. 05iOSシミュレーターアプリの計測

活用シーン

  1. 01アプリ操作が遅い原因の調査
  2. 02トレース後のCPUサンプル確認
  3. 03スタックアドレスとシンボルの対応付け

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/patrickserrano/skills --skill native-app-profiling

インストール後、Claude Code で/native-app-profilingを入力して読み込まれたか確認します。

詳細

ネイティブアプリのパフォーマンスプロファイリング(CLI)

概要

xctrace で Time Profiler を記録し、サンプルを抽出してシンボリケーションを行うことで、Instruments を開かずにホットスポットを特定します。

クイックスタート

1) Time Profiler を記録する

実行中のプロセスに接続する:

# 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>

起動して記録する:

xcrun xctrace record \
    --template 'Time Profiler' \
    --time-limit 90s \
    --output /tmp/App.trace \
    --launch -- /path/to/App.app/Contents/MacOS/App
2) 時間サンプルをエクスポートする

トレースで利用可能なスキーマを一覧表示します:

xcrun xctrace export --input /tmp/App.trace --toc

時間プロファイルデータをエクスポートします:

xcrun xctrace export \
    --input /tmp/App.trace \
    --xpath '/trace-toc/run/data/table[@schema="time-profile"]' \
    --output /tmp/time-profile.xml
3) シンボリケーション用のロードアドレスを取得する

アプリの実行中に、__TEXT セグメントのロードアドレスを取得します:

vmmap <pid> | grep "__TEXT"

ロードアドレスを確認します(通常は 0x1... で始まります)。

4) スタックフレームをシンボリケーションする

atos を使ってアドレスをシンボリケーションします:

atos -o /path/to/App.app/Contents/MacOS/App -l 0x100000000 <address>

ワークフローに関する注意事項

  • 正しいバイナリ:正しいビルド(ローカル版と /Applications 内の版のどちらか)をプロファイリングしていることを確認します
  • 遅い処理を実行する:記録中に、遅いと感じる操作を実行します
  • 記録時間:スタックが空の場合は、記録時間を延ばすか、アイドル時間を避けます
  • シンボルの一致:バイナリのシンボルはトレースと一致している必要があります(同じビルド)

利用可能なテンプレート

すべてのプロファイリングテンプレートを一覧表示します:

xcrun xctrace list templates

よく使われるテンプレート:

  • Time Profiler - CPU サンプリング
  • Allocations - メモリ割り当て
  • Leaks - メモリリークの検出
  • System Trace - システムレベルのアクティビティ
  • Animation Hitches - UI パフォーマンス

よく使うコマンド

タスクコマンド
テンプレートを一覧表示xcrun xctrace list templates
デバイスを一覧表示xcrun xctrace list devices
記録のヘルプxcrun xctrace help record
エクスポートのヘルプxcrun xctrace help export
PID を取得pgrep -x "AppName"
ロードアドレスを取得vmmap <pid> | grep __TEXT
シンボリケーションatos -o <binary> -l <load-addr> <address>

結果の分析

手動分析
  1. トレースを XML にエクスポートします
  2. コールツリーのデータを解析します
  3. サンプル数の多いフレームを探します
  4. アプリのコードに注目します(システムフレームワークを除外します)
ホットスポットの特定

以下を探します:

  • セルフタイム(関数自体の処理に費やされた時間)が長い関数
  • 非効率なアルゴリズムを示す深いコールスタック
  • 最適化の余地を示唆する繰り返しパターン

注意点

  • ASLR:実行時の __TEXT ロードアドレスは起動のたびに変わるため、vmmap で取得します
  • ビルドの不一致:シンボルはプロファイリングしたビルドと完全に一致している必要があります
  • アイドル時間:アイドル状態のアプリをプロファイリングすると、データが空、または役に立たないものになります
  • 権限:一部の操作では sudo で実行する必要がある場合があります

iOS のプロファイリング

シミュレーター上の iOS アプリの場合:

xcrun xctrace record \
    --template 'Time Profiler' \
    --device <simulator-udid> \
    --time-limit 60s \
    --output /tmp/iOS-App.trace \
    --launch -- <bundle-id>

シミュレーターの UDID を取得します:

xcrun simctl list devices | grep Booted

自動化スクリプト

基本的な記録スクリプト:

#!/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"

チェックリスト

  • 正しいバイナリのパスを特定した
  • アプリが実行中、または起動コマンドを用意した
  • 遅い処理を再現できる
  • 問題の動作中にトレースを記録した
  • シンボリケーション用のロードアドレスを取得した
  • ホットスポットを特定するために結果を分析した

コメント