Как символизировать аварийный журнал Xcode?

190

У организатора Xcode 5 было представление, которое перечисляло бы все журналы сбоев. и мы могли бы перетащить сюда аварийные журналы. Но начиная с Xcode 6, я знаю, что они вывели устройства из строя и имеют новое окно для того же. Но я не нахожу место, где я просматриваю журналы сбоев, которые я перетаскиваю в Xcode 5 после перехода на Xcode 6. Кто-нибудь знает ответ?

Нитин Пай
источник
3
Я спрашивал это несколько месяцев назад на форумах разработчиков Apple, но так и не получил ответа. Это потеря полезного функционала. Отправьте в Apple отчет об ошибке с просьбой вернуть эту функцию обратно.
rmaddy
1
Я собрал все это вместе на выходных, чтобы решить символику аварийных дампов для iOS и OSX. Это все еще очень грубо, но это должно работать. github.com/agentsim/Symbolicator
Тим
4
Xcode, не могли бы вы просто указать символические журналы сбоев от рецензентов Apple, как вы должны ... вместо того, чтобы предполагать, что у нас есть буквально целый день, чтобы выяснить, как это сделать?
Уильям Энтрикен

Ответы:

120

Хорошо, я понял, что вы можете сделать это:

  1. В Xcode > Window > Devices, выберите подключенный iPhone / iPad / etc вверху слева.
  2. Просмотр журналов устройства
  3. Все журналы

Вероятно, у вас там много журналов, и чтобы упростить поиск импортированных журналов позже, вы можете просто удалить все журналы на этом этапе ... если только они не означают для вас деньги. Или, если вы не знаете точный момент времени, когда произошел сбой - он все равно должен быть записан в файле ... Я ленив, поэтому просто удаляю все старые журналы (на самом деле это заняло некоторое время).

  1. Просто перетащите файл в этот список. Это сработало для меня.
Jonny
источник
13
У меня та же проблема, но это не решает проблему для меня - появляются логи, которые я перетаскиваю в окно, но не символизирую.
Arkaaito
9
Хитрость заключается в том, что вам нужно подключить устройство и выбрать устройство из списка. Я не думаю, что это возможно без устройства.
Джонни
61
Чтобы файл аварийного завершения можно было перетаскивать в этот список, он должен иметь расширение .crash.
pjay_
7
Пропущенный шаг для меня был после того, как файл был удален, мне нужно было щелкнуть правой кнопкой мыши по файлу и
повторить
6
Не забудьте "Скачать dSYMs" для этого архива в Организаторе.
123FLO321
259

Пишу этот ответ как для сообщества, так и для себя.

Если когда-либо возникают проблемы, символизирующие отчет о сбое, их можно преодолеть следующим образом:

  1. Создайте отдельную папку, скопируйте Foo.appи Foo.app.dSYMиз соответствующей .xcarchiveв папку. Также скопируйте .crashотчет в папку.

  2. Откройте отчет о сбое в TextEdit или в другом месте, перейдите в Binary Images:раздел и скопируйте туда первый адрес (например 0xd7000).

  3. cdв папку. Теперь вы можете запустить следующую команду:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

Это будет символизировать символ по адресу 0x0033f9bb. Пожалуйста, убедитесь, что вы выбрали правильное значение для -archпараметра (его можно найти в первой строке Binary Images:раздела или найти Hardware Model:в отчете о сбое и в поддерживаемых архивах приложения).

Вы также можете скопировать необходимые адреса (например, стек вызовов потоков) из отчета о сбое непосредственно в текстовый файл (в TextEdit удерживайте Option и выберите необходимый текстовый блок или скопируйте и обрежьте), чтобы получить что-то вроде этого:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Теперь вы можете сохранить это в текстовом файле, например addr.txt, и выполнить следующую команду:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

Это даст хорошую символику для всех адресов одновременно.

PS

Перед выполнением вышеизложенного стоит проверить, что все настроено правильно (так как с atosрадостью сообщит что-то для любого предоставленного адреса).

Для проверки откройте отчет о сбое и перейдите в конец стека вызовов Thread 0. Первая строка с конца для отображения вашего приложения (обычно вторая), например:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

должен быть main()вызов. Символизация адреса ( 0x0033f9bbв данном случае), как описано выше, должна подтвердить, что это действительноmain() а не какой-то случайный метод или функция.

Если адрес не совпадает с адресом main(), проверьте адрес загрузки ( -lопция) и арку ( -archопция).

PPS

