2012-05-14 15 views
13

को अलग करने के लिए आईओएस क्रैश डंप में ऑफसेट्स को मिलान करना मुझे ओटोल द्वारा आउटपुट के रूप में बाइनरी के डिस्सेप्लिब्स में ऑफ़सेट के साथ आईओएस क्रैश डंप के स्टैक निशान में ऑफ़सेट से मिलान करने में समस्या हो रही है।बाइनरी

क्या कोई यह पुष्टि कर सकता है कि सिद्धांत में मैं इनसे कैसे मेल खाता हूं। उदाहरण के लिए, अगर मैं क्रैश डंप में एक लाइन मिलती है:

0 myapp 0x00005b0a 0x1000 + 19210 

मैं उम्मीद करेंगे बाइनरी फ़ाइल में हमलावर शिक्षा का ऑफसेट 0x5b0a, 0x4b0a .... या कुछ और होना करने के लिए?

हेडर सूचना के अपने डिकोडिंग में, otool भी देता है, उदाहरण के लिए, इस जानकारी (वास्तविक कोड ऑफसेट 0x0000224c पर फ़ाइल में शुरू होता है):

Section 
    sectname __text 
    segname __TEXT 
     addr 0x0000224c 
     size 0x00063ad2 
    offset 4684 
    align 2^2 (4) 
    reloff 0 
    nreloc 0 
     type S_REGULAR 
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS 
reserved1 0 
reserved2 0 

तो, मैं 100% यकीन नहीं था मैं इसे सही तरीके से व्याख्या कर रहा था, लेकिन ऐसा लगता है कि फ़ाइल में + 0x224c पर कोड, स्मृति में 0x124c ऑफसेट पर समाप्त होता है, लेकिन तब मुझे बिल्कुल यकीन नहीं था कि यह किस प्रकार फिट हुआ है, उदाहरण के लिए, स्थान 0x1000।

मेरी समस्या यह है कि ऑफ़सेट 0x5b0a ऑफसेट, न तो निर्देश और न ही 0x4b0a पर और न ही 0x6b0a पर प्रश्न में वास्तविक निर्देश होने के रूप में समझ में आता है (इस तथ्य के साथ कि जैसे स्थान ढेर के नीचे और फिर डॉन शाखा निर्देशों को इंगित नहीं करते हैं)।

(मुझे पता है कि, कम से कम एआरएम की प्रारम्भिक अवतार पर, वहाँ निर्देश पाइपलाइन की वजह से पीसी के मूल्य और इसी स्मृति पते के बीच अंतर क्यों था। मैं संभालने था कि इस तरह के एक अंतर लिया जाएगा क्रैश डंप में रिपोर्ट किए गए ऑफ़सेट में, या किसी भी दर पर, मैं शाखा निर्देश को प्रश्न में कुछ निर्देशों को देखता हूं, किसी एक तरफ से यह इंगित करता है कि इस तरह का अंतर ध्यान में नहीं लिया गया था ...)

क्या कोई भी कोई प्रकाश डाल सकता है?

+0

क्या कोई कारण है कि आप केवल प्रतीकात्मक नहीं हो सकते हैं? http://stackoverflow.com/questions/3832900/how-to-manually-symbolicate-ios-crash-to-view-crash-logs/8648232#8648232 –

+2

मैं * बस * प्रतीक नहीं कर सकता क्योंकि मेरे पास नहीं है प्रतीक फ़ाइल (कोड किसी तीसरे पक्ष द्वारा संकलित किया गया है)। हालांकि, अगर यह एकमात्र विकल्प है तो मुझे लगता है कि मुझे यह पूछना होगा कि क्या वे प्रतीक फ़ाइल प्रदान कर सकते हैं या नहीं। तो यह और भी है कि अगर ऑफसेट की गणना करने का कोई तरीका है, तो यह इस विशेष मामले में मेरे लिए एक तेज प्रक्रिया है। –

उत्तर

2

प्रदान किया गया कि myapp ने प्रतीकों को नहीं हटाया है, आप atos का उपयोग करने में सक्षम होंगे।

आप कर सकते हैं हमेशा man atos अधिक जानकारी के, लेकिन यह आपकी समस्या के लिए पर्याप्त होना चाहिए के लिए:

-o symbol_file # debugging information output by the compiler this may be a dSYM or the binary itself depending on who you saved symbol information 
-l load address # the base address in the process space at which your library is loaded into the springboard process (Looks like 0x1000) 
Also a list of addresses you wish to symbolicate 

Usage: 
    atos -o myapp -l 0x1000 0x00005b0a 0x0005bca ... etc 

कि उत्पादन टर्मिनल के लिए प्रतीक नामों की सूची में होना चाहिए। दोबारा, यह आवश्यक है कि myapp में प्रतीकों को अलग नहीं किया गया था।

+0

धन्यवाद - इसने केवल बाइनरी के साथ एक इलाज किया (जिसमें वास्तव में प्रतीकों को हटाया नहीं गया था)। –

4

क्रैश डंप में दिए गए सापेक्ष पते पर __TEXT सेगमेंट का वर्चुअल पता जोड़ें। परिणाम disassembly में देखने के लिए पता है। ये कदम उठाएँ:

  1. उपयोग otool -lv <application-binary> आवेदन द्विआधारी से लोड आदेशों डंप करने के लिए। __TEXT सेगमेंट के लिए लोड कमांड की तलाश करें और vmaddr के लिए संबंधित मान, आमतौर पर 0x1000। आपको __textअनुभाग के बारे में जानकारी की आवश्यकता नहीं है जो ऊपर दिखाया गया है, केवल सेगमेंट के बारे में जानकारी की आवश्यकता नहीं है।

  2. क्रैश डंप में, कॉल स्टैक में पते 0x00124ff4 0xf4000 + 200692 रूप में दिए गए हैं। अंतिम भाग बाइनरी के भीतर दशमलव में ऑफसेट है। इसे चरण 1 में प्राप्त मान में जोड़ें और हेक्साडेसिमल में कनवर्ट करें। इस उदाहरण में, हम 0x1000 + 200692 की गणना करेंगे जो हेक्स में 0x31ff4 है।

  3. आवेदन बाइनरी के लिए डिस्सेप्लर डंप करने के लिए otool -tV <application-binary> का उपयोग करें। इस उदाहरण में चरण 2 (0x31ff4) में प्राप्त पते का पता लगाएं। कॉल स्टैक के शीर्ष फ्रेम के लिए यह वह जगह है जहां एप्लिकेशन क्रैश हो गया। अन्य सभी स्तरों के लिए, गणना किए गए पते पर एक शाखा निर्देश होना चाहिए जो ढेर में अगले उच्च स्तर के अनुरूप है।