Re-Symbolicate (デバッグシンボルの再割り当て)

MacやiPhoneアプリケーションを開発している皆さんは、Instrumentsを使っているだろうか。
Instrumentsはこの手のプロファイラとしては最も高性能且つ高機能なツールであり、それがなんと無償で使えるのだ。使わなくては損だろう。※1

経緯

先日、OpenCVのサンプルを実機(iPod Touch)で動作させた所シミュレータの100倍以上遅かったので、これはやばいと思い※2、InstrumentsのCPU - Time Profilingでプロファイルを実施した。

処理は

1. 画像を読みこむ (UIImage->ImplImage変換)
2. 2値化の実施(BGR->グレースケール->白黒)
3. 輪郭のパースと描画(cvFindContour->cvDrawContour)

この手順をOpenCVの関数を使って実装しており、どの関数でどれだけのCPU時間が消費されているかを調べれば、実機とシミュレータで何が違うのかがはっきりするはずなのだが、なにかおかしい。


Instrumentsのシンボルアイコンには意味があり、例えばシステムライブラリィであれば、ユーザコードは黒抜きの人のアイコンで表される。ユーザコードだけをトレースしたい場合、このように左側のCallTreeペイン中で"Hide Missing Sumbols"、"Hide System Libraries"をチェックすることで余計なシンボルをフィルタできるのだが、ユーザコードだけは表示されるはず。しかしそれが全く表示されないのはおかしい。OpenCVのビルドではなんらかの原因によりプロファイリング用のシンボル情報が無いか、又はシンボル情報を探せないのだろうと思われる。

これでは正しいプロファイリングは出来ない(原因のコードの特定ができない)が、このようなケースを想定してかInstrumentsでは対象のプロセスに対してシンボルを紐付けし直す"Re-Symbolicate"という機能がある。

dSYM(デバッグシンボル)の最割り当て


シンボルの最割り当ての操作は簡単は簡単だ、まずはプロファイリングを終了させておいてメニューから"Re-Symbolicate"を選択する。(停止中じゃないとRe-Symbolicateはできない)


そうするとプロファイリング対象のデバイスで動作しているバイナリを選択するダイアログが表示されるので、対象のアプリケーションを選択する(この例ではOpenCVTestを選択)

この段階でdSYMカラムが???となっているものはデバッグ用シンボルが割り当てられていないか不明なものなので直接割り当てるために"Locate"ボタンを押下する


すると今度は"Select dSYM for OpenCVTest"と対象のアプリケーションに対して結びつけるシンボルファイルを選択するFinderダイアログが表示されるので、適当なシンボルファイルを選択する。実機用のシンボルは通常であれば

~/Library/Developer/DerivedData/OpenCVTest-ハッシングされた英数字/Build/Products/Release-iphoneos/OpenCVTestapp.dSYM

のように、アプリケーションのバイナリと共に配置されているはずだ。
もし分かり難ければXcode上でプロジェクトに作られた"Product"グループ下に生成されているアプリケーション(OpenCVTest.app)を選択してコンテキストメニュー"Show In Finder"で実パスを確認することができる。


選択したファイルが正しいデバッグシンボル(dSYM)の場合はこのようにdSYMが割り当てられた状態になるので"Symbolicate"ボタンを押せば完了だ。

Re-Symbolicate結果


デバッグシンボルが正しく割り当てられている場合、このようにユーザコードが黒いアイコンと共にトレースツリー上に表示されるので、自分のコードを含めた状態で適切なプロファイリングが実施できるという訳だ。

なお、この"Re-Symbolicate"だがInstruments終了までは有効になっているが、何故か次回に再度プロファイリングを実行してもデバッグシンボルの情報が反映されないケースがある。この場合は再度Re-Symbolicateを実行することで反映されるようだ。(どうしてこうなってしまうかの原因はまだ解っていない)


これで漸くスタートラインに立てた訳だ。

※1:厳密に言うとデベロッパ登録料は掛かっているので年間¥8,400だが。
※2:iOSのシミュレータはMacのCPU、メモリ、GPUが使えるため実機に比べると非常に高性能だが、それでも100倍以上の差が付くのはおかしい