2012-01-04 12 views
5

कहें कि मैं उपयोगकर्ता एलिस के साथ एक प्रोग्राम लिख रहा हूं और संकलित कर रहा हूं। कार्यक्रम तब उसी मशीन पर उपयोगकर्ता बॉब द्वारा चलाया जाता है, लेकिन उस स्थान से जो ऐलिस तक नहीं पहुंच सकता है।मैं किसी भिन्न उपयोगकर्ता द्वारा चलाए जाने वाले प्रोग्राम को कैसे डिबग कर सकता हूं?

[email protected]:/home/alice$ g++ helloworld.cpp -o helloworld -g 

[email protected]:/home/bob$ cp ../alice/helloworld . 
[email protected]:/home/bob$ ./helloworld 

अब, एलिस डीबग करना चाहता है कि बॉब क्या कर रहा है। बॉक्स के बाहर, यह संभव नहीं है:

[email protected]:/home/alice$ pidof helloworld 
1234 
[email protected]:/home/alice$ gdb 
[...] 
(gdb) attach <pidof helloworld> 
Attaching to process 1234 
ptrace: Operation not permitted. 

एलिस क्या करना चाहिए?

+0

एलिस-बॉब मेमे का उपयोग करके इस प्रश्न को phrasing पर Kudos, यह बहुत समझने योग्य और अच्छी तरह से जवाब देने में बेहद आसान बनाता है। – parasietje

उत्तर

6

रिमोट डिबगिंग

ऐलिस और बॉब दूरस्थ डीबगिंग का उपयोग करना चाहिए। बॉब gdbserver शुरू होता है:

[email protected]:/home/bob$ gdbserver :2345 ./helloworld 

और ऐलिस उससे कनेक्ट:

[email protected]:/home/alice$ gdb 
[...] 
(gdb) file helloworld 
Reading symbols from /home/alice/helloworld...done. 
(gdb) target remote :2345 
Remote debugging using :2345 
[...] 
0x00007fbdc6329af0 in _start() from /lib64/ld-linux-x86-64.so.2 

निरपेक्ष पथ

यह इस सरल मामले में काम करता है के साथ रिमोट डिबगिंग। हालांकि, कुछ अधिक परिष्कार जब बॉब अपने साझा पुस्तकालयों के लिए पूर्ण पथ का उपयोग करता requried है:

[email protected]:/home/bob$ ls 
helloworld libmylib.so 
[email protected]:/home/bob$ LD_LIBRARY_PATH=/home/bob gdbserver :2345 ./helloworld 
अब

, ऐलिस साझा लाइब्रेरी नहीं मिल सकता है:

[email protected]:/home/alice$ gdb 
[...] 
(gdb) file helloworld 
Reading symbols from /home/alice/helloworld...done. 
(gdb) target remote :2345 
Remote debugging using :2345 
[...] 
(gdb) break helloWorld() 
Breakpoint 1 at 0x400480 
(gdb) c 
Continuing. 
Error while mapping shared library sections: 
/home/bob/libmylib.so: No such file or directory. 

इस हल करने के लिए, ऐलिस एक आभासी बनाता है बाइनरी पर इसके के लिंक के साथ रूट फ़ोल्डर:

:

[email protected]:/home/alice$ mkdir -p gdb-symbols/home/ 
[email protected]:/home/alice$ ln -s /home/alice gdb-symbols/home/bob 
[email protected]:/home/alice$ ln -s /lib gdb-symbols/lib 
[email protected]:/home/alice$ ln -s /lib64 gdb-symbols/lib64 
[and so forth for every shared library that cannot be found...] 

और अब सभी प्रतीकों लोड के साथ डिबग करने में सक्षम है

[email protected]:/home/alice$ gdb 
[...] 
(gdb) file helloworld 
Reading symbols from /home/alice/helloworld...done. 
(gdb) target remote :2345 
Remote debugging using :2345 
[...] 
Reading symbols from /home/alice/gdb-symbols/home/bob/libmylib.so...done. 
Loaded symbols from /home/alice/gdb-symbols/home/bob/libmylib.so 
(gdb) 
+0

कुछ खोदने और कोशिश करने के बाद, मुझे यह मिला। समाधान के साथ काफी खुश है। शायद मैं अभी भी init फ़ाइलों के साथ चीजें स्वचालित कर सकते हैं ... –

1

ऐलिस को बॉब द्वारा लॉन्च की गई प्रक्रिया को डीबग करने के लिए अनुमतियां प्राप्त करनी चाहिए। एलिस सुपरयूसर (sudo gdb) बनकर या बॉब (sudo -u bob gdb) के रूप में gdb चलाकर ऐसा कर सकता है।

हो सकता है कि एक अनुमति ध्वज है जिसका उपयोग आप अन्य उपयोगकर्ताओं से डीबगिंग की अनुमति देने के लिए कर सकते हैं, लेकिन मैं उस पर भरोसा नहीं करता।

+0

अच्छा बिंदु! डीबगिंग जीबीबी को बॉब के रूप में चलाकर काम करता है, लेकिन यदि बॉब ऐलिस के स्रोत कोड को नहीं पढ़ सकता है, तो यह उपलब्ध नहीं होगा। मैं रूट के रूप में gdb चलने से बचना पसंद करेंगे। –