Если вышеуказанное не работает из-за битового кода , загрузите dSYM для вашей сборки из iTunes Connect, извлеките исполняемый двоичный файл из dSYM (Finder> Показать содержимое пакета), скопируйте его в каталог и используйте его (т. Е. Foo) В качестве аргумент atos, вместо Foo.app/Foo.

Морское побережье Тибета
источник
2
Спасибо за труд написания учебника mini xcrun и обновления его в разделе проверки работоспособности. мое здравомыслие сохраняется после многих ругательств и не видно никаких символов
Антон Тропашко
10
Не забудьте проверить, что отчет о сбое соответствует исполняемому файлу и dSYM. Вы можете проверить это, сопоставив идентификатор в <> в разделе Binary Image с идентификатором, возвращенным из вашего исполняемого файла, запустивxcrun dwarfdump --uuid <path to executable>
Ryan C. Payne
2
Важно отметить, что будут отображаться только символы из вашего приложения (Foo). Он не будет отображаться для символов из внешних библиотек / сред, таких как Foundation, или libsystem_kernel.dylib.
Jlukanta
1
это полезно, но все еще не работает для меня. у меня проблемы с тем, что у меня нет информации 0xd7000. моя строка выглядит так: 0x100038328 __mh_execute_header + 99112. Я прочитал, что такое __mh_execute_header, но как я могу получить информацию о 0x100038328 ??? у меня есть все остальное
skinsfan00atg
5
Я написал простой скрипт bash, который сделает большую часть работы за вас. Использование: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash только оно будет символизировать полный отчет о сбое и даст вам его символическую версию. gist.github.com/nathan-fiscaletti/…
Натан Ф.
187

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

Повторная символизация аварии

ШАГ 1

Переместите все вышеупомянутые файлы (MyApp.app, MyApp-dSYM.dSYM и MyApp-Crash-log.crash) в папку с удобным именем, куда бы вы ни направлялись, используя терминал легко.

Для меня Desktop - самое легкодоступное место;) Итак, я переместил эти три файла в папку MyApp на Desktop.

ШАГ 2

Теперь настал черед Finder, перейдите по следующему пути, который применим для вашей версии XCODE.

Используйте эту команду, чтобы найти symbolicatecrashфайл сценария,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Ниже Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Или Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

ШАГ 3

Добавьте каталог найденного файла сценария symbolicatecrash в $PATHпеременную env следующим образом: sudo vim /etc/paths.d/Xcode-symbolicatecrashвставьте каталог файла сценария и сохраните файл. При открытии нового терминала вы можете звонить symbolicatecrashв любую папку, используя команды, расположенные в/usr/bin .

Или

Скопируйте файл symbolicatecrash из этого места и вставьте его на рабочий стол / MyApp (Подождите ... Не следуйте за мной вслепую, я вставляю файл sybolicatecrash в папку MyApp, созданную на первом этапе в вашем любимом месте, содержащую три файла. )

ШАГ 4

Откройте Терминал и CD в папку MyApp.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 -  Нажмите Enter

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 -  Нажмите Enter

Это оно !! На вашем терминале есть символические журналы… что же вы ждете? Теперь просто найдите ошибку и устраните ее;)

Удачного кодирования !!!

Mrug
источник
2
@ EmilVikström: Спасибо за предложение, обновили ответ.
Мруг
2
Использовать экспорт DEVELOPER_DIR =xcode-select --print-path
Параг Бафна
8
Работал угощение - спасибо. Только одна вещь, которую я должен был использовать экспорт DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (без кавычек).
Гоэлектрик
1
"export DEVELOPER_DIR = xcode-select --print-path" просто говорит мне "-bash: export:` --print-path ': недопустимый идентификатор
Almo
2
Обновить; вот ; для xcode7 найдите здесь symboliccateh; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash в stackoverflow.com/questions / 32804611 /…
AnneTheAgile
28

Для меня файла .crash было достаточно. Без файла .dSYM и файла .app.

Я запустил эти две команды на компьютере Mac, где я собираю архив, и он работал:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash
Марек Мандуч
источник
Вот это да. Я не знаю, как это работает без файла .dsym, но это работает!
rustyMagnet
4
@rustyMagnet Как это работает, используя dsyms из архивных сборок на вашем компьютере.
Андрей Таранцов
1
Да, это работает только для сборок, которые вы заархивировали с помощью Xcode, а не для любых других сборок, которые вы, возможно, сгенерировали для специальных запусков, для которых вы затем хотите символизировать журналы сбоев.
CMash
21

