2012-09-07 17 views
7

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

  • मैं

  • Google Breakpad जब मैं लक्ष्य पर एक मल्टी-थ्रेडेड एप्लिकेशन को चलाने के क्रैश रिपोर्ट बनाने के लिए विफल रहता है मेरे लक्ष्य पर मल्टी-थ्रेडेड अनुप्रयोगों चला सकते हैं:

    मैं तथ्यों सूची जाएगा । जब मैं इसे अपने मेजबान पर चलाता हूं तो ब्रेकपैड पुस्तकालयों के सटीक उसी निर्माण के साथ सटीक वही एप्लिकेशन सफल होगा।

  • जीडीबी मेरे लक्ष्य पर बहुप्रचारित अनुप्रयोगों को डीबग करने में विफल रहता है।

उदा।

$./gdb -n -ex "thread apply all backtrace" ./a.out --pid 716 

dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs 
GDB will not be able to debug pthreads. 
GNU gdb 6.8 

मैं ps_lgetfpregs नहीं लगता कि this की वजह से एक समस्या है।

  • मेरे crosstool निर्माण libthread_db.so फ़ाइल बनाई है और मैं इसे लक्ष्य पर डाल दिया।

  • मेरे क्रॉसस्टूल बिल्ड ने मेरे लक्ष्य के लिए जीडीबी बनाया है, इसलिए इसे उसी पुस्तकालयों के खिलाफ जोड़ा जाना चाहिए था जो मैं लक्ष्य पर चलाता हूं।

  • यदि मैं अपने मेजबान ऐप के खिलाफ अपने मेजबान पर gdb चलाता हूं, तो मुझे प्रत्येक चल रहे थ्रेड का बैकट्रैक मिलता है।

मुझे संदेह है कि ब्रेकपैड के साथ समस्या जीडीबी के साथ समस्या से संबंधित है, लेकिन मैं इसे साबित नहीं कर सकता। एकमात्र समानता बहुप्रचारित डीबग की कमी है।

मेरे मेजबान और लक्ष्य के बीच कुछ महत्वपूर्ण अंतर है जो मुझे लक्ष्य पर pthreads डीबग करने में सक्षम होने से रोकता है।

क्या किसी को पता है कि यह क्या है?

संपादित करें:

Denys Dmytriyenko टीआई से कहते हैं:

आम तौर पर, GDB बहुत picky नहीं है और आप मिश्रण और gdb और gdbserver के विभिन्न संस्करणों से मेल कर सकते हैं। लेकिन, दुर्भाग्य से, अगर आप डिबग मल्टी-थ्रेडेड क्षुधा की जरूरत है, वहाँ विशिष्ट एपीआई के लिए कुछ निर्भरता ...

उदाहरण के लिए, इस संदेशों में से एक अगर तुम निर्माण GDB नहीं था जैसा कि आप देख सकते हैं कर रहे हैं धागा समर्थन के लिए ठीक से:

dlopen 'libthread_db.so.1' पर विफल - /lib/libthread_db.so.1: अपरिभाषित प्रतीक: ps_lgetfpregs GDB pthreads डिबग करने में सक्षम नहीं होगा।

ध्यान दें कि यह त्रुटि मुझे मिलती है जैसा कि मुझे मिलता है लेकिन वह जीडीबी को "ठीक से" बनाने के तरीके के बारे में विस्तार से नहीं जाता है।

और GDB FAQ का कहना है:

(क्यू) GDB वह है जिसमें दुर्घटना हुई अलावा किसी सूत्र नहीं देखता; या सिगट्रैप मेरे प्रोग्राम को मारता है जब मैं ब्रेकपॉइंट सेट करता हूं।

(ए) यह अक्सर लिनक्स पर होता है, खासकर एम्बेडेड लक्ष्यों पर। दो आम कारण हैं:

  • आप glibc का उपयोग कर रहे हैं, और आप libpthread.so.0 libpthread.so.0 और libthread_db.so.1

