Я проанализировал адреса, имена файлов и номера строк из файла dSYM для приложения iOS. У меня в основном есть таблица, которая сопоставляет адрес с именем файла и номером строки, что очень полезно для отладки.dSYM Address Lookup
Чтобы получить actual lookup address
, я использую адрес трассировки стека из отчета о сбое и использую формулу, указанную в этом ответе: https://stackoverflow.com/a/13576028/2758234. Так что-то вроде этого.
(actual lookup address)
= (stack trace address) + (virtual memory slide) - (image load address)
Я использую этот адрес и просматриваю его на своем столе. Имя файла, которое я получаю, является правильным, но номер строки всегда указывает на конец функции или метода, который был вызван, а не на фактическую строку, которая вызвала следующую функцию в трассировке стека.
Я где-то читал, не могу вспомнить, где должны быть отмечены те адреса фрейма, потому что они выровнены, чтобы удвоить размер указателя системы. Таким образом, для 32-битных систем, размер указателя составляет 4 байта, поэтому мы де-тегов с использованием 8 байтов, используя формулу, как это:
(de-tagged address) = (tagged address) & ~(sizeof(uintptr_t)*2 - 1)
где uintptr_t
является тип данных, используемый для указателей в Objective-C ,
После выполнения этого поиска рода работ, но я должен сделать что-то вроде найти ближайший адрес, который меньше или равен де-меченого адрес.
Вопрос № 1:
Почему я должен де-тег кадр стека адрес? Почему в трассировке стека не являются адресами, уже указывающими на нужное место?
Вопрос № 2:
Иногда в докладе аварии, кажется, отсутствующий кадр. Например, если function1()
вызовов function2()
который называет function3()
который вызывает function4()
, в моей трассировке стеки я буду видеть что-то вроде:
0 Exception
1 function4()
2 function3()
4 function1()
И адреса стеки трассировки для function3()
(кадра 2, выше), даже не указывать номер правой строки (но это правильный файл, хотя), даже после де-тегирования. Я вижу это, даже когда я позволяю Xcode символизировать отчет о сбоях.
Почему это происходит?