Отчеты о сбоях iOS: atos не работает должным образом

Я смотрю отчет о сбоях, предоставленный 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 для поиска строки кода, которая соответствует адресам адресов 0x0006573a и 0x0004fb26. Я получаю совершенно другое совпадение. Выход atos даже не из того же класса, который упоминается в журнале сбоев (MyViewController, MyImageTask). Вместо этого atos указывает мне на абсолютно мягкие строки кода в совершенно несвязанном классе. Я еще раз подтвердил, что я работаю с точным dSYM и IPA, которые я представил Apple.

Моя команда atos

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

Тот же результат с /usr/bin/atos и для armv7s.

Кто-нибудь еще испытал эту проблему? Вы могли бы посоветовать? Спасибо.

Ответ 1

Вам нужно вычислить адрес для использования с atos, вы не можете просто использовать его в stacktrace.

symbol address = slide + stack address - load address
  • Значение slide - это значение 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 на путь к фактическому исполняемому файлу.

  • stack address - это шестнадцатеричное значение из отчета о сбое.

  • load address может быть первым адресом, отображаемым в разделе Binary Images в самой передней части строки, которая содержит ваш исполняемый файл. (Обычно первая запись).

Так как в прошлом значение slide было равно значению load address, это всегда срабатывало. Но так как Apple представила рандомизацию размещения адресного пространства, начиная с iOS 4.3 (в разных вариантах), адрес загрузки приложений рандомизирован по соображениям безопасности.

Ответ 2

Простейшая альтернатива: вы можете использовать флаг atos -l, чтобы заставить его выполнять математику для вас.

Предположим, что в вашем журнале сбоев есть следующая строка:

5   MyApp                   0x0044e89a 0x29000 + 4348058

Первый шестнадцатеричный номер - это адрес стека, а второй шестнадцатеричный номер - адрес загрузки. Вы можете игнорировать последний номер. Вам также не нужно беспокоиться о слайд-адресах.

Чтобы символизировать, выполните следующие действия:

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

Если вы не можете найти файл MyApp.app/MyApp, переименуйте файл .ipa в ".zip", разархивируйте его и он будет в папке Payload.

И если вы не знаете, какую архитектуру использовать (например, armv7 или armv7s), прокрутите страницу "Двоичные изображения" в файле сбоя, и вы можете найти ее там.

Приветствия

Ответ 4

Для кого это определенное время не имеет значения для 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

Он просто считывает путь к приложению, имени приложения, адресу стека и значению после сигнала "+" (десятичное значение), а затем находит значение для адреса загрузки для выполнения команды atos.