2010-12-08 18 views
8

मैं जीडीबी का उपयोग कर लिनक्स 2.6 पर चल रही एक प्रक्रिया को डीबग करना चाहता हूं। attach PID (जहां पीआईडी ​​प्रक्रिया आईडी है), print main, print sin, print gzopen और print dlopen कार्य (यानी वे संबंधित प्रतीकों को ढूंढते हैं)। लेकिन print myfoo काम नहीं करता है, जहां myfoo का उपयोग कर .so फ़ाइल से प्रक्रिया द्वारा लोड किया गया एक फ़ंक्शन है। यहाँ है कि मैं क्या मिलता है:dlopen के साथ लोड किए गए साझा पुस्तकालयों में gdb प्रिंट प्रतीक कैसे बनाएं?

(gdb) print main 
$3 = {int (int, char **)} 0x805ba90 <main> 
(gdb) print sin 
$4 = {<text variable, no debug info>} 0xb77<sin> 
(gdb) print gzopen 
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen> 
(gdb) print dlopen 
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck> 
(gdb) print myfoo 
No symbol "myfoo" in current context. 

मैं कैसे GDB myfoo खोजने के लिए मिलता है?

फ़ंक्शन myfoo वास्तव में मौजूद है, क्योंकि प्रोग्राम में मैंने dlsym (dlopen के बाद) का उपयोग करके अपना पता प्राप्त करने में कामयाब रहा, और मैं इसे कॉल करने में कामयाब रहा। उसके बाद ही मैंने प्रक्रिया में जीडीबी लगाया।

यह पता चला कि mydir/mylib.so: No such file or directory त्रुटि संदेश attach $PID जीडीबी के कमांड द्वारा मुद्रित त्रुटि संदेश था। स्पष्ट रूप से गलत निर्देशिका में जीडीबी शुरू किया गया था। जीडीबी शुरू करने से पहले उचित cd करने से समस्या ठीक हो गई, और print myfoo काम करना शुरू कर दिया।

मैं इसे स्वचालित करना चाहता हूं: मैं चाहता हूं कि जीडीबी पता लगाए कि मेरी .so फ़ाइलें (dlopen के साथ लोड) हैं। एक अनुमान जो मैं सोच सकता हूं /proc/$PID/maps (लिनक्स पर) की जांच कर रहा है, संभावित निर्देशिका ढूंढ रहा है, और जीडीबी शुरू करने से पहले उन्हें सभी को जीडीबी लाइब्रेरी सर्च पथ में जोड़ना है। LD_LIBRARY_PATH का विस्तार करना और set solib-search-path /tmp/parent करना काम नहीं किया (ls -l /tmp/parent/mydir/myfoo.so काम करता है), जीडीबी ने अभी भी No such file or directory की सूचना दी है। मैं जीडीबी को कैसे कहूं mydir/myfoo.so के लिए कहां देखना है?

मेरा दूसरा प्रश्न है कि मैं संभावित निर्देशिकाओं की सूची कैसे प्राप्त करूं? लिनक्स पर, /proc/$PID/maps में उन्हें शामिल है - लेकिन फ्रीबीएसडी और मैक ओएस एक्स जैसे अन्य ऑपरेटिंग सिस्टम के बारे में क्या?

+0

मेरे लिए ठीक काम करता है। कुछ कोड पोस्ट करें। आप 'dlopen' के लिए क्या झंडे गुजर रहे हैं? –

+0

हम्म, संलग्न होने पर जीडीबी त्रुटि संदेशों के माध्यम से ब्राउज़ करना, मुझे 'mylib.so: ऐसी कोई फ़ाइल या निर्देशिका नहीं मिली है। जीडीबी शुरू करने से पहले उचित 'सीडी' करने के बाद, 'प्रिंट myfoo' काम करना शुरू कर दिया। लेकिन मैं इसे स्वचालित करना चाहता हूं (इसलिए 'सीडी' आवश्यक नहीं है)। मैंने सवाल बढ़ाया है। – pts

उत्तर

0

ऐसा लगता है कि जीडीबी में .so फाइल ढूंढने को स्वचालित करने का कोई आसान तरीका नहीं है।

0

मैं एक प्रोग्राम बनाए रखता हूं जो साझा लाइब्रेरी को dlopen() के माध्यम से लोड करता है और जीडीबी का उपयोग करके साझा लाइब्रेरी में सफलतापूर्वक प्रतीकों तक पहुंच प्राप्त करता है। यह केवल तभी काम करेगा, अगर साझा लाइब्रेरी में प्रतीक तालिका है।

+0

हां, यह मेरे लिए भी काम करता है अगर मैं सही निर्देशिका से जीडीबी शुरू करता हूं। मैंने इसे स्वचालित करने के बारे में सवाल बढ़ाया है। – pts

3

जीडीबी में "जानकारी लक्ष्य" कमांड सभी लोड की गई साझा वस्तुओं (dlopen() ed पुस्तकालयों सहित) में सभी वर्गों की एक सूची दिखाएगा। कम से कम यह लिनक्स पर काम करता है - मुझे नहीं पता कि यह अन्य ऑपरेटिंग सिस्टम पर कैसे व्यवहार करता है।

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