libc

2012-04-03 34 views
47

डीबग संस्करण का उपयोग कैसे करें प्रश्न का संक्षिप्त संस्करण: libc के लिए डीबगिंग प्रतीकों का उपयोग करने के लिए मैं gdb कैसे प्राप्त कर सकता हूं?libc

अधिक बड़ा संस्करण: मैं gdb के साथ एक कार्यक्रम डिबगिंग रहा हूँ और मैं libc द्वारा प्रयुक्त futex के बारे में जानकारी देखना चाहते हैं।

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ??() from /lib/libc.so.6 
(gdb) bt 
#0 0x00007ffff772b73e in ??() from /lib/libc.so.6 
#1 0x00007ffff767fb90 in ??() from /lib/libc.so.6 
#2 0x00007ffff767a4c0 in vfprintf() from /lib/libc.so.6 
#3 0x00007ffff768565a in printf() from /lib/libc.so.6 
.... 

जब मैं ब्रेकप्वाइंट पर gdb में info sharedlibrary चलाने मैं देख रहा हूँ: हालांकि, डीबगिंग के दौरान कुछ बिंदु पर मैं उत्पादन जैसे मिल

(gdb) info sharedlibrary 
From    To     Syms Read Shared Object Library 
0x00007ffff7dddaf0 0x00007ffff7df6704 Yes (*)  /lib64/ld-linux-x86-64.so.2 
0x00007ffff7bc53e0 0x00007ffff7bd1388 Yes (*)  /lib/libpthread.so.0 
0x00007ffff79ba190 0x00007ffff79bd7d8 Yes (*)  /lib/librt.so.1 
0x00007ffff76538c0 0x00007ffff7766c60 Yes (*)  /lib/libc.so.6 
0x00007ffff6c1fd80 0x00007ffff6c303c8 Yes (*)  /lib/libgcc_s.so.1 
(*): Shared library is missing debugging information. 

और जब मैं ldd चलाने मैं देख रहा हूँ:

linux-vdso.so.1 => (0x00007ffff7fde000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000) 
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000) 
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000) 
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000) 

मैं उबंटू 10.04 का उपयोग कर रहा हूं और मुझे लगता है कि डीबग प्रतीकों के साथ libc का संस्करण /usr/lib/debug/lib में है। मैंने पथ के सामने यह LD_LIBRARY_PATH वैरिएबल सेट करने का प्रयास किया लेकिन ऐसा कोई फर्क नहीं पड़ता।

मैं पूरी तरह से स्पष्ट नहीं हूं कि प्रोग्राम किस साझा पुस्तकालयों को लोड करने के लिए चुनता है, चाहे वह रनटाइम पर सेट हो या संकलित समय (मैं अनुमानित रनटाइम का प्रकार हूं लेकिन अब मुझे यकीन नहीं है)। तो libc के डीबग संस्करण का उपयोग करने के लिए जीडीबी कैसे प्राप्त करें इस बारे में जानकारी की सराहना की जाती है।

उत्तर

57

मुझे लगता है कि डीबग प्रतीकों के साथ libc का संस्करण/usr/lib/debug/lib में है। मैंने अपने एलडी_LIBRARY_PATH वैरिएबल को पथ के सामने रखने के लिए सेट करने की कोशिश की लेकिन ऐसा कोई फर्क नहीं पड़ता।

ये नहीं ड्रौयड आप देख रहे हैं कर रहे हैं।

/usr/lib/debug में पुस्तकालय वास्तविक लाइब्रेरी नहीं हैं। इसके बजाय, केवल डीबग जानकारी है, लेकिन वास्तविक libc.so.6 के .text और .data अनुभाग शामिल नहीं हैं। आप विभिन्न डीबगिनोफो फ़ाइलों here के बारे में पढ़ सकते हैं।

/usr/lib/debug में फ़ाइलों libc6-dbg पैकेज से आते हैं, और GDB उन्हें स्वचालित रूप से लोड होगा, जब तक कि वे अपने स्थापित libc6 संस्करण से मेल। यदि आपका libc6 और libc6-dbg मेल नहीं खाता है, तो आपको जीडीबी से चेतावनी मिलनी चाहिए।

आप फ़ाइलों को देख सकते हैं जीडीबी set verbose on सेट करके पढ़ने का प्रयास कर रहा है। यहाँ आप क्या देखना चाहिए जब libc6 और libc6-dbg मैच है:

(gdb) set verbose on 
(gdb) run 
thread_db_load_search returning 0 
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done. 
thread_db_load_search returning 0 
done. 
thread_db_load_search returning 0 
Loaded symbols for /lib64/ld-linux-x86-64.so.2 
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done. 
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000. 
thread_db_load_search returning 0 
Reading in symbols for dl-debug.c...done. 
Reading in symbols for rtld.c...done. 
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done. 
thread_db_load_search returning 0 
... etc ... 

अद्यतन:

उदाहरण के लिए मैं देख रहा हूँ
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

का तात्पर्य है कि आपके GDB /usr/lib/debug खोज नहीं कर रहा है । एक तरीका यह हो सकता है कि यदि आप debug-file-directory को अपने .gdbinit में गलत तरीके से सेट करते हैं।

(gdb) show debug-file-directory 
The directory where separate debug symbols are searched for is "/usr/lib/debug". 
+0

मेरे प्रश्न के उत्तर के लिए धन्यवाद। ऐसा लगता है कि मुझे कुछ और समस्या है क्योंकि जब मैं वर्बोज़ आउटपुट चालू करता हूं तो मुझे libc के प्रतीकों के लिए gdb खोज '/ usr/lib/debug' नहीं दिखता है। उदाहरण के लिए, मैं/lib/libc.so.6.. से प्रतीकों को पढ़ रहा हूं। (कोई डिबगिंग प्रतीक नहीं मिला) ... किया गया। 'इसलिए मुझे अभी भी कुछ समस्या है, लेकिन आपका जवाब समझने में बहुत मददगार है कि क्या वास्तविक समस्या है। अद्यतन के लिए –

+3

धन्यवाद। मैंने अपनी होम निर्देशिका में स्रोत से जीडीबी 7.4 डाउनलोड और स्थापित किया था क्योंकि इसमें एक बग फिक्स था जिसने मुझे जीडीबी 7.1 के साथ समस्या का हल किया था, लेकिन मुझे अपने सिस्टम पर जीडीबी के संस्करण को अपडेट करने की अनुमति नहीं है। वैसे भी 'डीबग-फाइल-निर्देशिका' सही ढंग से सेट नहीं किया गया था, लेकिन इसे '.gdbinit' में सही ढंग से सेट करने से समस्या ठीक हो रही है। –

+0

इसके अलावा, जीडीबी में libc फ़ंक्शंस में कदम उठाने के लिए, glibc स्रोत कोड डाउनलोड करना और इसे अनपैक करना सुनिश्चित करें। फिर स्रोत के पथ के साथ gdb 'directory' कमांड चलाएं। यदि आप एक डिस्ट्रो चला रहे हैं जो libc (जैसे डेबियन) को पैच करता है, तो उसी पैच को लागू करना सुनिश्चित करें (जैसे 'debuild' चलाकर), अन्यथा स्रोत पंक्ति संख्या मेल नहीं खाती है। –

13

सुनिश्चित करें कि आप libc के लिए डिबग प्रतीकों इंस्टॉल किया है::

यहाँ डिफ़ॉल्ट सेटिंग है

sudo apt-get install libc6-dbg 

और अगर आप एक x64 सिस्टम डिबगिंग 86 कोड पर कर रहे हैं:

sudo apt-get install libc6:i386 
sudo apt-get install libc6-dbg:i386