2012-05-04 8 views
35

के साथ जीडीबी का उपयोग कैसे करें मैं एक प्रोग्राम चलाता हूं जिसमें एलडी_PRELOADing एक विशिष्ट पुस्तकालय है। इस प्रकार सं.एलडी_PRELOAD

LD_PRELOAD=./my.so ./my_program 

मैं इस प्रोग्राम को जीडीबी के साथ कैसे चला सकता हूं?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- एलडी-प्रीलोड - वहां कुछ भी मदद करता है? – Mat

उत्तर

52

निम्नलिखित कार्य करें।

gdb your_program 

(gdb) set environment LD_PRELOAD ./yourso.so 
(gdb) start 
0

आप मूल रूप से यह एक ही तरह से कर सकते हैं, बस प्रोग्राम नाम से पहले gdb जोड़ें:

LD_PRELOAD=./my.so gdb ./my.program 

आप का उपयोग वातावरण चर की जाँच कर सकते हैं:

(gdb) show environment LD_PRELOAD 

दुर्लभ मामले में आपको वास्तव में इसे जीडीबी के अंदर बदलने की जरूरत है, उदाहरण के लिए जब एक dlopen() डीबगिंग, आप ऐसा कर ca:

(gdb) set environment LD_PRELOAD ./my.so 

ओह,, रुको यह gdb 7.6.2 के साथ मेरे लिए काम नहीं करता है! लाइब्रेरी लोड नहीं होती है, इसका मतलब है कि यहां तक ​​कि यहां कोई भी जवाब वर्तमान उपकरण के साथ कम से कम सही नहीं है।

+0

मुझे लगता है कि प्रीलोड का प्रभाव जीडीबी के लिए अवांछित है (शायद यह एक मॉकिंग लाइब्रेरी है जो 'ओपन()' और जैसे- 'fakeroot' आदि) को संशोधित करता है। –

5

पोस्टिंग set environment काम करते हैं क्योंकि हम एक मामले में भाग जहां नहीं था:

GDB documentation से:

set exec-wrapper wrapper 
show exec-wrapper 
unset exec-wrapper 

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

आप किसी भी प्रोग्राम का उपयोग कर सकते हैं जो अंततः एक रैपर के रूप में अपने तर्कों के साथ निष्पादित करता है। कई मानक यूनिक्स उपयोगिताओं यह करते हैं, उदा। एनवी और नोहुप। निष्पादन "$ @" के साथ समाप्त होने वाली कोई यूनिक्स शैल स्क्रिप्ट भी काम करेगी। साथ

  (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' 
     (gdb) run 
4

यहाँ सब कुछ चलाने के लिए एक रास्ता है (:

उदाहरण के लिए, आप env का उपयोग अपने खोल के वातावरण में चर की स्थापना के बिना, डिबग कार्यक्रम के लिए एक वातावरण चर पारित करने के लिए कर सकते हैं तर्क और पर्यावरण) एक आदेश के रूप में:

उदाहरण:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l 

उत्सुक पर्यवेक्षक देखेंगे कि env यहां एक exec wrapper (जैसे Alexey Romanov के उत्तर) के रूप में कार्य करता है।

1

आप -iex ध्वज का उपयोग कमांड लाइन पर एक कार्यकारी-आवरण के रूप में env आपूर्ति कर सकते हैं:

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program 
+0

यह संस्करण ठीक काम करता है जहां कुछ अन्य उत्तरों काम नहीं करते थे या जहां उपयोग करना आसान नहीं था। – Guillaume

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