Понимание стека вызовов броска Objective-C

Пользователь только что отправил мне сообщение об ошибке, сообщив, что мое приложение упало. Пользователь также прикрепил стек вызовов броска.

Часть, которая, кажется, вызвала проблему:

       3   My App                0x000000010d005483 My App + 17539

Есть ли способ перевести этот адрес и / или + 17539 на номер строки в моем коде?

Имейте в виду, я не смог воспроизвести ошибку на моей машине, поэтому я не могу просто собрать ее в режиме отладки.

2 ответа

Решение

Проверьте эту Техническую записку от Apple.

... Эта трассировка похожа на ту, что вы увидели бы при остановке выполнения в отладчике, за исключением того, что вам не даны имена методов или функций, известные как символы. Вместо этого у вас есть шестнадцатеричные адреса и исполняемый код - ваше приложение или системные платформы - на которые они ссылаются. Вам необходимо сопоставить эти адреса с символами. В отличие от журналов сбоев в Mac OS X, журналы iPhone OS не содержат символьной информации при их записи. Вы должны символизировать журналы iPhone OS, прежде чем сможете их анализировать.

Я использовал GDB для ручной символизации. Было бы слишком громоздко, если бы вы делали это много, но в типичном журнале сбоев не очень много символов, и мне нужно только символизировать журнал сбоев время от времени.

Процедура выглядит следующим образом:

  1. Поместите файл.dSYM для вашего приложения в ту же папку, что и.app.*
  2. Открытый терминал и cd в папку с шага 1.
  3. Запустите ваше приложение в GDB:
    $ gdb YourApp.app/Contents/MacOS/YourApp
  4. Установите параметры печати asm-demangle и print symbol-file:
    set print asm-demangle on
    set print symbol-filename on
  5. Используйте команду p/a, чтобы найти номера строк для каждого адреса в трассировке стека:
    p/a 0x000000010d005483

Эти инструкции с этой страницы (по-видимому, больше не в сети).

* Обратите внимание, что.dSYM имеет UDID, привязывающий его к конкретной сборке, с которой он был создан. Итак, если у вас нет оригинального файла.dSYM, у вас проблемы. Теоретически, вы даже не можете просто извлечь ту же ревизию из системы контроля версий и перестроить, потому что этот UDID будет другим.

Другие вопросы по тегам