के बीच

  • बेमेल छीन लिया है

    GDB ही डिकोड करने के लिए कैसे "धागा नियंत्रण ब्लॉक" glibc और glibc निजी कार्यान्वयन विस्तार माना जाता द्वारा बनाए रखा नहीं जानता है। यह ऐसा करने में सहायता के लिए libthread_db.so.1 (glibc का हिस्सा) का उपयोग करता है। इसलिए, libthread_db.so.1 और libpthread.so.0 संस्करण और संकलन झंडे से मेल खाना चाहिए। इसके अलावा, libthread_db.so.1 को कुछ गैर-वैश्विक प्रतीक libpthread.so.0 में मौजूद होने की आवश्यकता है।

    समाधान: स्ट्रिप - स्ट्रिप-डीबग libpthread.so.0 स्ट्रिप libpthread.so.0 के बजाय उपयोग करें।

  • मैंने एक गैर-छीन लिया libpthread.so.0 की कोशिश की लेकिन इससे कोई फर्क नहीं पड़ता। मैं pthread और thread_db के बीच किसी भी विसंगति की जांच करूंगा।

    +0

    क्या आप एक ही समय में फ्लेमिंग स्केट्स को जॉगलिंग कर रहे हैं? आप निश्चित रूप से चीजों को अपने लिए आसान बनाना पसंद नहीं करते हैं। –

    +0

    हाहाहा, हाँ। एम्बेडेड लिनक्स में आपका स्वागत है जहां कुछ भी आगे नहीं है और आपको कुछ भी पता होना चाहिए (लेकिन वास्तव में सक्षम होने के लिए पर्याप्त नहीं)। –

    +0

    पता चला है कि बिल्डिंग विकल्प के साथ gdb बिल्डिंग नकारात्मक-नकारात्मक विकल्प जो स्थिर gdb में प्रतीकों को ढूंढने से thread_db रोकता है। इस प्रकार त्रुटि "अपरिभाषित प्रतीक: ps_lgetfpregs" –

    उत्तर

    2

    यह:

    dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs 
    GDB will not be able to debug pthreads. 
    

    मतलब यह है कि libthread_db.so.1 पुस्तकालय gdb में प्रतीक ps_lgetfpregs को खोजने के लिए सक्षम नहीं था।

    क्यों?

    क्योंकि मैंने "स्थैतिक देशी जीडीबी बनाएं" विकल्प के साथ क्रॉसस्टूल-एनजी का उपयोग करके जीडीबी बनाया है और यह -static विकल्प जीसीसी में जोड़ता है।

    देशी जीडीबी -rdynamic विकल्प के साथ बनाया गया है और यह सभी प्रतीकों, यहां तक ​​कि अप्रयुक्त लोगों के साथ ईएलएफ फ़ाइल में .dynsym प्रतीक तालिका को पॉप्युलेट करता है। libread_db gdb से ps_lgetfpregs खोजने के लिए इस प्रतीक तालिका का उपयोग करता है।

    लेकिन -static ईएलएफ फ़ाइल से .dynsym तालिका स्ट्रिप्स करता है।

    1. एक स्थिर देशी gdb का निर्माण न करें यदि आप धागे डिबग करने के लिए करना चाहते हैं:

      इस बिंदु पर दो विकल्प हैं।

    2. एक स्थिर gdb और एक स्थिर libthread_db (नहीं परीक्षण किया)

    संपादित बिल्ड:

    वैसे, ऐसा क्यों असमर्थ में Breakpad मेरे लक्ष्य पर बहु ​​अनुप्रयोगों डिबग करने के लिए की व्याख्या नहीं करता।

    0

    बस एक हालांकि ... जीडीबी डीबगर का उपयोग करने के लिए, आपको अपने कोड को -g विकल्प के साथ संकलित करने की आवश्यकता है। उदाहरण के लिए, जीसीसी-जी-सी *। सी।