Як символізувати Xcode журналу збоїв?


189

Організатор 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 / тощо.
  2. Перегляд журналів пристроїв
  3. Усі журнали

Напевно, у вас є багато журналів, і щоб вам було легше знайти імпортований журнал пізніше, ви можете просто продовжити та видалити всі журнали в цей момент ... якщо вони не означають для вас грошей. Або, якщо ви не знаєте точного моменту, коли трапилася аварія - це все одно має бути записано у файл ... Я лінивий, тому я просто видаляю всі старі журнали (це фактично зайняло деякий час).

  1. Просто перетягніть файл у цей список. Це працювало для мене.

13
У мене така ж проблема, але це не вирішує проблему для мене - з’являються журнали, які я перетягую і випадаю у вікно, але не символізують.
Arkaaito

9
Хитрість полягає в тому, що вам потрібно підключити пристрій і вибрати пристрій зі списку. Я не думаю, що це неможливо без пристрою.
Джоні

60
Для того, щоб ваш файл збоїв можна було перетягнути до цього списку, він повинен мати розширення .crash.
pjay_

7
Пропущений для мене крок був після того, як файл був скинутий, мені потрібно було клацнути правою кнопкою миші на файл і повторно
символізувати

6
Не забудьте "Завантажити dSYM" для цього архіву всередині Організатора.
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> Show Package Contents), скопіюйте його в каталог і використовуйте його (тобто Foo) як аргумент на atos, а не на Foo.app/Foo.


2
дякую за проблему написання навчального посібника mini xcrun та оновлення його за допомогою розділу перевірки правильності. мій розум врятується після безлічі
лаянок

10
Не забудьте перевірити, що звіт про збій відповідає виконуваному файлу та dSYM. Ви можете перевірити це, зіставивши ідентифікатор у розділі <> в розділі Бінарне зображення з тим, що повернувся з вашого виконуваного файлу, запустивши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 до $PATHenv змінної на зразок цієї: sudo vim /etc/paths.d/Xcode-symbolicatecrashвставте каталог файлу сценарію та збережіть файл. Відкриваючи новий термінал, ви можете зателефонувати symbolicatecrashв будь-яку папку як команди, розташовані в /usr/bin.

Або

Скопіюйте файл iconicatecrash з цього місця та вставте його на робочий стіл / MyApp (зачекайте… Не слід сліпо за мною, я вставляю файл sybolicatecrash у папку MyApp, той, який ви створили на першому кроці у вашому улюбленому місці, маючи три файли. )

КРОК 4

Відкрийте термінал та компакт-диск у папці MyApp.

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

 -  Натисніть Enter

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

 -  Натисніть Enter

Це воно !! Символічні журнали знаходяться на вашому терміналі ... тепер чого ви чекаєте? Тепер просто з’ясуйте помилку та вирішіть її;)

Щасливе кодування !!!


2
@ EmilVikström: Дякую за пропозицію, оновив відповідь.
Mrug

2
Скористайтеся експортом DEVELOPER_DIR =xcode-select --print-path
Параг Бафна

8
Відпрацювали частування - дякую. Тільки одне, що мені довелося використовувати export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (без лапок).
гоелектрик

1
"export DEVELOPER_DIR = xcode-select --print-path" просто мені каже "-bash: export:` --print-path ": недійсний ідентифікатор
Almo

2
оновлення; ось ; для xcode7 знайдіть тут символічний збій; /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 Спосіб роботи - це використання дсимів із архівованих збірок на вашому комп’ютері.
Андрій Таранцов

1
Так, це працює лише для збірок, які ви архівували за допомогою Xcode, а не будь-яких інших збірок, які ви могли створити для спеціальних запусків, для яких потім потрібно символізувати журнали аварій.
CMash

21

Існує простіший спосіб використання Xcode (без використання інструментів командного рядка та пошуку адрес по одній)

  1. Візьміть будь-який файл .xcarchive. Якщо у вас є такий, перш ніж ви можете використовувати це. Якщо у вас його немає, створіть його, запустивши Product> Archive з Xcode.

  2. Клацніть правою кнопкою миші на файл .xcarchive та виберіть "Показати зміст пакета"

  3. Скопіюйте файл dsym (версії програми, яка розбилася) у папку dSYMs

  4. Скопіюйте файл .app (версії програми, яка вийшла з ладу) у папку Продукти> Програми

  5. Відредагуйте Info.plist та відредагуйте CFBundleShortVersionString та CFBundleVersion у словнику ApplicationProperties. Це допоможе вам визначити архів пізніше

  6. Двічі клацніть на .xcarchive, щоб імпортувати його в Xcode. Він повинен відкрити Органайзер.

  7. Поверніться до журналу збоїв (у вікні пристроїв у Xcode)

  8. Перетягніть туди свій .crash-файл (якщо його ще немає)

  9. Тепер весь журнал аварій повинен бути символізований. Якщо ні, то клацніть правою кнопкою миші та виберіть "Повторно символізувати журнал аварій"


