Co to jest dSYM i jak go używać? (iOS SDK)

117

Czasami kompilator tworzy pliki .dSYM. Wydaje mi się, że jest to plik związany z debugowaniem, ale nie wiem, co to jest i jak go używać.

Co to jest .dSYM? Jak tego używam?

eonil
źródło

Odpowiedzi:

160

Pliki dSYM przechowują symbole debugowania dla Twojej aplikacji

Usługi takie jak crashlytics używają go do zastępowania symboli w dziennikach awarii odpowiednimi nazwami metod, aby były czytelne i miały sens.

Zaletą korzystania z dSYM jest to, że nie musisz wysyłać swojej aplikacji z symbolami, co utrudnia jej inżynierię wsteczną, a także zmniejsza rozmiar pliku binarnego

Aby użyć do symbolizacji dziennika awarii, musisz przeciągnąć dziennik awarii do dzienników urządzenia urządzenia w organizatorze maszyny, która skompilowała plik binarny aplikacji (maszyna przechowująca plik dSYM)

Jeśli masz dSYM, ale nie masz maszyny, skompilowałeś plik binarny aplikacji, postępuj zgodnie z instrukcjami w tym linku, aby zainstalować dSYM na komputerze

Więcej informacji można znaleźć w nocie technicznej TN2151 firmy Apple

Tomer Even
źródło
1
Czy dołączenie plików dSYM do pliku binarnego sklepu z aplikacjami nie spowoduje, że Crashlytics nie będzie w stanie rejestrować awarii?
genaks
Czy można bezpiecznie odznaczyć pole „Uwzględnij symbole aplikacji ...”?
genaks
2
Jeśli chcesz mieć możliwość wyświetlania crashlogów w Apple Connect, możesz dołączyć symbole aplikacji podczas przesyłania aplikacji do sklepu z aplikacjami. jeśli używasz crashlytics, nie musisz tego robić, ale dołączenie symboli aplikacji (plik dsym) i wysłanie go do Apple nie zaszkodzi, zaznaczając opcję „dołącz symbole aplikacji ...” podczas przesyłania do aplikacji Kreator sklepu
Tomer Even
1
Myślałem o zaoszczędzeniu użytkownikowi kilku MB, jeśli można to zrobić
genaks
Od twórców Crashlytics - twittercommunity.com/t/ ...
genaks
1

dSYMoznacza Xcode Debugging Symbols, jest to rodzaj pliku mapowania, który może, na przykład, dekodować ślad stosu do czytelnego formatu. Jest to Bundlez następną strukturą:

Na przykład dziennik awarii wygląda następująco:

//before
0   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
1   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
2   libswiftCore.dylib              0x000000018f3c8844 0x18f394000 + 215108
3   libswiftCore.dylib              0x000000018f3a74e0 0x18f394000 + 79072
4   libswiftCore.dylib              0x000000018f3ab0d8 0x18f394000 + 94424
5   F49088168M                      0x00000001045ac750 0x104590000 + 116560
6   F49088168M                      0x00000001045b7904 0x104590000 + 162052
7   F49088168M                      0x00000001045b897c 0x104590000 + 166268
8   F49088168M                      0x000000010459d914 0x104590000 + 55572
9   F49088168M                      0x00000001045a0e70 0x104590000 + 69232
10  F49088168M                      0x00000001045a0f4c 0x104590000 + 69452

dSYM w akcji

//after Symbolicating(dSYM is used)
0   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
1   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
2   libswiftCore.dylib              0x000000018f3c8844 _assertionFailure+ 215108 (_:_:file:line:flags:) + 468
3   libswiftCore.dylib              0x000000018f3a74e0 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 79072 (_:wasNativeTypeChecked:) + 208
4   libswiftCore.dylib              0x000000018f3ab0d8 Array.subscript.getter + 84
5   F49088168M                      0x00000001045ac750 static ELM327ResponseManager.getResponse(responseStr:obd2Protocol:) + 116560 (ELM327ResponseManager.swift:27)
6   F49088168M                      0x00000001045b7904 ELM327Client.dataInput(_:characteristicUuidStr:) + 162052 (ELM327Client.swift:56)
7   F49088168M                      0x00000001045b897c protocol witness for BLEClientInputPort.dataInput(_:characteristicUuidStr:) in conformance ELM327Client + 166268 (<compiler-generated>:0)
8   F49088168M                      0x000000010459d914 BLEConnection.peripheralDataReceived(data:characteristicUuidStr:) + 55572 (BLEConnection.swift:124)
9   F49088168M                      0x00000001045a0e70 BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69232 (BLEConnection.swift:293)
10  F49088168M                      0x00000001045a0f4c @objc BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69452 (<compiler-generated>:0)

Domyślnie dSYMjest generowany domyślnie dla wersji wydania . Możesz to sprawdzić:

Build Settings -> Generate Debug Symbols -> Yes
Build Settings -> Debug Information Format -> DWARF with dSYM File

Lokalizacja wyników, którą można znaleźć w Productsfolderze

Aby dSYMręcznie wygenerować plik .appprzy użyciudsymutil

dsymutil F49088168M.app/F49088168M -o F49088168M.app.dSYM

Aby symbolizować awarię za pomocą symbolicatecrash

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/Current/Resources/symbolicatecrash "<path>/F49088168M-2020-06-04-212904.crash" "<path>/F49088168M.app.dSYM" > symbolicated.crash

Aby otworzyć dSYMręcznie za pomocądwarfdump

dwarfdump --arch arm64 --debug-pubtypes F49088168M.app.dSYM

wynik wygląda następująco:

0x00000065 "PeripheralLogView"
0x000005cc "BLEConnection"
0x000005da "BLEPeripheral"
0x000005e9 "ELM327Client"

[Słownictwo]

yoAlex5
źródło