Po przeczytaniu wszystkich tych odpowiedzi tutaj, aby symbolizować dziennik awarii (i wreszcie powodzenie), myślę, że brakuje tutaj kilku punktów, które są naprawdę ważne, aby ustalić, dlaczego wywołanie symbolicatecrash nie generuje symbolicznego wyniku.
Istnieją 3 zasoby, które muszą pasować do siebie podczas symbolizowania dziennika awarii:
- Sam plik dziennika awarii (tj.
example.crash
) Wyeksportowany z organizatora XCode lub otrzymany z iTunes Connect.
.app
Pakiet (tj example.app
), która sama w sobie zawiera aplikację binarny należącej do katastrofy dzienniku. Jeśli masz .ipa
pakiet (tj. example.ipa
), Możesz .app
go rozpakować, rozpakowując .ipa
pakiet (tj unzip example.ipa
.). Następnie .app
pakiet znajduje się w rozpakowanym Payload/
folderze.
.dSYM
Opakowanie zawierające symbole debugowania (tj example.app.dSYM
)
Przed rozpoczęciem symbolizacji należy sprawdzić, czy wszystkie te artefakty są zgodne, co oznacza, że dziennik awarii należy do posiadanego pliku binarnego i że symbole debugowania są tymi, które powstają podczas kompilacji tego pliku binarnego.
Każdy plik binarny jest oznaczony identyfikatorem UUID, który można zobaczyć w pliku dziennika awarii:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
W tym wyciągu dziennik awarii należy do obrazu binarnego aplikacji o nazwie example.app/example z UUID aa5e633efda8346cab92b01320043dc3
.
Możesz sprawdzić UUID pakietu binarnego, który masz za pomocą dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Następnie powinieneś sprawdzić, czy symbole debugowania, które posiadasz, również należą do tego pliku binarnego:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
W tym przykładzie wszystkie zasoby pasują do siebie i powinieneś być w stanie symbolizować swój stacktrace.
Przejdź do symbolicatecrash
skryptu:
W Xcode 8.3 powinieneś być w stanie wywołać skrypt za pośrednictwem
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Jeśli go nie ma, możesz uruchomić find . -name symbolicatecrash
w katalogu Xcode.app, aby go znaleźć.
Jak widać, nie podano już żadnych parametrów. Skrypt musi więc znaleźć symbole binarne i symbole debugowania aplikacji, uruchamiając wyszukiwanie punktowe. Przeszukuje symbole debugowania za pomocą określonego indeksu o nazwie com_apple_xcode_dsym_uuids
. Możesz wykonać to wyszukiwanie samodzielnie:
mdfind 'com_apple_xcode_dsym_uuids = *'
odpowiednio
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
Pierwsze wywołanie w centrum uwagi daje wszystkie zindeksowane pakiety dSYM, a drugie daje .dSYM
pakiety o określonym UUID. Jeśli narzędzie Spotlight nie znajdzie Twojego .dSYM
pakietu symbolicatecrash
, nie będzie. Jeśli robisz te wszystkie rzeczy, np. W podfolderze swojego ~/Desktop
reflektora, powinno być w stanie znaleźć wszystko.
Jeśli symbolicatecrash
znajdzie twój .dSYM
pakiet, powinien pojawić się wiersz taki jak poniżej symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
W celu znalezienia .app
pakietu wywoływane jest wyszukiwanie punktowe, takie jak symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Jeśli symbolicatecrash
znajdziesz .app
paczkę, powinien znajdować się następujący fragment symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Jeśli wszystkie te zasoby zostaną znalezione symbolicatecrash
, powinien wydrukować symboliczną wersję dziennika awarii.
Jeśli nie, możesz przekazać swoje pliki dSYM i .app bezpośrednio.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Uwaga: Symboliczny ślad będzie wyprowadzany na terminal, a nie symbolicate.log
.
symbolicatecrash
Podaję , gdzie znaleźć polecenie, jak go użyć i jak znaleźć plik dSYM potrzebny do symbolizacji.