मैं जीडीबी का उपयोग कर लिनक्स 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
में उन्हें शामिल है - लेकिन फ्रीबीएसडी और मैक ओएस एक्स जैसे अन्य ऑपरेटिंग सिस्टम के बारे में क्या?
मेरे लिए ठीक काम करता है। कुछ कोड पोस्ट करें। आप 'dlopen' के लिए क्या झंडे गुजर रहे हैं? –
हम्म, संलग्न होने पर जीडीबी त्रुटि संदेशों के माध्यम से ब्राउज़ करना, मुझे 'mylib.so: ऐसी कोई फ़ाइल या निर्देशिका नहीं मिली है। जीडीबी शुरू करने से पहले उचित 'सीडी' करने के बाद, 'प्रिंट myfoo' काम करना शुरू कर दिया। लेकिन मैं इसे स्वचालित करना चाहता हूं (इसलिए 'सीडी' आवश्यक नहीं है)। मैंने सवाल बढ़ाया है। – pts