2013-02-13 48 views
9

के साथ यूआईआईडी मिस्चैच मेरे पास एक ओएसएक्स डेस्कटॉप एक्सकोड प्रोजेक्ट है जिसमें एक अन्य एक्सकोड प्रोजेक्ट (एक ढांचा) निर्भरता के रूप में शामिल है। जब मैं ऐप का संग्रह बनाता हूं, तो यह दो डीएसवाईएम पैकेज उत्पन्न करता है - एक ऐप के लिए और फ्रेमवर्क के लिए एक।एक्सकोड - फ्रेमवर्क डीएसवाईएम

जब मैं ऐप से प्राप्त क्रैश का प्रतीक करता हूं, तो ऐप पैकेज से प्रतीकों को सही ढंग से दिखाया जाता है (फ़ाइल नाम और रेखा संख्याओं के साथ)। हालांकि, ढांचे से प्रतीकों का प्रतीक बिल्कुल नहीं है - वे सिर्फ फ्रेमवर्क नाम और स्मृति पता दिखाते हैं। फ्रेमवर्क कोड से जुड़े स्टैक ट्रेस के हिस्सों का प्रतीक करने का कोई तरीका है?

संग्रह है कि मैं से, ढांचे के dSYM की UUID पैकेज the.app उत्पन्न एक है कि .app में "फ़्रेमवर्क" फ़ोल्डर में नकल हो जाता है से मेल नहीं खाता को देखते हुए:

HCCommon ढांचा

/path/to/HipChat.xcarchive $ dwarfdump --uuid Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon 
UUID: 84891A9C-19DB-3E16-BE7E-9D4056FFFB97 (x86_64) Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon 

बनाम HCCommon ढांचे के dSYM (संग्रह फ़ाइल में dSYMs निर्देशिका में):

/path/to/HipChat.xcarchive $ dwarfdump --uuid dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon 
UUID: 767F2D97-9E0B-3C4D-8337-FDF5A9CA2D81 (x86_64) dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon 

उत्तर

4

मैं n हूँ संग्रह फ़ाइल में .app पैकेज के अंदर सुनिश्चित करें कि आपके निर्माण के परिणामस्वरूप असंगत डीएसवाईएम यूयूआईडी क्यों हैं। जब हम इन प्रकार के निर्माण करते हैं (अब कुछ स्पॉट-चेक किए गए हैं), हमारे पास लगातार यूयूआईडी हैं।

हालांकि, आपके प्रश्न के उत्तर में कि आप पहले से ही प्राप्त की गई क्रैश रिपोर्टों का प्रतीक कैसे बना सकते हैं, जो आपके पास पहले से ही प्राप्त हो चुके हैं। (इस पल के लिए मानते हुए कि यूयूआईडी मिलान करते हैं, वे समान कोड का संदर्भ देते हैं, और इस प्रकार काम करेगा)।

मैं पाया है अच्छी तरह से काम करने के लिए आप विशिष्ट dsym मजबूर करने के लिए है, तो निम्नलिखित:

atos -arch x86_64 -o <path_to_dsym_within_package> -l <offset_of_framework> 

यह निश्चित रूप से के रूप में सुंदर नहीं है और आम तौर पर मैं मैन्युअल रफ के माध्यम से अलग-अलग पते चलाते हैं, लेकिन परिणाम एक वैध है दिनचर्या/लाइन संयोजन (यह मानते हुए कि आप सही संस्करण से मेल खाते हैं, आदि)

<path_to_dsym_within_package>foo.framework.dSYM/Contents/Resources/DWARF/foo अपने द्विआधारी नाम है, जहां foo ढांचे का नाम है जिसके बाद को दर्शाता है। हमारे लिए यह किसी भी प्रकार की प्लगइन के लिए भी काम करता है।

<offset_of_framework> क्रैश लॉग, जहां में ऑफसेट स्तंभ से है:

0 libsystem_kernel.dylib 0x7fff8e785ce2 0x7fff8e76f000 + 93410 
1 libsystem_c.dylib 0x7fff871afa7a 0x7fff8716e000 + 268922 
2 CTUtils 0x104e26c62 0x104e17000 + 64610 

इस मामले में, पहले हेक्स संख्या का पता, दूसरी हेक्स संख्या विशेष ढांचे के लिए ऑफसेट शुरू कर रहा है है, और + मान ढांचे के भीतर दशमलव ऑफसेट है।

आपको उपरोक्त कमांड लाइन के लिए दूसरा नंबर (हेक्स ऑफसेट) और विशिष्ट दिनचर्या/रेखा संख्या खोजने के लिए पहली संख्या की आवश्यकता होगी।

एक बुरी से बुरी हालत में, हमेशा सीधे dwarfdump उपयोग कर रहा है, का उपयोग करते हुए:

dwarfdump <path_to_dSYM> --arch x86_64 --lookup <offset> 

<path_to_dSYM> शीर्ष स्तर (ऊपर atos आदेश के विपरीत) ".dSYM" फ़ोल्डर के लिए पथ है, और <offset> मॉड्यूल के भीतर ऑफ़सेट है, जो atos के रूप में सुविधाजनक नहीं है।

पीएसatos को /usr/bin/atos में स्थापित किया जाना चाहिए यदि आपके पास देव उपकरण इंस्टॉल हैं।

1

मुझे भी इस समस्या का सामना करना पड़ा। कुछ जांच के बाद, यह पता चला कि एक्सकोड डीबग फ्रेमवर्क को रिलीज बिल्ड में बनाता है, लेकिन जाहिर है, सही रिलीज बाइनरी से डीएसवाईएम बनाना।

यह वर्कस्पेस से ढांचे निर्भरताओं को जोड़ने के लिए एक्सकोड का उपयोग करने के बावजूद था। आखिरकार मुझे पता चला कि क्यों: ढांचे को उनके कारण "समूह से सापेक्ष" के साथ परियोजना को शामिल किया गया था। यह सुनिश्चित करने के बाद कि सभी "उत्पाद बनाने के सापेक्ष" थे, इसने मेरे लिए समस्या हल की। यह नहीं कह रहा कि यह एकमात्र संभावित कारण है, लेकिन बिल्ड लॉग में सभी पथों को दोबारा जांचना उचित है, क्योंकि एक्सकोड इस मामले में किसी भी चीज़ के बारे में चेतावनी नहीं देगा।

enter image description here