1

私のアプリは、Objective C と C++ の両方で書かれています。私は xcode 4.5 を使用しており、もちろん開発者アカウントを持っています。デバイスは脱獄されておらず、開発者アカウントですべてをセットアップしました。私は xcode の「デバイス ログ」を使用しません。代わりに、シグナル/例外ハンドラーを実装してスタック トレースをファイルに書き込み、次にアプリを起動したときにそれを Web サーバーに送信します。

クラッシュ時にスタック トレースを取得するには、[NSException callStackSymbols] を使用します。できます。したがって、次のようなサンプル クラッシュを実行すると、次のようになります。

NSArray *arr=[NSArray array];
[arr objectAtIndex:100];

xcodeでデバッグし、デバイスのxcodeアプリからインストールして起動すると、次のようになります:

0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
  1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
  2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
  3 MyApp 0x001be505 _ZN8Menu6handleEN12GestureE + 912
  4 MyApp 0x000e6ce1 _ZN13BaseLevel10handleBaseEN12GestureE + 440
  5 MyApp 0x0011b747 _ZN12Manager6handleEN12GestureE + 742
  6 MyApp 0x00102731 _ZN13Processor9doProcessEd + 552
  7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
  8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
  9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
  10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60

MyApp の c++ および objc のクラスとメソッドは正常にシンボリック化されています。

しかし、AdHoc ipa を作成し、その中で同じクラッシュを実行すると、次のようになります。

0 CoreFoundation 0x36c738a7 __exceptionPreprocess + 186
  1 libobjc.A.dylib 0x3308a259 objc_exception_throw + 32
  2 CoreFoundation 0x36bcb23d -[__NSArrayI objectAtIndex:] + 164
  3 MyApp 0x001be505 _mh_execute_header + 894213
  4 MyApp 0x000e6ce1 _mh_execute_header + 11489
  5 MyApp 0x0011b747 _mh_execute_header + 227143
  6 MyApp 0x00102731 _mh_execute_header + 124721
  7 GLKit 0x3723a0c5 -[GLKViewController _updateAndDraw] + 272
  8 CoreFoundation 0x36bd27d3 -[NSObject performSelector:] + 38
  9 QuartzCore 0x3233486f _ZN2CA7Display11DisplayLink8dispatchEyy + 166
  10 QuartzCore 0x323347c5 _ZN2CA7Display16IOMFBDisplayLink8callbackEP21__IOMobileFramebufferyyyPv + 60]

つまり、クラスとメソッドの名前がなくなり、シンボル _mh_execute_header+<offset> に置き換えられました。

dSYM 設定を見逃していると思っていましたが、リリースとデバッグの両方でオンになっており、「デバッグ シンボルの削除」もオフになっています。

SOで検索しましたが、運がありません。何が悪いのか教えてください。

4

2 に答える 2

1

残念ながら、私は象徴的な技術に慣れていませんでした。つまり、スタック トレースをシンボル化するには、パッケージの dSYM と xcode が必要で、プライベート API でクラッシュ ログをシンボル化します。次回はもっと書くかもしれませんが、(私にとって)最も便利な方法でそれを行う方法をまだ学んでいます。

編集: 1 週間が経過し、ソリューションを開発しました。これは私のマルチプラットフォーム エコシステムに固有のものですが、ここでは簡単に説明します。アプリがクラッシュし、必要なすべてのデータを含むクラッシュ ログがサーバーに送信されます。クラッシュ ログを確認したい場合は、デスクトップでユーティリティを起動して、サーバーからすべてのスタック (リリース/アーム バイナリから) をダウンロードしますが、まだ処理されていません。次に、Xcode アーカイブ フォルダーで対応するバンドルを検索し (必要なアーキテクチャの uuids/vmaddr を取得)、スタック ラインの実際のアドレスを計算し (受信したログからバイナリ vaddr と _mh_execute_header アドレスを使用)、すべてのアドレスに対して atos を呼び出します。次に、atos の出力を解析し、差分を生成してサーバーに送り返します。このようにして、php ベースのバグトラッカーでシンボル化されたスタックを確認できます。Java で難読化解除されたスタックを取得するのはそれほど簡単ではありませんでしたが、それでも可能です。

于 2012-09-29T01:08:28.440 に答える
0

私が書いたこのシンボル化ツールを使用して、アプリのアドレスをすばやくシンボル化できます。

symbolication your.app.dSYM your.app.trace

シンボリック化されたバージョンは STDOUT に出力されます。最良の結果を得るには、.app を .dSYM と同じフォルダーに保管してください。

https://github.com/Imperiopolis/Symbolication

于 2012-10-19T12:17:59.653 に答える