Понимание стека вызовов броска Objective-C - PullRequest
2 голосов
/ 10 января 2012

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

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

       3   My App                0x000000010d005483 My App + 17539

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

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

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Ознакомьтесь с этой Технической запиской от Apple.

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

1 голос
/ 10 января 2012

Я использую 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 будет другим.

...