Отчеты о сбоях 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.

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


person George Burdell    schedule 26.11.2012    source источник


Ответы (4)


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

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

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

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

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

person Kerni    schedule 27.11.2012
comment
очень полезно. Спасибо за объяснение. - person chathuram; 03.01.2013
comment
Но я не получил 3-го балла полностью. Было бы здорово, если бы вы могли указать, откуда я могу найти раздел двоичных изображений. - person chathuram; 03.01.2013
comment
Глупый, адрес загрузки можно найти в самом отчете о сбое, двоичные изображения: 0x79000 - 0x206fff + MyApp armv7 ‹80b56c4fbede355288cf5faa80ab7827› /var/mobile/Applications/0709EF90-2F23-4220-AB2E-48BA4C983C9A/MyApp.MyApp.MyApp. - person chathuram; 03.01.2013
comment
Можете ли вы привести пример того, как использовать адрес символа = слайд + адрес стека - адрес загрузки. Я не понимаю - person pengwang; 20.03.2013
comment
Или вы можете просто использовать atos -l и позволить ему делать вычисления за вас. Я также почти уверен, что слайд относится к разнице между номинальным и фактическим адресом загрузки, а не к самому адресу загрузки. - person tc.; 21.03.2013
comment
Вы сэр РОК! Большое спасибо! Только что проголосовали за несколько ваших ответов! - person Shai Almog; 22.07.2013
comment
Очень красивое объяснение. - person demon; 15.11.2013
comment
Я получаю отрицательное значение для symbol address, используя ваш расчет. Что-то ужасно не так? - person Tim Arnold; 19.11.2013
comment
@TimArnold Что ж, если отчеты о сбоях уже обозначены символами, то адреса уже нормализованы сценарием символизации из Xcode. Поэтому проверьте, stack address > load address и действительно ли вы проверяете правильный элемент в разделе двоичных изображений. - person Kerni; 19.11.2013
comment
Как вы думаете, в чем будет проблема, если у вас возникнет проблема с тем, что atos неправильно символизирует какой-либо адрес символа, кроме вашего собственного приложения? stackoverflow.com/ questions / 26079056 / - person George Taskos; 29.09.2014

Более простая альтернатива: вы можете использовать флаг 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), прокрутите до раздела «Двоичные изображения» файла сбоя, и вы найдете его там.

Ваше здоровье

person Chris    schedule 09.10.2013
comment
Сегодня у меня возникли большие проблемы с символизацией журнала .crash из приложения OS X - очевидно, Xcode какое-то время не поддерживал символику для приложений OS X, даже если у вас есть .dSYM - и ваш ответ позволил мне наконец получить номер строки для сбоя. Спасибо! - person Shaggy Frog; 12.10.2013
comment
есть небольшая ошибка atos -o MyApp.app/MyApp -arch armv7 -l 0x29000 0x0044e89a - person malex; 11.11.2013
comment
Обратите внимание: если ваше приложение не включает символы отладки, вы можете заменить часть -o символами из вашего файла .dSYM (MyApp.app.dSYM/Contents/Resources/DWARF/MyApp) - person jasongregori; 30.07.2014
comment
число после + является десятичным числом и является результатом stack address - load address. Таким образом, вы обнаружите, что первое шестнадцатеричное число представляет собой сумму двух последних чисел. - person Xiao; 29.09.2014
comment
@chris ты гений - person ViruMax; 02.10.2014
comment
Это было невероятно полезно для отладки крошечного размытого снимка экрана с аварийным журналом. - person shane; 03.11.2015

Просто используйте dwarfdump:

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

Совершенно не нужно производить никаких расчетов.

(Из Символ по адресу (символизирующий двоичный файл, сборка iOS)).

person CpnCrunch    schedule 12.10.2013
comment
Это все еще работает с журналами сбоев из iOS 6–7? Это то, что я делал с журналами сбоев Mac, но он перестал работать примерно во времена Lion. - person Peter Hosey; 13.10.2013
comment
Да, я только что использовал его в двух отчетах о сбоях iOS 6.1.3 на Mountain Lion. - person CpnCrunch; 14.10.2013
comment
FWIW, dwarfdump не удалось для меня для арки armv7s, тогда как выполнение математических расчетов с помощью atos сработало. - person Scott Corscadden; 13.02.2014
comment
Просто попробовал использовать dwarfdump, а затем посчитал, как указано @Kerni. Математика работала, dwarfdump не работал, но, как и в случае со Скоттом, это было для архитектуры armv7s. - person Rob Segal; 21.02.2014

Для кого это определенное время не имеет значения для адреса загрузки, например:

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.

person DenninDalke    schedule 14.01.2015
comment
Это решение отлично работало для исключения, отправленного мне бета-тестером (из Console.app), которое не генерировало отчет о сбое. Спасибо! - person Andrew; 25.07.2015