क्रैश लॉग (और अंत में सफल होने) के प्रतीक के लिए यहां इन सभी उत्तरों को पढ़ने के बाद, मुझे लगता है कि यहां कुछ बिंदु गायब हैं जो यह निर्धारित करने के लिए वास्तव में महत्वपूर्ण हैं कि क्यों प्रतीक चिन्ह का आह्वान एक प्रतीकात्मक आउटपुट का उत्पादन नहीं करता है।
दुर्घटनाग्रस्त लॉग का प्रतीक होने पर 3 संपत्तियां एक साथ मिलनी चाहिए:
- क्रैश लॉग फ़ाइल स्वयं (यानी
example.crash
), या तो एक्सकोड के आयोजक से निर्यात की जाती है या आईट्यून्स कनेक्ट से प्राप्त की जाती है।
.app
पैकेज (यानी example.app
) है जो अपने आप क्रैश लॉग से संबंधित एप्लिकेशन बाइनरी में शामिल है। यदि आपके पास .ipa
पैकेज (यानी example.ipa
) है तो आप .app
पैकेज को खोलकर पैकेज को निकाल सकते हैं .ipa
(यानी unzip example.ipa
)। बाद में .app
पैकेज निकाले गए Payload/
फ़ोल्डर में रहता है ।
.dSYM
पैकेज डिबग प्रतीक वाले (यानी example.app.dSYM
)
प्रतीक चिन्ह शुरू करने से पहले आपको यह जांचना चाहिए कि क्या उन सभी कलाकृतियों का मेल है, जिसका अर्थ है कि क्रैश लॉग आपके पास बाइनरी के अंतर्गत आता है और यह कि डिबग प्रतीक उस बाइनरी के निर्माण के दौरान उत्पन्न होने वाले हैं।
प्रत्येक बाइनरी को UUID द्वारा संदर्भित किया जाता है जिसे क्रैश लॉग फ़ाइल में देखा जा सकता है:
...
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
...
इस एक्सट्रैक्ट में क्रैश लॉग एक ऐप बाइनरी इमेज से संबंधित है जिसका नाम example.app/example UUID है aa5e633efda8346cab92b01320043dc3
।
आप बौने पैकेज के बौडपंप के साथ यूयूआईडी की जांच कर सकते हैं:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
बाद में आपको जांचना चाहिए कि क्या डिबग प्रतीक आपके पास उस बाइनरी से संबंधित हैं:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
इस उदाहरण में सभी संपत्तियां एक साथ मिलती हैं और आपको अपने स्टैकट्रेस का प्रतीक होना चाहिए।
symbolicatecrash
स्क्रिप्ट को आगे बढ़ाना :
Xcode 8.3 में आपको स्क्रिप्ट को इनवॉइस करने में सक्षम होना चाहिए
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
यदि यह नहीं है तो आप find . -name symbolicatecrash
इसे खोजने के लिए अपनी Xcode.app निर्देशिका में चला सकते हैं ।
जैसा कि आप देख सकते हैं कि कोई और पैरामीटर नहीं दिए गए हैं। इसलिए स्क्रिप्ट को स्पॉटलाइट सर्च चलाकर अपने एप्लिकेशन को द्विआधारी और डिबग प्रतीकों को ढूंढना होगा। यह डिबग प्रतीकों को एक विशिष्ट सूचकांक के साथ खोजता है जिसे कहा जाता है com_apple_xcode_dsym_uuids
। आप इस खोज को स्वयं कर सकते हैं:
mdfind 'com_apple_xcode_dsym_uuids = *'
resp।
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
पहला स्पॉटलाइट आमंत्रण आपको सभी अनुक्रमित dSYM पैकेज देता है और दूसरा आपको .dSYM
विशिष्ट UUID के साथ पैकेज देता है । अगर स्पॉटलाइट को आपका .dSYM
पैकेज नहीं मिला तो symbolicatecrash
न ही। यदि आप यह सब सामान अपने जैसे सबफ़ोल्डर में करते हैं~/Desktop
स्पॉटलाइट के सब कुछ खोजने में सक्षम होना चाहिए।
यदि symbolicatecrash
आपका .dSYM
पैकेज पाता है तो निम्नलिखित में से एक रेखा होनी चाहिए symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
अपने .app
पैकेज को खोजने के लिए निम्न की तरह एक स्पॉटलाइट सर्च को इनवैलिड किया गया है symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
यदि symbolicatecrash
आपका .app
पैकेज पाता है, तो निम्नलिखित में से कुछ निकालने चाहिए symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
यदि वे सभी संसाधन इसके द्वारा पाए जाते हैं symbolicatecrash
तो आपको अपने दुर्घटना लॉग के प्रतीकात्मक संस्करण को प्रिंट कर लेना चाहिए।
अगर नहीं तो आप सीधे अपने dSYM और .app फाइलों में पास हो सकते हैं।
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
नोट: प्रतीकात्मक बैकट्रेस टर्मिनल पर आउटपुट होगा, न कि symbolicate.log
।
symbolicatecrash
यह पता लगाता हूं कि कमांड को कहां ढूंढना है , इसका उपयोग कैसे करना है, और प्रतीक करने के लिए आवश्यक dSYM फाइल को कैसे खोजना है।