私はアップルが提供するクラッシュレポートを見ています
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を使用して、アドレスの場所0x0006573aおよび0x0004fb26完全に異なるマッチが得られます。 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で同じ結果が得られます。
他の誰かがこの問題を経験しましたか?あなたがアドバイスしていただけますか?ありがとう。
Atosで使用するアドレスを計算する必要があります。スタックトレースでアドレスを使用することはできません。
symbol address = slide + stack address - load address
slide
値は、LC_SEGMENT cmd
のvmaddr
の値です(ほとんどの場合、これは0x1000
です)。以下を実行して取得します。
otool -Arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
ARCHITECTURE
を、クラッシュレポートが示す実際のアーキテクチャに置き換えます。 armv7
。 APP_BUNDLE/APP_EXECUTABLE
を実際の実行可能ファイルへのパスに置き換えます。
stack address
は、クラッシュレポートの16進値です。
load address
beは、実行可能ファイルを含む行の先頭にあるBinary Images
セクションに表示される最初のアドレスです。 (通常は最初のエントリ)。
過去にslide
の値はload address
の値と同じであったため、これは常に機能していました。ただし、Apple導入 アドレス空間レイアウトのランダム化 iOS 4.3以降(異なるバリエーション))であるため、アドレスを読み込むアプリはセキュリティ上の理由からランダム化されます。
より簡単な代替手段: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」に変更して解凍し、ペイロードフォルダーに配置します。
また、使用するアーキテクチャがわからない場合(たとえば、armv7またはarmv7s)、クラッシュファイルの「バイナリイメージ」の部分までスクロールすると、そこから見つけることができます。
乾杯
単にdwarfdumpを使用します。
dwarfdump --Arch armv7 myApp.dSYM --lookup 0xaabbccdd | grep 'Line table'
計算を行う必要はまったくありません。
(From アドレスによるシンボルの取得(バイナリのシンボリック、iOSビルド) )。
その特定の時間には、次のような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コマンドを実行するロードアドレスの値を見つけます。