2009-08-26 6 views
7

मैं समझने की कोशिश कर रहा हूं कि एक निश्चित लाइब्रेरी कैसे काम करती है। मैंने इसे अपने अतिरिक्त प्रिफेट के साथ संकलित किया है और सबकुछ बढ़िया है। अब मैं कॉल स्टैक को देखने के लिए रनटाइम के दौरान उदाहरण प्रोग्राम को रोकना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि जीडीबी के साथ इसे कैसे किया जाए। जिस समारोह को मैं तोड़ना चाहता हूं, साझा लाइब्रेरी के अंदर है। मैंने एसओ पर यहां previous question की समीक्षा की है, लेकिन दृष्टिकोण मेरे लिए काम नहीं करता है। प्रश्न में भाषा सी ++ है। मैंने फ़ाइल नाम और लाइन नंबर प्रदान करने का प्रयास किया है, लेकिन जीडीबी यह समझने से इंकार कर देता है कि यह केवल डेमो ऐप से स्रोत फ़ाइलों को सूचीबद्ध करता है।रनटाइम के दौरान साझा लाइब्रेरी के अंदर डिबगिंग/ट्रेसिंग?

कोई सुझाव?

उत्तर

4

आप पहले "ब्रेक मुख्य" कर सकते हैं। जब तक आप इसे हिट करते हैं, साझा लाइब्रेरी लोड की जानी चाहिए, और फिर आप इसके किसी भी दिनचर्या में ब्रेकपॉइंट सेट कर सकते हैं।

+1

हाँ (हालांकि मैं विवरण अपने आप व्याख्या नहीं कर सकते हैं), लेकिन यकीन है कि आप कि संकलित हो पुस्तकालय के साथ पुस्तकालय, और अनुकूलन के साथ बंद कर दिया! – Alex

+0

दुर्भाग्य से इससे मदद नहीं मिली। समारोह अभी भी मुख्य से दिखाई नहीं दे रहा है। निष्पादन को रोकने और डीबगर में ड्रॉप करने के कारण, क्या मैं कोड में कुछ भी जोड़ सकता हूं? – EightyEight

+0

@EightyEight: हम्म, यह मेरे लिए काम करता है। क्या लाइब्रेरी आप डीप्पन() के माध्यम से शायद गतिशील रूप से लोड डीबग करने की कोशिश कर रहे हैं? यह समझा सकता है कि यह अभी भी मुख्य में क्यों दिखाई नहीं दे रहा है। यदि ऐसा है, तो आप लक्ष्य लाइब्रेरी के लिए डलोपेन कॉल के बाद अपना प्रारंभिक ब्रेकपॉइंट सेट कर सकते हैं, फिर अंतिम ब्रेकपॉइंट सेट करें। ऐसा लगता है कि एक आसान तरीका होना चाहिए; मैं देख रहा हूँ। –

3

विचार करने के लिए (और अपने प्रश्न आपके पास यह स्पष्ट जिस स्थिति नहीं है) दो मामलों हैं:
- अपने निष्पादन सीधे साझा लाइब्रेरी के साथ जुड़ा हुआ है:
इसका मतलब है कि GDB "देख" होगा प्रतीक (और स्रोतों) साझा लाइब्रेरी से जब आप मुख्य
पर रोक - अपने निष्पादन योग्य गतिशील साझा लाइब्रेरी लोड करता है (उदाहरण के लिए के माध्यम से dlopen): dlopen पूर्ण होने के बाद जब तक
उस स्थिति में, GDB नहीं "देख" होगा आपकी साझा लाइब्रेरी।

चूंकि आप मुख्य रूप से रुकते समय प्रतीकों को नहीं देख पा रहे हैं, तो मुझे लगता है कि आपके पास दूसरा मामला है। आप "set stop-on-solib-events 1"(gdb) प्रॉम्प्ट पर कर सकते हैं, और GDB हर बार एक नई साझा लाइब्रेरी लोड (या अनलोडेड) बंद हो जाएगी।

आप देख सकते हैं कि info shared कमांड के माध्यम से कौन सी लाइब्रेरी "जानता है"।
बस उस सूची में अपनी लक्षित लाइब्रेरी देखने तक प्रतीक्षा करें, इसमें ब्रेकपॉइंट्स सेट करने का प्रयास करने से पहले।

+0

यह समाधान ओरेकल के SQLPlus क्लाइंट ऐप को डीबग करते समय काम नहीं करेगा –

1

चेक इस बाहर:

http://linux.die.net/man/1/ltrace

यह अपने पुस्तकालय कॉल का पता लगाने जाएगा - शायद उपयोगी हो।

और "स्ट्रेस" सिस्टम कॉल के लिए एक ही चीज़ करता है।

और उसके साथ आपको एक प्रवेश बिंदु को खोजने के लिए सक्षम होना चाहिए ... आप GDB में कि जिस तरह से एक ब्रेकपाइंट सेट कर सकते हैं

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