2012-03-21 10 views
6

मुझे अपने आप को लगभग किसी भी डिबगिंग टूल के बिना क्यूटी एप्लिकेशन को डीबग करने की कठिन स्थिति में मिलती है: एप्लिकेशन अधिक से अधिक CPU का उपयोग करना शुरू कर देता है क्योंकि यह बार-बार एक ही क्रिया चला रहा है; कई घंटों के बाद सीपीयू पूरी तरह से संतृप्त है।उपकरण डिबगिंग के बिना डीबगिंग तकनीक

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

क्या कुछ और है जो मैं यह जानने के लिए कर सकता हूं कि अधिक संसाधनों का उपभोग करते समय एप्लिकेशन क्या कर रहा है? किसी भी तरह से मुझे सभी विधि कॉल का पता लगाने के लिए आवेदन करना है? क्या कोई अन्य तकनीक है जिसका उपयोग मैं समस्या का अनुमान लगाने के लिए या मेरा ध्यान केंद्रित करने का प्रयास करने के लिए कर सकता हूं?

संपादित करें: यह gdb: Only question marks in backtrace reported by gdb on ARM के साथ समस्याओं में से एक है। यहां तक ​​कि एक सीजीएफॉल्ट परिणामों को अनुकरण करने वाली दस लाइनों के आवेदन को भी लिखना।

+0

क्या आपने रिमोट डीबगिंग की कोशिश की है? – manasij7479

+0

क्या आप valgrind चला सकते हैं? – WeaselFox

+0

जीडीबी के साथ रिमोट डीबगिंग? सफलता के बिना घंटों तक कोशिश की। वालग्रिंड में भी समस्याएं हैं। कोई भी इस उपकरण को ओम इस मंच पर काम करने में सक्षम नहीं था। यह भी मान लें कि सिस्टम libs सभी छीन रहे हैं। –

उत्तर

4

क्या आप मशीन पर कोर डंप सक्षम कर सकते हैं? फिर जब यह खेल रहा है, तो आप इसे एक सिगैबर्ट भेज सकते हैं और कोर डंप को अपनी देव मशीन पर कॉपी कर सकते हैं, और इसे क्रॉस-डीबगर के साथ जांच सकते हैं, स्रोत और अस्थिर निष्पादन योग्य उपलब्ध है।

अगली बार कड़वी सबक सीखना भी महत्वपूर्ण है, ऐसे बुरी तरह से समर्थित टूलचेन का उपयोग न करें।

यदि यह एक विकल्प है, तो यदि आप gdb समर्थन नहीं करते हैं तो आप कम से कम gdbserver के साथ एक और टूलचैन आज़मा सकते हैं। मैं CodeSourcery एआरएम लाइट टूलचेन से काफी खुश हूं।

संपादित करें: अपनी स्थिति के लिए gdb दो रूपों में आता है:

  • एक क्रॉस-gdb है कि अपने विकास मेजबान पर चलता है
  • एक देशी gdb कि अपने लक्ष्य पर चलता है

gdbserver की अनुमति देता है आप अपने क्रॉस-जीडीबी को अपने विकास होस्ट पर चलाने के लिए और उस पर चल रहे कुछ को दूरस्थ रूप से डीबग करने के लिए लक्ष्य से कनेक्ट करें। इसलिए कोर डंप या gdbserver लक्ष्य पर कुछ का निरीक्षण करने के लिए क्रॉस-जीडीबी का उपयोग करने के दो तरीके हैं, लेकिन अकेले gdbserver आपको बहुत मदद नहीं करेगा।

यदि आपका क्रॉस-कंपाइलर arm-none-linux-gnueabi-gcc जैसा कुछ है, तो देखें कि आपके पास अपने dev होस्ट पर arm-none-linux-gnueabi-gdb उपलब्ध है या नहीं।

+0

यह बहुत दिलचस्प है! लेकिन मुझे लगता है कि मुझे डंप पढ़ने के लिए जीडीबी चाहिए। मुझे नहीं लगता कि मेरे पास प्लेटफॉर्म के लिए जीडीबी उपलब्ध है, केवल रिमोट डीबगिंग के लिए gdbserver, जो कि सही तरीके से काम नहीं कर रहा है। क्या मैं इस उपकरण के साथ कोशिश कर सकता हूँ? –

+0

क्या यह कुछ असामान्य एआरएम डिवाइस है? यदि नहीं, तो आप स्रोतों से इसके लिए आसानी से जीडीबी बनाने में सक्षम होना चाहिए। – dbrank0

+0

