22. 22
Определение крэша библиотеки
Symbols Stripping
AppExecutable 0x00000001000aba98 0x100058000 + 342680 (-[MyClass doCrash] + 276)
AppExecutable 0x00000001000aba98 0x100058000 + 342680 (_mh_execute_header + 342680)
+ dSYM
Debug Symbols
Не позволяет определять методы библиотеки по имени
25. 25
Рантайм ObjectiveC
-[MyClass doCrash] 0x00000001000AB984
-[MyClass doCrash] 0x00000001000AB984
-[MyClass doCrash] 0x00000001000ABA98
адрес метода
адрес метода
адрес инструкцииметод
метод
метод
27. 27
Определение крэша библиотеки в AppMetrica
Как выделить все адреса методов библиотеки?
.... App SDK SDK App App App SDK App ....
Память инструкций
Замечания
1. Методы одного класса располагаются в памяти последовательно
2. Категории могут располагаться далеко от их классов
3. Классы отсортированы в алфавитном порядке
28. 28
Определение крэша библиотеки в AppMetrica
Определение метода по адресу инструкции в памяти
1. Получить адреса всех методов.
2. Все методы одного класса располагаются друг за другом.
3. Все адреса между адресами двух методов являются адресами инструкций первого.
Точный способ
29. 29
Определение крэша библиотеки в AppMetrica
Определение метода по адресу инструкции в памяти
Точный способ
Наш классЧужой класс Чужой класс
Наши методы
!
30. 30
Определение крэша библиотеки в AppMetrica
Определение метода по адресу инструкции в памяти
1. Получить адреса только интересующих нас методов.
2. Все методы одного класса располагаются друг за другом.
3. Все адреса между адресами двух методов являются адресами инструкций первого.
4. Будем считать размер последнего метода класса равным 1 байту.
Быстрый способ
31. 31
Определение крэша библиотеки в AppMetrica
Определение метода по адресу инструкции в памяти
Наш классЧужой класс Чужой класс
Наши методы
! ? ? ?
Быстрый способ
32. 32
Определение крэша библиотеки в AppMetrica
Определение метода по адресу инструкции в памяти
Наш классЧужой класс Чужой класс
? ? ?
.cxx_destruct
при ARC, для объектов с полями-объектами
Быстрый способ
42. 42
Определение крэша библиотеки в AppMetrica
Сбор информации об адресах наших методов
Работа приложения
КРЭШ
только при первом запуске
Запуск приложения
Формирование отчета о крэше
Поиск инструкций, принадлежащих нашим методам
Частичная символикация наших методов
(!)
runtime
43. 43
Определение крэша библиотеки в AppMetrica
Опасный код
+Флаг Транзакции (NSUserDefaults)Запуск ...
...-Флаг Транзакции
Crash-Safe-Transaction
44. 44
Определение крэша библиотеки в AppMetrica
Опасный код
+Флаг Транзакции (NSUserDefaults)
КРЭШ
Запуск ...
...+Флаг ТранзакцииЗапуск ...
Опасный код
Crash-Safe-Transaction
46. 〉 О крэшах в целом
〉 Способы определения причины крэша
〉 Способы определения крэша библиотеки
〉 Как мы делаем всё это в AppMetrica
46
Что было в этом докладе?