Подтвердить что ты не робот

Согласование смещений в дампе сбоя iOS с дизассемблированным двоичным кодом

У меня возникли проблемы с сопоставлением смещений в стеке следов аварийных дампов iOS с смещениями при разборке двоичного файла как вывода otool.

Кто-нибудь может подтвердить, как я в принципе согласен с этим. Например, если я получаю строку в дампе сбоя:

0 myapp  0x00005b0a  0x1000 + 19210

Я ожидаю, что смещение команды оскорбления в двоичном файле будет 0x5b0a, 0x4b0a.... или что-то еще?

При декодировании информации заголовка otool также дает, например, эту информацию (фактический код начинается со смещения 0x0000224c в файле):

Section
  sectname __text
   segname __TEXT
      addr 0x0000224c
      size 0x00063ad2
    offset 4684
     align 2^2 (4)
    reloff 0
    nreloc 0
      type S_REGULAR
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
 reserved1 0
 reserved2 0

Итак, я не был на 100% уверен, что я правильно интерпретировал это, но, похоже, он говорит, что код в + 0x224c в файле заканчивается на смещение 0x124c в памяти, но тогда я не был точно как это установлено, например, с местоположением 0x1000.

Проблема заключается в том, что, учитывая, например, смещение 0x5b0a, ни инструкция там ни в 0x4b0a, ни в 0x6b0a не имеет смысла как фактическая заданная задача (включая тот факт, что, например, местоположения дальше по стеку, t указывает на инструкции ветвления).

(Я знаю, что, по крайней мере, на ранних инкарнациях ARM, было расхождение между значением ПК и соответствующим адресом памяти из-за конвейера команд. Я предполагал, что такая разница будет учитываться в смещения, сообщаемые в дампе сбоя, или, во всяком случае, я видел бы инструкцию по ветвлению на несколько инструкций с одной стороны от той, на которую указывалось, если такая разница не была учтена...)

Может ли кто-нибудь пролить свет?

4b9b3361

Ответ 1

Если myapp не выделяет символы, вы сможете использовать atos.

Вы можете всегда man atos для получения дополнительной информации, но этого должно быть достаточно для вашей проблемы:

-o symbol_file # debugging information output by the compiler this may be a dSYM or the binary itself depending on who you saved symbol information
-l load address # the base address in the process space at which your library is loaded into the springboard process (Looks like 0x1000)
Also a list of addresses you wish to symbolicate

Usage:
    atos -o myapp -l 0x1000 0x00005b0a 0x0005bca ... etc

Этот вывод должен быть списком имен символов для терминала. Опять же, для этого требуется, чтобы myapp не удалял символы.

Ответ 2

Добавьте виртуальный адрес сегмента __TEXT к относительному адресу, указанному в дампе сбоя. Результатом является адрес для поиска при разборке. Вот шаги:

  • Используйте otool -lv <application-binary>, чтобы сбрасывать команды загрузки из приложение двоичное. Найдите команду загрузки для __TEXT сегмент и связанное значение для vmaddr, обычно 0x1000. Вам не нужна информация о разделе __TEXT, который показан выше, а также информация о сегменте.

  • В дампе сбоя адреса в стеке вызовов указаны в форме 0x00124ff4 0xf4000 + 200692. Последняя часть представляет собой смещение внутри двоичного кода в десятичном значении. Добавьте это значение, полученное на шаге 1, и конвертируйте в шестнадцатеричный. В этом примере мы вычисляем 0x1000 + 200692, который 0x31ff4 в hex.

  • Используйте otool -tV <application-binary> для демонтажа дизассемблирования для двоичного кода приложения. Найдите адрес, полученный на шаге 2 (0x31ff4 в этом примере). Для самого верхнего кадра стека вызовов это приложение разбилось. Для всех других уровней на вычисленном адресе должна быть инструкция перехода, которая соответствует следующему более высокому уровню в стеке.