2008-09-17 13 views
24

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

मैं इस कोर डंप का विश्लेषण gdb में करना चाहता हूं।

उदाहरण के लिए:

gdb path/to/executable path/to/corefile 

मेरे पुस्तकालयों वर्तमान निर्देशिका में हैं।

अतीत में मैंने डीबगर्स को "-p" विकल्प प्रदान करके इसे कार्यान्वित किया है। या "-पी/=।"; तो मेरा सवाल है:

मैं कैसे निर्दिष्ट कर सकता हूं कि पुस्तकालयों को जीडीबी में कोरफाइल का विश्लेषण करते समय मेरी वर्तमान निर्देशिका के सापेक्ष पथ से पहले लोड किया जा सकता है?

उत्तर

39

प्रारंभ gdb निष्पादन या कोर फ़ाइल निर्दिष्ट किए बिना फिर निम्नलिखित टाइप करें कमांड:

set solib-absolute-prefix ./usr 
file path/to/executable 
core-file path/to/corefile 

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

आप दूरदराज के एक सर्वर एक ही वास्तुकला और अपने मेजबान के रूप में लिनक्स/glibc संस्करण है कि डीबग कर रहे हैं, तो आप के रूप में fd सुझाव कर सकते हैं:

set solib-search-path <path> 

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

+0

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

+0

धन्यवाद, उसने वास्तव में मेरी मदद की! –

+0

मेरे मामले में निष्पादन योग्य और इसकी पुस्तकालय एक एनएफएस-घुड़सवार पेड़ में थे और जिस मेजबान से मैं डीबग करना चाहता था वह एनएफएस सर्वर था, इसलिए मैंने पेड़ में एक सिम्लिंक लगाया ताकि solib-absolute-prefix nfs-share-tree था सटीक समाधान। मुझे आशा है कि इससे भविष्य की पीढ़ियों में मदद मिलेगी। –

3

मैं developer.apple.com

set solib-search-path path 

इस चर सेट है, तो यह अंश पाया, पथ साझा पुस्तकालयों के लिए खोज करने के लिए निर्देशिका का एक पेट के अलग की गई सूची है। solib-search-path' is used after solib-absolute-prefix ' में विफल रहता है लाइब्रेरी का पता लगाएं, या का पथ पूर्ण के बजाय लाइब्रेरी सापेक्ष है। आप solib-search-path' instead of solib-निरपेक्ष-उपसर्ग उपयोग करना चाहते हैं एक nonexistant निर्देशिका में अपनी मेजबान के पुस्तकालयों खोजने से GDB को रोकने के लिए ', सेट `solib-निरपेक्ष-उपसर्ग के लिए सुनिश्चित हो'।

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

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

4

मुझे यकीन नहीं है कि यह जीडीबी के भीतर बिल्कुल संभव है लेकिन फिर मैं कोई विशेषज्ञ नहीं हूं।

हालांकि मैं लिनक्स गतिशील लिंकर पर टिप्पणी कर सकता हूं। निम्नलिखित सभी हल किए गए साझा पुस्तकालयों और अनसुलझे लोगों के पथ को मुद्रित करना चाहिए।

ldd path/to/executable 

हमें यह जानना होगा कि आपके साझा पुस्तकालयों को आपके निष्पादन योग्य से कैसे जोड़ा गया था।

readelf -d path/to/executable | grep RPATH 
  • चाहिए आदेश प्रिंट कुछ भी नहीं, गतिशील लिंकर मानक स्थानों प्लस LD_LIBRARY_PATH वातावरण चर साझा पुस्तकालयों को खोजने के लिए उपयोग करेगा: ऐसा करने के लिए, निम्न आदेश का उपयोग।

  • यदि आदेश कुछ पंक्तियों को प्रिंट करता है, तो गतिशील लिंकर LD_LIBRARY_PATH को अनदेखा कर देगा और इसके बजाय हार्डकोडेड rpaths का उपयोग करेगा।

    यदि सूचीबद्ध आरपीएथ पूर्ण हैं, तो मुझे पता है कि एकमात्र समाधान सूचीबद्ध पुस्तकालयों को आपके पुस्तकालयों की प्रतिलिपि बनाना (या सिमलिंक) करना है।

    यदि सूचीबद्ध आरपीएथ रिश्तेदार हैं, तो उनमें एक $ ORIGIN होगा जो निष्पादन योग्य के मार्ग से रन टाइम पर प्रतिस्थापित किया जाएगा। मिलान करने के लिए निष्पादन योग्य या पुस्तकालयों को ले जाएं।

आगे जानकारियां के लिए, आप शुरू कर सकता है के साथ:

man ld.so 
+0

धन्यवाद, यह सभी उपयोगी जानकारी है। –

+0

बहुत उपयोगी जानकारी। जीडीबी से संबंधित नहीं है लेकिन एलडी पथ खोजने के मेरे मामले से बहुत संबंधित –

0

एक महत्वपूर्ण नोट:

आप एक क्रॉस संकलन कर रही है और फिर बाद gdb के साथ डिबग करने के लिए, कोशिश कर रहे हैं यदि आप smth देखते हैं तो आपने
file ECECUTABLE_NAME किया है। जैसे:

Using host libthread_db library "/lib/libthread_db.so.1" 

फिर जांचें कि क्या आपके पास अपने लक्षित सिस्टम के लिए libthread_db है। मुझे वेब पर बहुत सी समस्याएं मिलीं। इस तरह की समस्या को "सेट सॉलिब-" का उपयोग करके हल नहीं किया जा सकता है, आपको अपने क्रॉस-कंपाइलर का उपयोग करके libthread_db भी बनाना होगा।

2

जीडीबी का आविष्कार करते समय आप प्रत्येक पुस्तकालय या एलडी_LIBRARY_PATH को वर्तमान निर्देशिका में एलडी_PRELOAD भी सेट कर सकते हैं। इससे केवल समस्याएं पैदा होंगी यदि gdb स्वयं आपके द्वारा प्रीलोड किए जाने वाले किसी भी पुस्तकालय का उपयोग करने का प्रयास करता है।

+0

कमांड एलडी_LIBRARY_PATH = "।" gdb execableName.bin ठीक काम किया। धन्यवाद। – user2431763