Jak symbolizować dziennik awarii Xcode?

189

Organizator Xcode 5 miał widok z listą wszystkich dzienników awarii. i moglibyśmy przeciągnąć tutaj dzienniki awarii. Ale od Xcode 6 wiem, że wyprowadzili urządzenia z organizacji i mają nowe okno na to samo. Ale nie znajduję miejsca, w którym przeglądam dzienniki awarii, które przeciągnąłem do Xcode 5 po aktualizacji do Xcode 6. Czy ktoś zna odpowiedź?

Nithin Pai
źródło
3
Zapytałem to kilka miesięcy temu na forach programistów Apple i nigdy nie otrzymałem odpowiedzi. Jest to utrata przydatnej funkcjonalności. Wyślij raport o błędzie do Apple z prośbą o odzyskanie tej funkcji.
rmaddy
1
Zrzuciłem to razem na weekend, aby rozwiązać symbolikę zrzutów awaryjnych iOS i OSX. Nadal jest bardzo szorstki, ale powinien działać. github.com/agentsim/Symbolicator
Tim
4
Xcode, czy możesz po prostu symbolizować dzienniki awarii od recenzentów Apple, tak jak powinieneś ... zamiast zakładać, że mamy dosłownie cały dzień, aby wymyślić, jak to zrobić?
William Entriken

Odpowiedzi:

120

Ok, zdałem sobie sprawę, że możesz to zrobić:

  1. W Xcode > Window > Deviceswybierz podłączony iPhone / iPad / etc w lewym górnym rogu.
  2. Wyświetl dzienniki urządzeń
  3. Wszystkie dzienniki

Prawdopodobnie masz tam wiele dzienników, a aby łatwiej znaleźć później zaimportowany dziennik, możesz po prostu usunąć wszystkie dzienniki w tym momencie ... chyba że oznaczają dla ciebie pieniądze. Lub chyba, że ​​znasz dokładny moment awarii - i tak powinien zostać zapisany w pliku ... Jestem leniwy, więc po prostu usuwam wszystkie stare logi (tak naprawdę zajęło to trochę czasu).

  1. Po prostu przeciągnij i upuść plik na tę listę. To zadziałało dla mnie.
Jonny
źródło
13
Mam ten sam problem, ale to nie rozwiązuje problemu - dzienniki, które przeciągam i upuszczam w oknie, pojawiają się, ale nie symbolizują.
Arkaaito,
9
Sztuka polega na tym, że musisz podłączyć urządzenie i wybrać urządzenie z listy. Nie sądzę, że jest to możliwe bez urządzenia.
Jonny
60
Aby plik awarii mógł zostać przeciągnięty na tę listę, powinien mieć rozszerzenie .crash.
pjay_
7
Brakujący krok dla mnie polegał na tym, że po usunięciu pliku musiałem kliknąć plik prawym przyciskiem myszy i ponownie symbolizować dziennik
RobCroll,
6
Nie zapomnij o „Pobierz dSYM” dla tego archiwum w Organizatorze.
123FLO321,
259

Piszę tę odpowiedź zarówno dla społeczności, jak i dla siebie.

Jeśli kiedykolwiek wystąpią problemy symbolizujące raport o awarii, można je rozwiązać w następujący sposób:

  1. Utwórz osobny folder, skopiuj Foo.appi Foo.app.dSYMz odpowiedniego .xcarchivedo folderu. Skopiuj również .crashraport do folderu.

  2. Otwórz raport o awarii w TextEdit lub w innym miejscu, przejdź do Binary Images:sekcji i skopiuj tam pierwszy adres (np 0xd7000.).

  3. cddo folderu. Teraz możesz uruchomić następujące polecenie:

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

Będzie to symbolizować symbol pod adresem 0x0033f9bb. Upewnij się, że wybrano prawidłową wartość dla tej -archopcji (można ją uzyskać z pierwszego wiersza w Binary Images:sekcji lub dowiedzieć się z Hardware Model:raportu o awarii i obsługiwanych łuków aplikacji).

Możesz także skopiować niezbędne adresy (np. Stos wywołania wątku) z raportu o awarii bezpośrednio do pliku tekstowego (w TextEdit, przytrzymaj Option i wybierz wymagany blok tekstowy lub skopiuj i wytnij), aby uzyskać coś takiego:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Teraz możesz zapisać to w pliku tekstowym, np. addr.txtI uruchomić następującą komendę:

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