यह एक अच्छी सलाह है। धन्यवाद! यह एक डिवाइस है जिसमें एम्बेडेड लिनक्स स्क्रैच से बनाया गया है। –

0

विभिन्न कार्यों के निष्पादन समय को लॉगिंग करने का प्रयास करें। सबसे पहले संभावित उम्मीदवारों के निष्पादन समय को लॉग करें और यदि आपने उन्हें समाप्त कर दिया है तो अपने कार्यक्रम में अन्य कम संभावित कार्यों के साथ जारी रखें।

संदेश लॉग करने का सबसे आसान तरीका std :: cout (या printf) का उपयोग करना है और फ़ाइल को रीडायरेक्ट करना है ताकि आप बाद में लॉग देख सकें।

3

आप अपने आवेदन में कुछ डिबगिंग कोड डालने का प्रयास कर सकते हैं।

कुछ संकेत चुनें, जैसे कि सिगिनट। इस सिग्नल के लिए सिग्नल हैंडलर जोड़ें। इस हैंडलर में स्टैक ट्रेस या कम से कम निर्देश सूचक मूल्य मुद्रित करें। फिर एप्लिकेशन शुरू करें और यह देखने के लिए कि आपका एप्लिकेशन क्या कर रहा है, कई बार SIGINT भेजें।

+0

हां, मैंने पहले ही यह कोशिश की है। लेकिन जीडीबी की तरह ऐसा लगता है कि मेरे पास बैकट्रैस में फ़ंक्शंस का नाम नहीं हो सकता है, जो बैकट्रैक बेकार बनाता है। लगता है कि backtrace_symbols स्ट्रिंग में पॉइंटर से मिलान करने में असमर्थ हैं, भले ही प्रतीकों मेरी बाइनरी में हों। –

+0

आप हमेशा निर्देश सूचक मुद्रित कर सकते हैं। और फिर इसे मानचित्र फ़ाइल में ढूंढें। –

+0

मैंने इसे नमूना कोड पर करने की कोशिश की और गतिशील के साथ प्रतीकों का निर्यात करते समय काम करना प्रतीत होता है! समस्या यह है कि एप्लिकेशन में किसी अज्ञात कारण के लिए मैं विश्लेषण कर रहा हूं कि मैं सिगिनट नहीं पकड़ सकता। –

0

आप Zoom प्रोफाइलर के एआरएम संस्करण को चलाने का प्रयास कर सकते हैं - यह आपको बताएगा कि आपका कोड अधिकतर समय कहां खर्च कर रहा है - आप इसे 30 दिन के मूल्यांकन लाइसेंस पर मुफ्त में डाउनलोड कर सकते हैं।

0

मान लीजिए कि जीसीसी में एमएसवीसी फ़ाइल और लाइन मैक्रोज़ की तरह कुछ है, जो वर्तमान फ़ाइल और वर्तमान लाइन में विस्तारित है, आप अपना खुद का छद्म-प्रोफाइलिंग फ़ंक्शन बना सकते हैं। एक शीर्ष लेख में इस रखो:

void MyPseudoProfileLog(const char* file, int line, int* count); 
#define MY_PSEUDO_PROFILE_LOG(file, line) { static int count = 0; MyPseudoProfileLog(file, line, &count); } 

यह एक cpp फ़ाइल में चला जाता है (यदि आप इसे शीर्ष लेख में डाल आप स्थिर चर की कई प्रतियां मिल जाएगा, प्रत्येक cpp फ़ाइल के लिए एक तुम में शीर्ष लेख शामिल):

void MyPseudoProfileLog(const char* file, int line, int* count) 
{ 
    static FILE* f = NULL; 
    const int max_count = 1000; 
    if (++(*count) == max_count) 
    { 
     *count = 0; 
     if (!f) 
      f = fopen("/tmp/my_pseudo_profile_log.log"); 
     fprintf(f, "file=\"%s\", line=%d was passed %d times\n", file, line, max_count); 
     fflush(f); 
    } 
} 

तो फिर आप अपने कोड में

MY_PSEUDO_PROFILE_LOG(__FILE__, __LINE__); 
विभिन्न स्थानों पर

पेस्ट करके देखें कि वे कितनी बार कहा जाता है हो सकता है। ध्यान रखें कि यह थ्रेड-सुरक्षित नहीं है इसलिए केवल मुख्य धागे में उपयोग करें।

+0

लॉग लाइनों को रखना मैं हां कर रहा हूं, समस्या यह है कि विभिन्न पुस्तकालयों में सैकड़ों विधि कॉल हैं। CPU को लोड करने में ढूंढने में सप्ताह लग सकते हैं। –