コマンドライン経由でIPhoneアプリケーションをコンパイルしているため(XCodeオプションは含まれません)、Instrumentsでプロファイリングするときにシンボル名を表示できません。 -gdawrf-2や-gなどのいくつかのフラグを試してみましたが、成功しませんでした。また、dsymutilsを使用して.dSYMファイルを生成しようとしましたが、それを使用する方法がわからないため、同様に失敗しました。
どんな助けも大歓迎です!
Instrumentsがデバッグ情報を取得する方法:
計測器は、[デバッグシンボルの生成]オプションボックスのチェックマークとdSYMファイルを組み合わせて[デバッグ情報形式]を[DWARF]に設定すると、通常XCodeによって自動的に生成される.dSYMファイルからデバッグ情報を取得します。これらのオプションを設定すると、XCodeビルドプロセスに追加のステップが追加され、アプリケーションのコンパイル後にdSYMファイルが生成されます。すべてのdSYMは、派生元のバイナリのMach-OセクションのUUIDに対応するUUIDで構築されます。 Spotlightインポーターは、Mac上のSpotlightでアクセス可能な場所にあるすべてのdSymファイルのUUIDにインデックスを付けます。したがって、SPOTLIGHTはすべての黒魔術を実行し、実行中の.appとそれに対応する.dSYMファイルとの間のリンクを作成します。
XCodeなしでデバッグ情報とdSYMファイルを生成する方法:
–gdwarf-2および-gフラグに準拠していることを確認してください。 (他のフラグの組み合わせが機能する場合があります)
-gオペレーティングシステムのネイティブ形式(スタブ、COFF、XCOFF、またはDWARF 2)でデバッグ情報を生成します。 GDBはこのデバッグ情報を使用できます。スタブ形式を使用するほとんどのシステムでは、-gを使用すると、GDBのみが使用できる追加のデバッグ情報を使用できます。この追加情報により、GDBでのデバッグ作業が改善されますが、おそらく他のデバッガーがクラッシュしたり、プログラムの読み取りが拒否されたりします。追加情報を生成するかどうかを確実に制御する場合は、-gstabs +、-gstabs、-gxcoff +、-gxcoff、または-gvmsを使用します(以下を参照)。 GCCでは、-Oとともに-gを使用できます。最適化されたコードによって実行されるショートカットは、時折驚くべき結果をもたらす可能性があります。宣言した変数の中には、まったく存在しないものもあります。制御の流れは、予期しない場所に一時的に移動する場合があります。一部のステートメントは、一定の結果を計算するか、値がすでに手元にあるために実行されない場合があります。一部のステートメントはループ外に移動されたため、異なる場所で実行される場合があります。
それにもかかわらず、最適化された出力をデバッグできることが証明されています。これにより、バグがある可能性のあるプログラムにオプティマイザーを使用することが合理的になります。-gdwarf-2 DWARFバージョン2形式でデバッグ情報を生成します(サポートされている場合)。これは、IRIX 6上のDBXで使用される形式です。このオプションを使用すると、GCCは便利な場合にDWARFバージョン3の機能を使用します。バージョン3はバージョン2と上位互換性がありますが、古いデバッガーでは引き続き問題が発生する可能性があります。
Dsymutilを使用してdSYMファイルを生成します。ツールがコマンドラインで認識されない場合は、スポットライトを使用して見つけてください。重要:ネットワークドライブで作業している場合は、dSYMを生成する前にMac HDに.appファイルを配置してください。
dsymutil MyApp.app/MyApp -o MyApp.app.dSYM
.dSYMファイルをMacのローカルドライブに配置し、通常どおりにInstrumentsを実行します。
Resettig Spotlightのインデックス作成:
シンボルが表示されない場合、spotlighがバグしている可能性があります。スポットライトのインデックスをリセットするには、dSYMファイル(またはドライブ)を含むフォルダーを、スポットライトの基本設定の[スポットライトがこれらの場所を検索しないようにする]に追加し、すぐに削除します。
ビルド中にdSYMファイルを含まないようにプロジェクト設定を変更しました:
DSYMファイルを含めるように変更すると、プロファイラーがシンボルを解読し、問題を修正できました。
私はまだこれに関して問題を抱えていました。
私の問題は、dSYMファイルが生成されるのを見ることができたが、Instrumentsがそれをピックアップしていなかったことです。
これを修正するには、次を実行します。
Xcode 4.5では、デバッグビルドまたはリリースビルドからプロファイルを選択できます。リリースは、デバイスにコピーされたときにシンボルを削除するデフォルトです。リリース構成を壊さずに、プロファイリングのためにデバッグ構成に切り替えるのは非常に簡単です。これを行うには、XCodeメニューから[製品]-> [スキームの編集]を選択します。表示されるスキームのリストから「プロファイル」を選択し、そのための正しいビルド構成を選択します。
または、個別のリリース/プロファイル構成を作成し、それをスキームのプロファイルセクションで使用することもできます。個別のビルド構成を追加する方法は、 XCode User Guide で説明されています。
Xcode 7.1/7.3でこれを理解しようとして3日間を費やしました...
展開ターゲットを最新バージョン(当時9.3)に変更すると、この問題は修正されました。私の会社は7.0をターゲットにしているため、製品リリース時にターゲットを変更する(またはターゲットを変更するのを忘れる)ことを避けるために、InstrumentsでコードをプロファイリングするためのカスタムSchemeを作成する必要があります。
展開ターゲットに基づいてdSYMが機能しない場合、おそらくバグのようです。
Xcode 6 Instrumentsを使用すると、次のようにdSYMファイルを提供できます。
⌘+SHIFT+G
ダイアログで。また、Instrumentsは、選択したパスを使用して、将来このアプリのdSYMをロードするかどうかを尋ねます。はいと答えてください:)
問題は、スポットライトが.dSYMファイルを見つけられないことです。これは、AppleがDerivedDataフォルダーの場所を変更したためです。DerivedDataは〜/ Libraryに入ります
Spotlightは〜/ Libraryのインデックスを作成しませんそして確立できた限り、インデックスを作成することはできませんのいずれかです(例:mdimportは無視されます)。
プロファイラーでシンボルを取得するための回避策は、単純に〜/ライブラリの外部にデータをコピーする e.g.ホームディレクトリは正常に機能します。
私はこのコマンドラインを使用しました:
$ cp -r ~/Library/Developer/Xcode/DerivedData/AppName-xxxxxxxxxxx/Build/Products/Release-iphoneos/ ~/
プロファイラーを強制終了し、新しいプロファイルの実行を開始すると、シンボルが再び利用できることがわかります。
ビルドログを確認し、-g
スイッチはコンパイラーを通過します-異なるビルド構成などのプロジェクトおよび/またはターゲットレベルで設定を変更する場合、この間違いを犯しやすいです。
Xcode 4に付属するInstrumentsのバージョンでの別の回避策は、InstrumentsのFileメニューの下にあるRe-Symbolicate Documentメニュー項目を使用することです。このメニュー項目を使用すると、〜/ Library/...ディレクトリの.dSYMファイルにあるシンボルを使用できます。
私の経験では、これは通常、アプリの最新の修正バージョンがターゲットデバイスにインストールされる前に「プロファイル」が呼び出されたためです。
デバイス/ターゲットでアプリを実行してみてくださいその後、再インストール後に「プロファイル」を再度呼び出します。
XCodeプロジェクトがネットワーク共有上にあり、SpotlightがdSYMファイルを見つけられないため、この問題が発生しました。ローカルドライブにあることを確認します。
この問題に対処するために、「プロファイル」ビルド構成を作成しました。同様のStackoverflowの質問については my answer をご覧ください。