В моем приложении есть код, который отправляет мне трассировку стека неперехваченных исключений.
"0 CoreFoundation 0x3ad073ff <redacted> + 186",
"1 libobjc.A.dylib 0x39412963 objc_exception_throw + 30",
"2 CoreFoundation 0x3ad0729d <redacted> + 0",
"3 Foundation 0x39f3b7b3 <redacted> + 90",
"4 UIKit 0x34a3ae29 <redacted> + 4184",
"5 MyApp 0x0001feab -[MAMyClassA firstMethod:withParameter1:andParameter2:] + 374",
"6 MyApp 0x000f76b5 -[MAMyClassB secondMethod:withParameter1:andParameter2:] + 164",
"7 UIKit 0x34bd0fe1 <redacted> + 84",
"8 UIKit 0x34af2047 <redacted> + 70",
"9 UIKit 0x34af1ffb <redacted> + 30",
"10 UIKit 0x34af1fd5 <redacted> + 44",
...
Как видите, большинство методов Apple заменены на <redacted>
. Мне удалось извлечь символы и соответствующие им базовые адреса из библиотек Apple с помощью nm
, но адреса не совпадают. Они отстают на 1.
Я рассчитал адрес, как описано здесь: отчеты о сбоях iOS: atos не работает как и ожидалось.
Symbol address = (base address of framework) - (base address of symbol from crash report) + (virtual memory slide [vmaddr]).
Например, я получаю 0xC2345, но фактический адрес символа, возвращаемый nm
, равен 0xC2344. Я знаю, что это правильный символ. Я пробовал это с разными адресами в разных фреймворках (UIKit, Foundation, CoreFoundation и т. д.) в разных отчетах о сбоях, и результат тот же: значение всегда отключено на 1. Мне нужно вычесть 1 из того, что я получаю в отчет о сбое, чтобы получить «правильный» адрес, указанный nm
.
Набирая этот вопрос, я обнаружил следующее: Неправильный адрес реализации метода из инструмент для armv7?.
Означает ли это, что каждый раз, когда у меня есть адрес для поиска, я должен выполнять следующую логику?
if ((symbol address) mod 2 == 1) {
// This is a thumb instruction so it may be 2 or four bytes
Subtract 1 from the symbol address and then use it to lookup the symbol.
}
else {
// This is a standard 4-byte ARM instruction.
Perform symbol lookup with the address as is.
}
Заранее спасибо за любую помощь или направление.