To da ładną symbolikę dla wszystkich adresów jednocześnie.

PS

Przed zrobieniem powyższego warto sprawdzić, czy wszystko jest skonfigurowane poprawnie (co atoschętnie zgłosi coś dla praktycznie dowolnego podanego adresu).

Aby to sprawdzić, otwórz raport o awarii i przejdź do końca stosu wywołań dla Thread 0. Pierwszy wiersz od końca do listy aplikacji (zwykle drugi), np .:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

powinno być main()wezwanie. Symbolizowanie adresu ( 0x0033f9bbw tym przypadku), jak opisano powyżej, powinno potwierdzić, że jest to rzeczywiście, main()a nie jakakolwiek przypadkowa metoda lub funkcja.

Jeśli adres nie jest adresem main(), sprawdź adres ładowania ( -lopcja) i arch ( -archopcja).

PPS

Jeśli powyższe nie działa z powodu kodu bitowego , pobierz dSYM dla swojej kompilacji z iTunes Connect, rozpakuj wykonywalny plik binarny z dSYM (Finder> Pokaż zawartość pakietu), skopiuj go do katalogu i użyj go (tj. Foo) Jako argument do atoszamiast zamiast Foo.app/Foo.

Wybrzeże Morza Tybetańskiego
źródło
2
dziękuję za problem z napisaniem mini samouczka xcrun i zaktualizowaniem go za pomocą sekcji kontroli poczytalności. moje zdrowie psychiczne zostaje uratowane po wielu przekleństwach i nie widać żadnego symbolu
Anton Tropashko
10
Nie zapomnij sprawdzić, czy raport o awarii odpowiada plikowi wykonywalnemu i dSYM. Możesz to sprawdzić, dopasowując identyfikator w <> pod sekcją Obraz binarny z tym zwróconym z pliku wykonywalnego przez uruchomieniexcrun dwarfdump --uuid <path to executable>
Ryan C. Payne
2
Należy pamiętać, że pojawią się tylko symbole z Twojej aplikacji (Foo). Nie wyświetla się dla symboli z zewnętrznych bibliotek / frameworków, takich jak Foundation lub libsystem_kernel.dylib.
jlukanta,
1
jest to pomocne, ale nadal nie działa dla mnie. problem z tym, że nie mam informacji 0xd7000. moja linia wygląda tak: 0x100038328 __mh_execute_header + 99112. Przeczytałem, co to jest __mh_execute_header, ale jak mogę uzyskać informacje o 0x100038328 ??? Mam wszystko inne
skinsfan00atg
5
Napisałem prosty skrypt bash, który wykonuje większość pracy dla Ciebie. Zastosowanie: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash Tylko symbolizuje pełny raport o awarii i daje symboliczną wersję tego raportu. gist.github.com/nathan-fiscaletti/…
Nathan F.
187

Możesz również odnieść się do tego, napisałem krok po kroku procedurę ręcznej re-symbolizacji awarii.

Ponowna symbolizacja awarii

KROK 1

Przenieś wszystkie powyższe pliki (MyApp.app, MyApp-dSYM.dSYM i MyApp-Crash-log.crash) do folderu o wygodnej nazwie, gdziekolwiek możesz łatwo użyć Terminalu.

Dla mnie Desktop jest najłatwiej dostępnym miejscem;) Tak więc przeniosłem te trzy pliki do folderu MyApp na pulpicie.

KROK 2

Teraz kolej na Findera, przejdź do ścieżki, która jest odpowiednia dla twojej wersji XCODE.

Użyj tego polecenia, aby znaleźć symbolicatecrashplik skryptu,
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

Niższy niż Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Lub Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

KROK 3

Dodaj katalog znalezionego pliku skryptu symbolicatecrash do $PATHzmiennej env w następujący sposób: sudo vim /etc/paths.d/Xcode-symbolicatecrashwklej katalog pliku skryptu i zapisz plik. Otwierając nowy terminal, możesz wywoływać symbolicatecrashw dowolnym folderze jako polecenia znajdujące się w /usr/bin.

Lub

