Отсутствие имен символов при профилировании приложения IPhone с помощью инструментов - PullRequest
58 голосов
/ 06 мая 2010

Я компилирую приложение для iPhone через командную строку (поэтому параметры XCode не задействованы) и не могу отобразить имена своих символов при профилировании с помощью инструментов. Я пробовал несколько флагов, таких как -gdawrf-2 и -g, но безуспешно. Я также попытался с помощью dsymutils сгенерировать файл .dSYM, но я понятия не имею, как я должен его использовать, чтобы не получилось.

Любая помощь будет принята с благодарностью!

Ответы [ 12 ]

87 голосов
/ 20 марта 2015

Я изменил настройки своего проекта, чтобы не включать файл dSYM при сборке:

enter image description here

Изменение его для включения файла dSYM помогло профилировщику десимволизировать символы и устранило мою проблему:

enter image description here

59 голосов
/ 20 октября 2011

У меня все еще были проблемы с этим.

Моя проблема была в том, что я смог увидеть генерируемый файл dSYM, но инструменты его не брали.

Чтобы это исправить, сделайте следующее:

  1. Найдите файл dSYM (должен быть в ~ / Library / Developer / DerivedData / APP_NAME-XXXXXXX / Build / Products / [BUILD_TYPE] - [DEVICE-TYPE] /
  2. Когда инструменты остановлены, нажмите Файл -> Повторно символизировать документ
  3. Прокрутите вниз до записи с именем вашего приложения
  4. Нажмите «Найти» и выберите папку с шага 1
  5. Нажмите кнопку Пуск, чтобы начать профилирование
35 голосов
/ 20 мая 2010

Как инструменты получают отладочную информацию:

Приборы получают отладочную информацию из файла .dSYM, который обычно генерируется XCode автоматически при установке формата отладочной информации в DWARF с файлом dSYM в сочетании с флажком в поле «Создать символы отладки». Установка этих параметров добавит дополнительный шаг к процессу сборки XCode и создаст файл dSYM после компиляции приложения. Каждый dSYM построен с UUID, который соответствует UUID в секции Mach-O в двоичном файле, из которого он получен. Импортер Spotlight индексирует UUID каждого файла dSym, который находится в доступном для Spotlight месте на вашем Mac. Поэтому SPOTLIGHT выполняет всю черную магию и отвечает за создание связи между .app, который вы используете, и соответствующим файлом .dSYM.

Как создать отладочную информацию и файл dSYM без XCode:

Убедитесь, что вы компилируете с флагами -gdwarf-2 и -g. (Другие комбинации флагов могут работать)

-g Производить отладочную информацию в родной формат операционной системы (удары, COFF, XCOFF или DWARF 2). GDB может работать с этой отладкой Информация. На большинстве систем, которые используют формат stabs, -g позволяет использовать дополнительные отладочная информация, что только GDB можешь использовать; эта дополнительная информация делает отладка лучше работает в GDB, но возможно, вывести из строя другие отладчики или отказаться от чтения программы. если ты хочу точно контролировать, стоит ли генерировать дополнительную информацию, использовать -gstabs +, -gstabs, -gxcoff +, -gxcoff или -gvms (см. ниже). GCC позволяет использовать -g с -O. Ярлыки взятый оптимизированным кодом может иногда производят удивительные Результаты: некоторые переменные, которые вы объявили может вообще не существовать; поток контроля может ненадолго переместиться туда, где вы этого не сделали ожидать этого; некоторые утверждения не могут быть выполняется, потому что они вычисляют постоянные результаты или их значения были уже под рукой; некоторые заявления могут выполнять в разных местах, потому что они были извлечены из петель.
Тем не менее, оказывается возможным отладка оптимизированного вывода. Это делает это разумно использовать оптимизатор для программы, которые могут иметь ошибки.

-gdwarf-2 Создание отладочной информации в формате DWARF версии 2 (если это поддерживается). Это Формат, используемый DBX в IRIX 6. С эта опция, GCC использует функции DWARF версия 3, когда они полезны; версия 3 совместима с версия 2, но все еще может вызвать проблемы для старых отладчиков.

Создайте файл dSYM с помощью dsymutil. Если инструмент не распознается в командной строке, используйте прожектор, чтобы найти его. ВАЖНО: Поместите файл .app на ваш Mac HD перед созданием dSYM, если вы работаете на сетевом диске.

dsymutil MyApp.app/MyApp -o MyApp.app.dSYM

Поместите файл .dSYM на локальный диск Mac и запустите Instruments, как обычно.

Сброс индексации прожектора:

Если символы не отображаются, это может быть вызвано тем, что прожектор прослушивается. Вы можете попробовать сбросить индексирование прожектора, добавив папку, содержащую файл dSYM (или даже ваш диск), в «Запретить прожекторам поиск этих мест» в настройках прожектора и затем сразу же удалите ее.

15 голосов
/ 13 ноября 2012

В Xcode 4.5 вы можете выбрать профиль из сборок отладки или выпуска. По умолчанию, для удаления символов, при копировании на устройство выпускается. Очень легко переключиться на конфигурацию Debug для профилирования, не нарушая конфигурацию релиза. Для этого выберите Product -> Edit Scheme из меню XCode. Выберите «Профиль» из списка подходящих схем, а затем выберите правильную конфигурацию сборки для этого.

Или вы можете создать отдельную конфигурацию выпуска / профиля и использовать ее в разделе «Профиль» своей схемы. Как добавить отдельную конфигурацию сборки, описано в XCode User Guide .

5 голосов
/ 05 мая 2016

Потратил три дня, пытаясь выяснить это для Xcode 7.1 / 7.3 ...

Изменение цели развертывания на последнюю версию (в то время 9.3) исправило эту проблему для меня. Моя компания нацелена на 7.0, поэтому мне, вероятно, придется создать собственную схему для профилирования кода в Instruments, чтобы избежать необходимости менять цель (или забывать менять цель) при выпуске рабочей версии.

Похоже, что это ошибка, если dSYM не работают в зависимости от цели развертывания?

4 голосов
/ 19 февраля 2015

С Xcode 6 Instruments вы можете предоставить dSYM файл следующим образом:

  • Файл -> Символы ... меню (когда профилирование остановлено)
  • выберите приложение и нажмите Найдите кнопку
  • выберите путь, который содержит dSYM (обычно ~ / Library / Developer / DerivedData / APP_NAME-XXXXXXX / Build / Products / [BUILD_CONFIGURATION] - [TARGET_PLATFORM] / ). Совет: Вы можете скопировать этот путь из терминала и использовать ярлык OS X ⌘+SHIFT+G в диалоговом окне.

Также Instruments спросит вас, должен ли он использовать выбранный путь, чтобы попытаться загрузить dSYM для этого приложения в будущем. Ответ Да:)