1
Ваша відповідь правильна і проста. Немає необхідності користуватися додатком Terminal. Відтворення папки .xcarchive дуже важливо, оскільки в деякій системі безперервної інтеграції немає файлу .xcarchive замість zip-кулі папки .app.dSYM. За збігом обставин, те, що я зробив вчора, точно таке, як ви сказали.
СвітанокСон

як повинен виглядати повний вихід?
noobsmcgoobs

Це частково символізує мої журнали аварій, хоча я пропустив крок 3-5, оскільки мій xcarchive призначений для версії додатка, який розбився.
Деклан МакКенна

1
Він буде символізувати лише ваш власний код, звичайно, а не зовнішній код бібліотеки, який ви, можливо, використовували.
RPM

7

Виконайте наступні кроки в Xcode 10, щоб символізувати журнал збоїв із складання програми на тій же машині:

  1. Всередині Органайзера знайдіть архів, на якому базується додаток.
  2. Натисніть кнопку Завантажити символи налагодження . У вашій папці завантажень нічого не з’явиться, але це нормально.
  3. Підключіть машину збирання до пристрою iOS.
  4. Виберіть пристрій у пристроях та симуляторах .
  5. Натисніть кнопку Переглянути журнали пристроїв .
  6. Перетягніть файл збою на ліву панель. Файл повинен закінчуватися .crash розширенням , інакше перетягнення не .
  7. Перейдіть на вкладку Усі журнали .
  8. Виберіть доданий файл аварії.
  9. Файл повинен автоматично символізуватися, інакше скористайтеся пунктом контекстного меню правою кнопкою миші Повторний символ символу .

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не працює.


Ти намагався? Якщо ні, спробуйте перевірити, чи має ваш коментар сенс.
Буке

1
Це не те саме питання, про яке я говорю. Xcode можна перейменувати після встановлення, але перед першим використанням. Однак сценарій для символізації не може обробляти пробіли в імені програми і вийде з ладу.
Буке

1
@ChuckKrutsinger Ви насправді пробували? Оскільки пропущені пробіли дозволять запустити сценарій, але сам сценарій вийде з ладу. Сценарій, ймовірно, не викликає інших сценаріїв з пробілом.
Буке

1
@ChuckKrutsinger Це дуже приємно і все, але якщо хтось хоче, щоб Xcode автоматично символізував журнал аварій, вам знадобиться моя відповідь врешті-решт.
Буке

1
Я хотів би ще раз зазначити, що букет правильний і що якщо у вас є пробіл у шляху для додатка Xcode, скрипт, який Xcode використовує для повторного позначення журналів аварійних ситуацій, НЕ буде працювати. Немає нічого спільного з ручним повторним позначенням.
Гері Макін

2

З документів Apple:

Символізація звітів про збої З Xcode Xcode автоматично намагатиметься символізувати всі повідомлення про аварійне завершення роботи. Все, що вам потрібно зробити для символізації, - це додати звіт про збій до Організатора Xcode.

  • Підключіть пристрій 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 сек. Вибух! виклики програми у сліді стека будуть символізовані! Ви все ще можете побачити багато символів! це внутрішні бібліотечні та рамкові дзвінки.

Це найпростіший, випробуваний!


1

Apple дає увійти до збоїв у форматі .txt, який є несимволічним

**

З підключеним пристроєм

**

  • Завантажте ".txt" файл, змініть розширення на ".crash" введіть тут опис зображення
    • Відкрийте пристрої та симулятори з вкладки вікна в Xcode
    • виберіть пристрій і виберіть журнали пристроїв
    • перетягніть файл .crash у вікно журналу пристрою

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

Ми зможемо там побачити символічні журнали аварійних збоїв

Перейдіть за посиланням для отримання більш детальної інформації про символізацію журналів аварій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.