native-app-profiling について
`xcrun xctrace`でネイティブアプリを計測し、サンプルの書き出しやスタックフレームのシンボル化を行うCLIスキルです。Instrumentsを開かずに、macOSアプリやiOSシミュレーターアプリの性能上のホットスポットを調べられます。
主な機能
- 01Time Profilerトレースの記録
- 02サンプルのXML書き出し
- 03`atos`によるスタックフレームのシンボル化
- 04CPUホットスポットの特定
- 05iOSシミュレーターアプリの計測
活用シーン
- 01アプリ操作が遅い原因の調査
- 02トレース後のCPUサンプル確認
- 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> |
結果の分析
手動分析
- トレースを XML にエクスポートします
- コールツリーのデータを解析します
- サンプル数の多いフレームを探します
- アプリのコードに注目します(システムフレームワークを除外します)
ホットスポットの特定
以下を探します:
- セルフタイム(関数自体の処理に費やされた時間)が長い関数
- 非効率なアルゴリズムを示す深いコールスタック
- 最適化の余地を示唆する繰り返しパターン
注意点
- 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"
チェックリスト
- 正しいバイナリのパスを特定した
- アプリが実行中、または起動コマンドを用意した
- 遅い処理を再現できる
- 問題の動作中にトレースを記録した
- シンボリケーション用のロードアドレスを取得した
- ホットスポットを特定するために結果を分析した
コメント
Markdown 対応