Понимание стека вызовов броска Objective-C
Пользователь только что отправил мне сообщение об ошибке, сообщив, что мое приложение упало. Пользователь также прикрепил стек вызовов броска.
Часть, которая, кажется, вызвала проблему:
3 My App 0x000000010d005483 My App + 17539
Есть ли способ перевести этот адрес и / или + 17539
на номер строки в моем коде?
Имейте в виду, я не смог воспроизвести ошибку на моей машине, поэтому я не могу просто собрать ее в режиме отладки.
2 ответа
Проверьте эту Техническую записку от Apple.
... Эта трассировка похожа на ту, что вы увидели бы при остановке выполнения в отладчике, за исключением того, что вам не даны имена методов или функций, известные как символы. Вместо этого у вас есть шестнадцатеричные адреса и исполняемый код - ваше приложение или системные платформы - на которые они ссылаются. Вам необходимо сопоставить эти адреса с символами. В отличие от журналов сбоев в Mac OS X, журналы iPhone OS не содержат символьной информации при их записи. Вы должны символизировать журналы iPhone OS, прежде чем сможете их анализировать.
Я использовал GDB для ручной символизации. Было бы слишком громоздко, если бы вы делали это много, но в типичном журнале сбоев не очень много символов, и мне нужно только символизировать журнал сбоев время от времени.
Процедура выглядит следующим образом:
- Поместите файл.dSYM для вашего приложения в ту же папку, что и.app.*
- Открытый терминал и
cd
в папку с шага 1. - Запустите ваше приложение в GDB:
$ gdb YourApp.app/Contents/MacOS/YourApp
- Установите параметры печати asm-demangle и print symbol-file:
set print asm-demangle on
set print symbol-filename on
- Используйте команду p/a, чтобы найти номера строк для каждого адреса в трассировке стека:
p/a 0x000000010d005483
Эти инструкции с этой страницы (по-видимому, больше не в сети).
* Обратите внимание, что.dSYM имеет UDID, привязывающий его к конкретной сборке, с которой он был создан. Итак, если у вас нет оригинального файла.dSYM, у вас проблемы. Теоретически, вы даже не можете просто извлечь ту же ревизию из системы контроля версий и перестроить, потому что этот UDID будет другим.