Существует более простой способ использования Xcode (без использования инструментов командной строки и поиска адресов по одному)

  1. Возьмите любой файл .xcarchive. Если у вас есть один, прежде чем вы можете использовать это. Если у вас его нет, создайте его, запустив Product> Archive from Xcode.

  2. Щелкните правой кнопкой мыши файл .xcarchive и выберите «Показать содержимое пакета».

  3. Скопируйте файл dsym (версии приложения, которая потерпела крах) в папку dSYMs

  4. Скопируйте файл .app (версии приложения, в котором произошел сбой) в папку «Продукты»> «Приложения».

  5. Отредактируйте Info.plist и отредактируйте CFBundleShortVersionString и CFBundleVersion в словаре ApplicationProperties. Это поможет вам определить архив позже

  6. Дважды щелкните по .xcarchive, чтобы импортировать его в Xcode. Это должен открыть Организатор.

  7. Вернитесь к журналу сбоев (в окне «Устройства» в XCode)

  8. Перетащите туда свой файл .crash (если его еще нет)

  9. Весь журнал сбоев должен теперь быть символическим. Если нет, то щелкните правой кнопкой мыши и выберите «Re-символизировать журнал сбоев»

RPM
источник
1
Ваш ответ правильный и простой. Нет необходимости использовать приложение «Терминал». Воссоздание папки .xcarchive очень важно, поскольку в некоторых системах непрерывной интеграции отсутствует файл .xcarchive, а не zip-шар папки .app.dSYM. По стечению обстоятельств то, что я сделал вчера, точно такое же, как вы сказали.
DawnSong
как должен выглядеть полный вывод?
noobsmcgoobs
Это частично символизирует мои журналы сбоев, хотя я пропустил шаг 3-5, так как мой xcarchive относится к версии приложения, которая потерпела крах.
Деклан МакКенна
1
Конечно, это будет символизировать только ваш собственный код, а не код внешней библиотеки, который вы, возможно, использовали.
RPM
7

Выполните эти шаги в Xcode 10, чтобы символизировать журнал сбоев от сборки приложения на том же компьютере:

  1. Inside Organizer найдите архив, на котором основано приложение.
  2. Нажмите на Загрузить символы отладки . В папке «Загрузки» ничего не появится, но это нормально.
  3. Подключите сборочную машину к устройству iOS.
  4. Выберите устройство в разделе « Устройства и симуляторы». .
  5. Нажмите на Просмотр журналов устройств .
  6. Перетащите файл аварии на левую панель. Файл должен заканчиваться .crash расширением , иначе перетаскивание завершится неудачно.
  7. Перейдите на вкладку Все журналы .
  8. Выберите добавленный файл сбоя.
  9. Файл должен автоматически символизировать, в противном случае используйте правой кнопкой мыши пункт контекстного меню Re-Symbolicate Log .
Ely
источник
1
Сначала я не думал, что это что-то добавляет к другим постам, но первые два шага, а именно «Загрузка символов отладки», похоже, мне не хватало. Спасибо.
Кристофер Кинг
6

Если у вас есть файлы .dSYM и .crash в одной подпапке, вы можете предпринять следующие шаги:

  1. Рассматривая обратную трассировку в файле .crash, обратите внимание на имя двоичного изображения во втором столбце и адрес в третьем столбце (например, 0x00000001000effdc в приведенном ниже примере).
  2. Прямо под следом в разделе «Двоичные изображения» запишите имя изображения, архитектуру (например, arm64) и адрес загрузки (0x1000e4000 в приведенном ниже примере) двоичного изображения (например, TheElements).
  3. Выполните следующее:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

Официальный источник: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Виктор Богдан
источник
4

Xcode 11.2.1, декабрь 2019

Apple выдает аварийный журнал в формате .txt, который не является символом

**

С подключенным устройством

**

  • Загрузите файл «.txt», измените расширение на «.crash» введите описание изображения здесь
    • Откройте устройства и симуляторы из вкладки окна в Xcode
    • выберите устройство и выберите журналы устройства
    • перетащите файл .crash в окно журнала устройства

введите описание изображения здесь

Там мы сможем увидеть символические журналы аварий

Пожалуйста, смотрите ссылку для более подробной информации о символьных журналах сбоев

Сурадж К Томас
источник
Вот это да. Изменение расширения файла с .txt на .crash сделало это. Они дали мне файл .txt. Спасибо чувак. Не могу поверить, что ваш ответ такой низкий.
datWooWoo
3

