Bir çarpışma günlüğünü simgelemek için (ve nihayet başarılı) tüm bu cevapları okuduktan sonra, sembolik atakların çağrılmasının neden sembolik bir çıktı üretmediğini belirlemek için gerçekten önemli olan bazı noktalar olduğunu düşünüyorum.
Bir kilitlenme günlüğünü sembolize ederken birbirine uyması gereken 3 öğe vardır:
- Çökme günlük dosyasının kendisi (yani
example.crash
), XCode'un düzenleyicisinden dışa aktarıldı veya iTunes Connect'ten alındı.
.app
Paket (yani example.app
kendisi çarpışma günlüğüne ait uygulama ikili içerdiğini). Bir .ipa
paketiniz varsa (yani example.ipa
) .app
paketi açarak .ipa
(yani unzip example.ipa
) paketi açabilirsiniz . Daha sonra .app
paket ayıklanan Payload/
klasörde bulunur.
.dSYM
Ayıklama simgeleri içeren paket (yani example.app.dSYM
)
Simgeselleştirmeye başlamadan önce, tüm bu yapıların eşleşip eşleşmediğini kontrol etmelisiniz, bu da çökme günlüğünün sahip olduğunuz ikili dosyaya ait olduğunu ve hata ayıklama simgelerinin bu ikili dosya oluşturma sırasında üretilenler olduğunu gösterir.
Her ikili dosya, kilitlenme günlük dosyasında görülebilen bir UUID ile belirtilir:
...
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
...
Bu alıntıda kilitlenme günlüğü example.app/example ile UUID adlı bir uygulama ikili görüntüsüne aittir aa5e633efda8346cab92b01320043dc3
.
Sahip olduğunuz ikili paketin UUID'sini cücedump ile kontrol edebilirsiniz:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Daha sonra, sahip olduğunuz hata ayıklama simgelerinin de bu ikiliye ait olup olmadığını kontrol etmelisiniz:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
Bu örnekte tüm varlıklar birbirine uygundur ve yığın izlemenizi sembolize edebilmeniz gerekir.
İneceğiz symbolicatecrash
senaryo:
Xcode 8.3'te betiği şu şekilde çağırabilirsiniz:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Orada yoksa find . -name symbolicatecrash
bulmak için Xcode.app dizininizde bir çalıştırabilirsiniz .
Gördüğünüz gibi daha fazla parametre verilmiyor. Komut dosyası, spotlight araması yaparak uygulama ikili ve hata ayıklama sembollerinizi bulmalıdır. Hata ayıklama simgelerini adlandırılan belirli bir dizinle arar com_apple_xcode_dsym_uuids
. Bu aramayı kendiniz yapabilirsiniz:
mdfind 'com_apple_xcode_dsym_uuids = *'
Resp.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
İlk spot ışığı çağırma size tüm endeksli dSYM paketlerini verir ve ikincisi size .dSYM
belirli bir UUID içeren paketleri verir . Spot ışığı .dSYM
paketinizi bulamazsa symbolicatecrash
, ikisi de bulamaz . Tüm bunları yaparsanız, örneğin ~/Desktop
spot ışığınızın bir alt klasöründe her şeyi bulabilmeniz gerekir.
Eğer symbolicatecrash
sizin bulur .dSYM
paketi aşağıdaki gibi bir satır olmalıdır symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
.app
Paketinizi bulmak için aşağıdakine benzer bir spotlight araması çağrılır symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Eğer symbolicatecrash
sizin bulur .app
paketi aşağıdaki özü olmalıdır symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Tüm bu kaynaklar tarafından bulunursa symbolicatecrash
, çökme günlüğünüzün sembolik sürümünü yazdırmalıdır.
Değilse doğrudan dSYM ve .app dosyalarınıza geçebilirsiniz.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Not: Sembolik arka iz terminale gönderilir, değil symbolicate.log
.
symbolicatecrash
Komutun nerede bulunacağını , nasıl kullanılacağını ve sembolizasyon için gerekli dSYM dosyasının nasıl bulunacağını listeliyorum.