2 голосов
/ 06 октября 2011

Проблема в том, что прожектор не может найти файлы .dSYM. Это связано с тем, что Apple изменила расположение папки DerivedData. DerivedData теперь помещается в ~ / Library

Spotlight не будет индексировать ~ / Library , и, насколько мне удалось установить, также не может быть индексирован (например, mdimport игнорируется).

Чтобы получить символы в своем профилировщике, нужно просто скопировать данные за пределы ~ / Library например. с вашим домашним каталогом все будет в порядке.

Я использовал эту командную строку:

$ cp -r ~/Library/Developer/Xcode/DerivedData/AppName-xxxxxxxxxxx/Build/Products/Release-iphoneos/ ~/

Когда вы убьете свой профилировщик и начнете новый запуск профиля, вы увидите, что символы снова доступны.

1 голос
/ 15 января 2017

По моему опыту, это обычно потому, что «Профиль» вызывался до того, как на целевом устройстве была установлена ​​последняя измененная версия приложения.

Попробуйте запустить приложение на устройстве / цели, , а затем повторно вызвать «Профиль» после его переустановки.

1 голос
/ 08 октября 2011

Другим обходным вариантом в версии Instruments, которая поставляется с Xcode 4, является использование пункта меню Re-Symbolicate Document в меню File для Instruments. Этот пункт меню позволяет использовать символы, расположенные в файле .dSYM в каталоге ~ / Library / ....

1 голос
/ 06 мая 2010

Проверьте журнал сборки и убедитесь, что ваш переключатель -g подключен к компилятору - легко ошибиться при изменении настроек на проекте и / или целевых уровней для различных конфигураций сборки и т. Д.

...