2009-12-01 10 views
5

पर हल्के डिबगिंग मैं एक छोटा सा लिनक्स आधारित एसबीसी (~ 32 एमबी रैम) पर चल रहा एक एप्लीकेशन विकसित कर रहा हूं। अफसोस की बात है, मेरा ऐप हाल ही में जीडीबी के तहत चलाने के लिए बहुत बड़ा हो गया। क्या किसी को किसी भी अच्छे, हल्के डिबगिंग विधियों के बारे में पता है जिसे मैं एम्बेडेड लिनक्स में उपयोग कर सकता हूं? यहां तक ​​कि थ्रेड के स्टैक ट्रेस को देखने में भी सक्षम होना बेहद सहायक होगा।एम्बेडेड लिनक्स

मुझे यह उल्लेख करना चाहिए कि यह एप्लिकेशन सी ++ में लिखा गया है और कई धागे चलाता है, इसलिए gdbserver एक नो-गो है क्योंकि यह मल्टीथ्रेड किए गए ऐप्स के साथ काम नहीं करता है।

अग्रिम धन्यवाद,

महा

+1

क्या आप वाकई gdbserver बहु क्षुधा के लिए काम नहीं करता है? यह पृष्ठ सुझाव देता है कि यह काम करता है: http://www.kegel.com/linux/gdbserver.html। –

उत्तर

4

gdbserver निश्चित रूप से बहु-थ्रेडेड अनुप्रयोगों के साथ काम करता है, मैं अभी 25 एम्बेडेड के साथ एम्बेडेड प्रोजेक्ट पर काम कर रहा हूं और हम हर समय gdbserver का उपयोग करते हैं ।

info threads 

सूचियों प्रणाली निष्पादन की कि धागा करने के लिए

thread <thread number from info threads> 

स्विच में सभी धागे।

thread apply XXX <command> 

XXX द्वारा निर्दिष्ट थ्रेड पर चलता है, जो 'सब' भी हो सकता है। तो अगर आप से चल रहे सभी धागे वापस ट्रेस चाहते

thread apply all bt 

कर एक बार जब आप किसी दिए गए सूत्र अपने सभी ठेठ आदेशों के रूप में वे एक भी लड़ी प्रक्रिया में होगा काम के निष्पादन के प्रवाह में हैं।

+0

क्या आपको विशेष तर्कों के साथ gdb/gdbserver चलाने की ज़रूरत है? मैं एक एआरएम प्रोसेसर पर चल रहा हूँ। जब मैं 'gdbserver localhost: 12345 myapp' चलाता हूं और फिर अपने होस्ट पर gdb का वही संस्करण चलाता हूं और 'target remote 10.0.150.92:12345' कमांड दर्ज करता है, तो डीबगर भ्रमित हो जाता है क्योंकि ऐसा लगता है कि केवल एक थ्रेड चल रहा है (ब्रेक प्रत्येक संदर्भ स्विच, और 'जानकारी धागे' रिपोर्ट केवल 1 चल रहे थ्रेड)। – Maha

+0

जब मैं डीबग करता हूं तो मुझे विशेष तर्कों के साथ भागना नहीं पड़ता है, हमारी परियोजना एआरएम पर भी है। डिबगिंग के लिए मेरी प्रक्रिया दूरस्थ रूप से आपके जैसा ही लगता है। लक्ष्य पर: gdbserver स्थानीय होस्ट: 10000 MyApp मेजबान पर: arm_v5t-le-gdb MyApp मेजबान gdb कमांड लाइन पर: दूरस्थ को लक्ष्य: gdb के समान संस्करण करके आप हाथ सही निर्माण मतलब है? क्या कोई कारण है कि आपके ऐप को सिग्नलआर 1/2 या संदर्भ स्विच के दौरान कुछ सिग्नल मिलेंगे? इससे डीबगर बंद हो जाएगा। लक्ष्य और मेजबान दोनों पर आवेदन डीबग प्रतीकों के साथ बनाया जाना चाहिए, हम इसके लिए मेजबान माउंट माउंट करते हैं। – asm

+0