Убедитесь, что имя вашего приложения Xcode не содержит пробелов. Это было причиной того, что это не сработало для меня. Так /Applications/Xcode.appработает, пока /Applications/Xcode 6.1.1.appне работает.

Bouke
источник
Ты пробовала? Если нет, попробуйте и посмотрите, имеет ли ваш комментарий какой-либо смысл.
Бук
1
Это не та проблема, о которой я говорю. Xcode можно переименовать после установки, но перед первым использованием. Однако скрипт для символизации не может обрабатывать пробелы в имени приложения и завершится ошибкой.
Bouke
1
@ChuckKrutsinger Вы действительно пробовали? Потому что экранированные пробелы позволят вам запустить скрипт, но сам скрипт потерпит неудачу. Сценарий, вероятно, не вызывает другие сценарии с пробелом.
Bouke
1
@ChuckKrutsinger Это очень мило и все, но если кто-то хочет, чтобы Xcode автоматически символизировал журнал сбоев, вам понадобится мой ответ в конце.
Bouke
1
Я хотел бы повторить, что bouke верен и что если у вас есть пробел в пути для приложения Xcode, сценарий, который Xcode использует для повторной символизации журналов сбоев, НЕ будет работать. Ничего общего с ручной повторной символикой.
Гэри Макин
2

Из документов Apple:

Символизация отчетов о сбоях с Xcode Xcode автоматически попытается символизировать все отчеты о сбоях, с которыми он сталкивается. Все, что вам нужно сделать для символизации, это добавить отчет о сбое в Xcode Organizer.

  • Подключите устройство iOS к вашему Mac
  • Выберите «Устройства» в меню «Окно».
  • В разделе «УСТРОЙСТВА» в левой колонке выберите устройство
  • Нажмите кнопку «Просмотр журналов устройства» в разделе «Информация об устройстве» на правой панели.
  • Перетащите отчет о сбое в левую колонку представленной панели.
  • Xcode автоматически символизирует отчет о сбое и отображает результаты. Чтобы символизировать отчет о сбое, Xcode должен быть в состоянии найти следующее:

    1. Бинарный файл и файл dSYM, вызывающий сбой приложения.

    2. Двоичные файлы и файлы dSYM для всех пользовательских сред, с которыми связано приложение. Для каркасов, которые были построены из исходного кода с приложением, их файлы dSYM копируются в архив вместе с файлом dSYM приложения. Для фреймворков, созданных сторонними разработчиками, вам нужно будет обратиться к автору за файлом dSYM.

    3. Символы для ОС, на которой было запущено приложение, когда оно падало. Эти символы содержат отладочную информацию для платформ, включенных в конкретный выпуск ОС (например, iOS 9.3.3). Символы ОС зависят от архитектуры - выпуск iOS для 64-битных устройств не будет включать символы armv7. Xcode автоматически скопирует символы ОС с каждого устройства, которое вы подключаете к вашему Mac.

Если какой-либо из них отсутствует, XCode может не иметь возможности символизировать отчет о сбое или только частично символизировать отчет о сбое.

Итан
источник
2

Самый простой процесс для обозначения журналов аварий:

  1. сохранить файл xcarchive от организатора во время процесса построения IPA для будущего использования.
  2. Когда происходит сбой, соберите журналы сбоев с уязвимого устройства. Расширение должно быть .crash. Если журнал сбоя имеет формат .ips, просто переименуйте его в .crash.
  3. Дважды щелкните по xcarchive из сохраненного пути, чтобы он появился в органайзере (если его еще нет).
  4. откройте в окне xcode -> устройства и симуляторы -> просмотр журналов устройства -> все журналы -> перетащите файл .crash.

Подождите 5 сек. Взрыв! вызовы приложения в трассировке стека будут символизированы! Вы все еще можете увидеть много символов, хотя! это внутренние вызовы библиотеки и фреймворка.

Это самый простой, испытанный и проверенный!

Sanchita
источник
2

Apple выдает аварийный журнал в формате .txt, который не является символом

**

С подключенным устройством

**

  • Загрузите файл «.txt», измените расширение на «.crash» введите описание изображения здесь
    • Откройте устройства и симуляторы из вкладки окна в Xcode
    • выберите устройство и выберите журналы устройства
    • перетащите файл .crash в окно журнала устройства

введите описание изображения здесь

Там мы сможем увидеть символические журналы аварий

Пожалуйста, смотрите ссылку для более подробной информации о символьных журналах сбоев

Сурадж К Томас
источник