64

Apple から提供されたクラッシュ レポートを見ている

Hardware Model:      iPhone4,1
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-11-18 16:03:44.951 -0600
OS Version:      iOS 6.0.1 (10A523)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x51fe5264
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x352925b0 objc_msgSend + 16
1   MYAPP                           0x0006573a -[MyViewController(Images) didReceiveImage:context:etag:expires:] + 42
2   MYAPP                           0x0004fb26 -[MyImageTask didReceiveImage:] + 98
3   Foundation                      0x361ac8e8 __NSThreadPerformPerform
4   CoreFoundation                  0x3b37d680 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
5   CoreFoundation                  0x3b37cee4 __CFRunLoopDoSources0
6   CoreFoundation                  0x3b37bcb2 __CFRunLoopRun
7   CoreFoundation                  0x3b2eeeb8 CFRunLoopRunSpecific
8   CoreFoundation                  0x3b2eed44 CFRunLoopRunInMode
9   GraphicsServices                0x396bc2e6 GSEventRunModal
10  UIKit                           0x3452e2f4 UIApplicationMain
11  MYAPP                           0x0004934a main + 70
12  MYAPP                           0x000492fc start + 36

面白いことに、atos を使用してアドレス位置0x0006573a0x0004fb26に対応するコード行を検索すると、完全に異なる一致が得られます。atos の出力は、クラッシュ ログ (MyViewController、MyImageTask) に記載されているクラスと同じではありません。代わりに、atos は、まったく無関係なクラスの完全に無害なコード行を示しています。Apple に提出した正確な dSYM と IPA を使用していることを再度確認しました。

私のatosコマンド

/Applications/Xcode.app/Contents/Developer/usr/bin/atos -arch armv7 -o MYAPP.app/MYAPP 0x0004fb26

/usr/bin/atos と armv7s で同じ結果になります。

他の誰かがこの問題を経験しましたか? あなたがアドバイスしていただけますか?ありがとう。

4

4 に答える 4

109

より簡単な代替方法:atos -lフラグを使用して、計算を実行させることができます。

シンボリック化したいクラッシュ ログに次の行があるとします。

5   MyApp                   0x0044e89a 0x29000 + 4348058

最初の 16 進数はスタック アドレスで、2 番目の 16 進数はロード アドレスです。最後の番号は無視できます。スライドのアドレスについても心配する必要はありません。

シンボリック化するには、次の操作を行います。

atos -o MyApp.app/MyApp -arch armv7 -l 0x29000 0x0044e89a

MyApp.app/MyApp ファイルが見つからない場合は、「.ipa」ファイルの名前を「.zip」に変更して解凍すると、Payload フォルダーに保存されます。

また、使用するアーキテクチャ (たとえば、armv7 または armv7s) がわからない場合は、クラッシュ ファイルの「バイナリ イメージ」の部分までスクロールすると、そこにあることがわかります。

乾杯

于 2013-10-09T23:18:28.163 に答える
96

atos で使用するアドレスを計算する必要があります。スタック トレース内のアドレスだけを使用することはできません。

symbol address = slide + stack address - load address
  1. slide値は in の値ですvmaddr(ほとんどLC_SEGMENT cmdの場合は です0x1000)。以下を実行して取得します。

    otool -arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
    

    ARCHITECTUREクラッシュ レポートが示す実際のアーキテクチャに置き換えarmv7ます。APP_BUNDLE/APP_EXECUTABLE実際の実行可能ファイルへのパスに置き換えます。

  2. stack address、クラッシュ レポートの 16 進値です。

  3. can は、実行可能ファイルを含む行の一番前のセクションに表示される最初のload addressアドレスです。Binary Images(通常は最初のエントリ)。

以前は の値は の値と同じだったのでslideload addressこれは常に機能していました。しかし、Appleが iOS 4.3 からアドレス スペース レイアウトのランダム化を (さまざまなバリエーションで) 導入したため、セキュリティ上の理由から、アプリの読み込みアドレスはランダム化されています。

于 2012-11-27T01:22:50.137 に答える
11

単純に dwarfdump を使用します。

dwarfdump --arch armv7 myApp.dSYM --lookup 0xaabbccdd | grep 'Line table'

計算を行う必要はまったくありません。

(アドレスによるシンボルの取得 (バイナリのシンボル化、iOS ビルド) から)。

于 2013-10-12T00:50:21.707 に答える
3

その特定の時間に、次のような Load Address の値がない人:

Jan 14 11:02:39 Dennins-iPhone AppName[584] <Critical>: Stack Trace: (
    0   CoreFoundation                      0x2c3084b7 <redacted> + 150
    1   libobjc.A.dylib                     0x39abec8b objc_exception_throw + 38
    2   CoreFoundation                      0x2c21cc35 CFRunLoopRemoveTimer + 0
    3   AppName                             0x0005a7db AppName + 272347  

デバッグに役立つ簡単な bash を作成しました。

#! /bin/bash
read -p "[Path] [App Name] [Stack Address] [DecimalSum] " path appName stackAddress decimalSum
loadAddress=`echo "obase=16;ibase=10;$((stackAddress-decimalSum))" | bc`
atos -o $path/Payload/$appName.app/$appName -l $loadAddress $stackAddress -arch armv7

アプリのパス、アプリ名、スタック アドレス、および "+" 信号の後の値 (10 進数値) を読み取り、ロード アドレスの値を見つけて atos コマンドを実行します。

于 2015-01-14T16:31:19.563 に答える