Skopiuj plik symbolicatecrash z tej lokalizacji i wklej go do pulpitu / MyApp (Czekaj… Nie ślepo mnie obserwuj, wklejam plik sybolicatecrash w folderze MyApp, utworzonym w kroku pierwszym w ulubionej lokalizacji, mając trzy pliki. )

KROK 4

Otwórz terminal i włóż dysk CD do folderu MyApp.

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

 -  Naciśnij Enter

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

 -  Naciśnij Enter

Otóż ​​to !! Symboliczne logi są na twoim terminalu… teraz na co czekasz? Teraz po prostu znajdź błąd i rozwiąż go;)

Happy Coding !!!

Mrug
źródło
2
@ EmilVikström: Dziękujemy za sugestie, zaktualizowałem odpowiedź.
Mrug
2
Użyj eksportu DEVELOPER_DIR =xcode-select --print-path
Parag Bafna
8
Pracowałem przysmak - dziękuję. Tylko jedną rzecz musiałem użyć eksportu DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (bez cudzysłowów).
goelektryczny
1
„export DEVELOPER_DIR = xcode-select --print-path” po prostu mi mówi „-bash: export:` --print-path ': niepoprawny identyfikator
Almo
2
aktualizacja; oto jest; dla xcode7 znajdź symboliczną skrzynię tutaj; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash za stackoverflow.com/questions / 32804611 /…
AnneTheAgile
28

Dla mnie wystarczył plik .crash. Bez pliku .dSYM i pliku .app.

Uruchomiłem te dwa polecenia na komputerze Mac, na którym buduję archiwum i działało:

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
Marek Manduch
źródło
łał. Nie wiem, jak to działa bez pliku .dsym, ale działa!
rustyMagnet
4
@rustyMagnet Działa to przy użyciu dsyms z zarchiwizowanych kompilacji na twoim komputerze.
Andrey Tarantsov,
1
Tak, działa to tylko w przypadku kompilacji zarchiwizowanych za pomocą Xcode, a nie innych kompilacji, które mogłeś wygenerować dla uruchomień ad-hoc, dla których chcesz symbolizować dzienniki awarii.
CMash
21

Istnieje łatwiejszy sposób korzystania z Xcode (bez użycia narzędzi wiersza poleceń i wyszukiwania adresów pojedynczo)

  1. Weź dowolny plik .xcarchive. Jeśli masz go wcześniej, możesz go użyć. Jeśli go nie masz, utwórz go, uruchamiając Produkt> Archiwum z Xcode.

  2. Kliknij prawym przyciskiem myszy plik .xcarchive i wybierz opcję „Pokaż zawartość pakietu”

  3. Skopiuj plik dsym (wersji aplikacji, która uległa awarii) do folderu dSYMs

  4. Skopiuj plik .app (wersji aplikacji, która uległa awarii) do folderu Produkty> Aplikacje

  5. Edytuj Info.plist i edytuj CFBundleShortVersionString i CFBundleVersion w słowniku ApplicationProperties. Pomoże to później zidentyfikować archiwum

  6. Kliknij dwukrotnie plik .xcarchive, aby zaimportować go do Xcode. Powinien otworzyć Organizer.

  7. Wróć do dziennika awarii (w oknie Urządzenia w Xcode)

  8. Przeciągnij tam swój plik .crash (jeśli jeszcze go nie ma)

  9. Cały dziennik awarii powinien być teraz symbolizowany. Jeśli nie, kliknij prawym przyciskiem myszy i wybierz „Ponownie symbolizuj dziennik awarii”

RPM
źródło
1
Twoja odpowiedź jest poprawna i prosta. Nie ma potrzeby korzystania z aplikacji Terminal. Odtwarzanie folderu .xcarchive jest bardzo ważne, ponieważ w niektórych systemach Continuous-Integration nie ma pliku .xcarchive zamiast kulki zip folderu .app.dSYM. Przez przypadek to, co zrobiłem wczoraj, jest dokładnie takie samo, jak pan powiedział.
DawnSong
jak powinna wyglądać pełna wydajność?
noobsmcgoobs 19.04.2016
To częściowo symbolizuje moje dzienniki awarii, chociaż pominąłem krok 3-5, ponieważ mój xcarchive dotyczy wersji aplikacji, która uległa awarii.
Declan McKenna,
1
Oczywiście będzie to tylko symbolizować twój własny kod - a nie zewnętrzny kod biblioteki, którego mogłeś użyć.
RPM
7

Wykonaj następujące kroki w Xcode 10, aby symbolizować dziennik awarii z aplikacji zbudowanej na tym samym komputerze:

  1. Wewnątrz Organizatora zlokalizuj archiwum, na którym opiera się aplikacja.
  2. Kliknij przycisk Pobierz symbole debugowania . Nic nie pojawi się w folderze Pobrane, ale to jest OK.
  3. Podłącz maszynę do kompilacji do urządzenia z systemem iOS.
  4. Wybierz urządzenie w Urządzenia i symulatory .
  5. Kliknij przycisk Wyświetl dzienniki urządzeń .
  6. Przeciągnij i upuść plik awarii do lewego panelu. Plik musi kończyć się rozszerzeniem .crash , w przeciwnym razie przeciąganie się nie powiedzie.
  7. Przejdź do karty Wszystkie dzienniki .
  8. Wybierz dodany plik awarii.
  9. Plik powinien automatycznie symbolizować, w przeciwnym razie użyj menu kontekstowego Re-Symbolicate Log .
Ely
źródło
1
Na początku nie myślałem, że to dodaje coś do innych postów, ale wydaje mi się, że brakowało mi dwóch pierwszych kroków, a konkretnie „Pobierz symbole debugowania”. Dziękuję Ci.
Christopher King
6

Jeśli masz plik .dSYM i plik .crash w tym samym podfolderze, wykonaj następujące czynności:

  1. Patrząc na ślad w pliku .crash, zwróć uwagę na nazwę obrazu binarnego w drugiej kolumnie i adres w trzeciej kolumnie (np. 0x00000001000effdc w poniższym przykładzie).
  2. Tuż pod śladem wstecznym w sekcji „Obrazy binarne” zwróć uwagę na nazwę obrazu, architekturę (np. Arm64) i adres ładowania (0x1000e4000 w poniższym przykładzie) obrazu binarnego (np. TheElements).
  3. Wykonaj następujące czynności:

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

Autorytatywne źródło: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Victor Bogdan
źródło
4

Xcode 11.2.1, grudzień 2019

Apple daje awarię logowania w formacie .txt, który nie jest oznaczony symbolem

**

Po podłączeniu urządzenia

**

  • Pobierz plik „.txt”, zmień rozszerzenie na „.crash” wprowadź opis zdjęcia tutaj
    • Otwórz urządzenia i symulatory z zakładki okna w Xcode
    • wybierz urządzenie i wybierz dzienniki urządzenia
    • przeciągnij i upuść plik .crash do okna dziennika urządzenia

wprowadź opis zdjęcia tutaj

Będziemy mogli tam zobaczyć symboliczne dzienniki awarii

Zobacz link, aby uzyskać więcej informacji na temat symbolicznych dzienników awarii

Suraj K. Thomas
źródło
Łał. Zrobiło to zmiana rozszerzenia pliku z .txt na .crash. Dali mi plik .txt. Dzięki. Nie mogę uwierzyć, że twoja odpowiedź jest tak niska.
datWooWoo
3

Upewnij się, że nazwa aplikacji Xcode nie zawiera spacji. To był powód, dla którego to nie działało. Tak /Applications/Xcode.appdziała, a /Applications/Xcode 6.1.1.appnie działa.

Bouke
źródło
Czy próbowałeś? Jeśli nie, spróbuj sprawdzić, czy Twój komentarz ma jakiś sens.
Bouke
1
To nie to samo, o czym mówię. Nazwa Xcode może zostać zmieniona po instalacji, ale przed pierwszym użyciem. Jednak skrypt do symbolizacji nie obsługuje spacji w nazwie aplikacji i kończy się niepowodzeniem.
Bouke,
1
@ChuckKrutsinger Czy rzeczywiście próbowałeś? Ponieważ spacje pozwalają na uruchomienie skryptu, ale sam skrypt się nie powiedzie. Skrypt prawdopodobnie nie wywołuje innych skryptów ze spacją.
Bouke,
1
@ChuckKrutsinger To bardzo miłe i wszystko, ale jeśli ktoś chce, aby Xcode automatycznie symbolizował dziennik awarii, w końcu będziesz potrzebować mojej odpowiedzi.
Bouke,
1
Chciałbym powtórzyć, że bouke jest poprawny i jeśli masz miejsce na ścieżce dla aplikacji Xcode, skrypt używany przez Xcode do ponownego symbolizowania dzienników awarii NIE zadziała. Nie ma nic wspólnego z ręcznym ponownym symbolizowaniem.
Gary Makin,
2

Z dokumentów Apple:

Symbolizowanie raportów o awariach za pomocą Xcode Xcode automatycznie podejmie próbę symbolizacji wszystkich napotkanych raportów o awariach. Wszystko, co musisz zrobić, aby utworzyć symbolikę, to dodać raport o awarii do Organizatora Xcode.

  • Podłącz urządzenie iOS do komputera Mac
  • Wybierz „Urządzenia” z menu „Okno”
  • W sekcji „URZĄDZENIA” w lewej kolumnie wybierz urządzenie
  • Kliknij przycisk „Wyświetl dzienniki urządzeń” w sekcji „Informacje o urządzeniu” na prawym panelu
  • Przeciągnij raport o awarii do lewej kolumny prezentowanego panelu
  • Xcode automatycznie symbolizuje raport o awarii i wyświetla wyniki Aby symbolizować raport o awarii, Xcode musi być w stanie zlokalizować:

    1. Plik binarny i plik dSYM aplikacji powodującej awarię.

    2. Pliki binarne i pliki dSYM dla wszystkich niestandardowych środowisk, z którymi łączy się aplikacja. W środowiskach zbudowanych ze źródła z aplikacją ich pliki dSYM są kopiowane do archiwum wraz z plikiem dSYM aplikacji. W przypadku frameworków, które zostały zbudowane przez firmę zewnętrzną, będziesz musiał poprosić autora o plik dSYM.

    3. Symbole dla systemu operacyjnego, na którym działała ta aplikacja po awarii. Te symbole zawierają informacje debugowania dla ram zawartych w określonej wersji systemu operacyjnego (np. IOS 9.3.3). Symbole systemu operacyjnego są specyficzne dla architektury - wersja iOS dla urządzeń 64-bitowych nie będzie zawierać symboli armv7. Xcode automatycznie skopiuje symbole systemu operacyjnego z każdego urządzenia podłączonego do komputera Mac.

Jeśli któregoś z nich brakuje, Xcode może nie być w stanie symbolizować raportu o awarii lub może tylko częściowo symbolizować raport o awarii.

Ethan
źródło
2

Najłatwiejszy proces do symbolizowania dzienników awarii:

  1. zachowaj plik xcarchive z organizatora podczas procesu budowania IPA do przyszłego użytku.
  2. Gdy nastąpi awaria, zbierz dzienniki awarii z urządzenia, którego dotyczy problem. Rozszerzenie powinno mieć postać .crash. Jeśli dziennik awarii ma format .ips, po prostu zmień jego nazwę na .crash.
  3. Kliknij dwukrotnie plik xcarchive z zapisanej ścieżki, aby pojawił się w organizerze (jeśli jeszcze go nie ma).
  4. otwórz w oknie xcode-> urządzenia i symulatory -> wyświetl dzienniki urządzeń -> wszystkie dzienniki -> przeciągnij i upuść plik .crash.

Poczekaj 5 sekund. Huk! wywołania aplikacji w śledzeniu stosu będą symbolizowane! Jednak nadal możesz zobaczyć wiele symboli! są to wywołania biblioteki wewnętrznej i frameworka.

Jest to najłatwiejszy, wypróbowany i przetestowany!

Sanchita
źródło
1

Apple daje awarię logowania w formacie .txt, który nie jest oznaczony symbolem

**

Po podłączeniu urządzenia

**

  • Pobierz plik „.txt”, zmień rozszerzenie na „.crash” wprowadź opis zdjęcia tutaj
    • Otwórz urządzenia i symulatory z zakładki okna w Xcode
    • wybierz urządzenie i wybierz dzienniki urządzenia
    • przeciągnij i upuść plik .crash do okna dziennika urządzenia

wprowadź opis zdjęcia tutaj

Będziemy mogli tam zobaczyć symboliczne dzienniki awarii

Zobacz link, aby uzyskać więcej informacji na temat symbolicznych dzienników awarii

Suraj K. Thomas
źródło