2012-06-20 14 views
6

मैं हाल ही में एक आईओएस ऐप के क्रैश लॉग का प्रतीक करने की कोशिश कर रहा हूं। किसी कारण से डीएसवाईएम के यूयूआईडी को स्पॉटलाइट में अनुक्रमित नहीं किया गया था। कुछ मैन्युअल खोज और कमांड लाइन incantations की एक स्वस्थ खुराक के बाद, मैं आंशिक रूप से क्रैश लॉग का प्रतीक करने में कामयाब रहे।क्या सी ++ कोड का प्रतीक होना संभव है?

पहले मैंने सोचा कि डीएसवाईएम अधूरा हो सकता है या ऐसा कुछ हो सकता है, लेकिन तब मुझे एहसास हुआ कि विधि गायब होने वाली विधि सी ++ कोड में होती है: यह प्रोजेक्ट एक उद्देश्य-सी ऐप है जो सी ++ पुस्तकालयों में कॉल करता है उद्देश्य-सी ++) जो उद्देश्य-सी कोड पर वापस कॉल करें (फिर से, उद्देश्य-सी ++ कोड के माध्यम से)। जिन कॉलों को मैं याद कर रहा हूं वे हैं, विशेष रूप से, जो सी ++ भूमि में होते हैं।

तो, मेरा सवाल यह है: क्या कोई तरीका है कि प्रतीकात्मक प्रक्रिया सी ++ कोड की फ़ंक्शन कॉल को हल कर सकती है? यदि कोई है, तो मुझे कौन से विशेष विकल्प सेट करने की ज़रूरत है?

+0

क्या यह केवल पते छोड़ देता है या यह आपको _ZN7 जैसा कुछ देता है ...? – C0deH4cker

+0

नहीं, यदि आप इसका उल्लेख करते हैं तो वे नामित फ़ंक्शंस नाम नहीं हैं। 14 MyApp \t 0x001001bc 0xfe000 + 8636 15 MyApp \t 0x00100174 0xfe000 + 8564 –

+0

अगर आप 'अपने अनुप्रयोग lldb', आप अपने सी ++ नाम से किसी भी विधि का एकत्रित न कर सकते हैं: यह एक आधार का पता और एक ऑफसेट है? क्या आपके पास स्थिर लाइब्रेरी बाइनरी है या क्या आप अपनी परियोजना में सबकुछ संकलित कर रहे हैं? – nielsbot

उत्तर

0

सेब एसडीके के साथ आता है एक उपयोगी कार्यक्रम atos (प्रतीक के लिए पता) है। असल में, यहाँ क्या आप क्या करना चाहते है:

atos -o myExecutable -arch armv7 0x(address here) 

यह उस पते पर प्रतीक के नाम प्रिंट आउट करना चाहिए।

+0

यह ओबीजेसी के लिए काम करता है। सी ++ के लिए, मुझे कुछ मिलता है: 0x00261588 (MyApp में) + 465932 –

+0

लटकाओ, जीडीबी के साथ ऐसा करने का एक तरीका है ... – C0deH4cker

+0

धन्यवाद, लेकिन मैं एलएलवीएम का उपयोग कर रहा हूं हालांकि –

0

मैं उद्देश्य-सी में अच्छी तरह से नहीं जानता हूं, लेकिन मैं यह सुनिश्चित करता हूं कि सी ++ कोड प्रतीकों के साथ संकलित किया जा रहा है। विशेष रूप से, क्या आपने सी ++ कोड संकलित करते समय-गतिशील और/या -g शामिल करना सुनिश्चित किया था?

+0

है जो जीसीसी के लिए झंडे की तरह दिखते हैं। क्या आप जानते हैं कि एलएलवीएम में इसे कैसे पूरा किया जाए? –

+1

ऐप्पल जीएलसी और क्लैंग के लिए बैकएंड के रूप में एलएलवीएम का उपयोग करता है। क्लैंग मूल रूप से जीसीसी के रूप में एक ही झंडे लेता है। सुनिश्चित करें कि आपका सभी कोड डीबग स्तर से 3 तक चालू है। '-g3' का उपयोग करें। आप ऑप्टिमाइज़ेशन को अक्षम भी कर सकते हैं ('-O0')। – sfstewman

+0

@ एसएफस्टवेमैन ऑप्टिमाइज़ेशन स्तर के पास कुछ भी नहीं है -एएफआईआईआईके- एक दुर्घटना के बाद प्रतीकात्मकता के साथ, जो अलग हो रहा है। क्लैंग में कोई '-g3' नहीं है, केवल' -g' –

0

कोशिश dwarfdump --lookup = 0xYOUR_ADRESS YOUR_DSYM_FILE

आप प्रत्येक पता मैन्युअल रूप को देखने के (या ऐसा करने के लिए एक पटकथा लिखने के), लेकिन अगर प्रतीकों ठीक कर रहे हैं (अपने dSym फ़ाइल बड़ा है करना होगा 20 एमबी कहने से) यह काम करेगा।