मेरी मेजबान मशीन एक x86 प्रणाली है, और लक्ष्य प्रणाली एक एआरएम प्रोसेसर चलाती है। क्या आपका होस्ट एआरएम सिस्टम भी है? यदि नहीं, तो शायद मुझे अपने जीडीबी बिल्ड में कुछ याद आया (मैंने एआरएम के लिए जीडीबी 7.0 बनाया, फिर इसे x86 के लिए अलग से बनाया)। मेरा ऐप निश्चित रूप से SIGUSR1/2 उत्पन्न नहीं कर रहा है - मैंने सत्यापित किया है कि यह संदर्भ स्विच पर तोड़ रहा है क्योंकि डीबगर सोचता है कि केवल एक थ्रेड चल रहा है। – Maha

2

मैं उस पर QEMU की तरह एक एमुलेटर में आवेदन चल रहा है और उसके बाद GDB चल तरह हैक्स कर लोगों (या valgrind तरह बातें) के बारे में सुना है। यह दर्दनाक लगता है, लेकिन अगर यह काम करता है ....

क्या आप libunwind (स्टैक निशान पाने के लिए) और printf-style लॉगिंग के साथ कहीं भी मिलेंगे?

+0

पॉइंटर्स के लिए धन्यवाद।मैंने एक एमुलेटर के नीचे दौड़ने को देखा, लेकिन यह निश्चित रूप से जाने का एक दर्दनाक तरीका है और शायद मैं खर्च करने से ज्यादा समय खाऊंगा। मैं अभी प्रिंटफ-स्टाइल लॉगिंग कर रहा हूं, लेकिन यह एक काफी जटिल एप्लीकेशन है और यह कभी-कभी यह पता लगाने में मुश्किल होता है कि कौन सा घटक पहली जगह में समस्या पैदा कर रहा है। Libunwind निश्चित रूप से एक सहायक उपकरण की तरह दिखता है, मैं इसे एक शॉट दे दूँगा। – Maha

1

सीरियल पोर्ट मुद्रण सबसे हल्के वजन मैं ~~~ के बारे में सोच सकते हैं आसानी से एक होस्ट पीसी में देखा, और अपने अनुप्रयोग ~~

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

0

क्या कोई कारण है कि आपने अपना खुद का डीबगर बनाया है? मैं एक एआरएम प्रोसेसर (AT91SAM926x) का उपयोग कर एक लिनक्स सिस्टम विकसित कर रहा हूं और हम कोडसोर्सरी से कंपाइलर और डीबगर दोनों का उपयोग कर रहे हैं। मुझे नहीं लगता कि उन्होंने अभी तक जीडीबी 7 के साथ एक संस्करण जारी किया है, लेकिन मैं बिना किसी समस्या के gdbserver उपकरण का उपयोग कर multithreaded C++ अनुप्रयोगों को डीबग कर रहा हूं।

+0

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

+2

एक चीज जिसे आप कोशिश कर सकते हैं वह जीडीबी का पुराना संस्करण बनाना है। जीडीबी 7 बहुत नया है और मैंने प्रमुख बग की कुछ रिपोर्टें पढ़ी हैं (हालांकि एआरएम संबंधित नहीं है)। हम संस्करण 6.7 चला रहे हैं। –

0

Gdbserver वास्तव में बहुप्रचारित अनुप्रयोगों के साथ काम करता है। हालांकि आपको अपने मेजबान जीडीबी के साथ काम करने के लिए अपने मेजबान के लिए एक क्रॉस लक्ष्य डीबगर संकलित करने की आवश्यकता है।

इसे कैसे करना का विस्तृत विवरण के लिए यह लेख देखें:

Remote cross-target debugging with GDB and GDBserver

+0

लिंक के लिए धन्यवाद। मैंने वहां निर्देशों का पालन किया लेकिन उन्होंने मेरे लिए काम नहीं किया। अपनी विधि के साथ हाथ-मूल बाइनरी बनाने में असफल रहा - मर गया, शिकायत कर रहा है कि सी कंपाइलर निष्पादन योग्य नहीं बना सकता है। मुझे नहीं पता कि यह ऐसा क्यों करता है, क्योंकि जीडीबी की बिल्ड प्रक्रिया आमतौर पर इतनी स्मार्ट होती है कि निष्पादन योग्य परीक्षण न करने के लिए यह क्रॉस-कंपाइलिंग के दौरान उत्पन्न होता है। – Maha

संबंधित मुद्दे