क्या मैं GDB का उपयोग किसी चल रही प्रक्रिया को डीबग करने के लिए कर सकता हूँ?


110

लिनक्स के तहत, क्या मैं GDB का उपयोग किसी ऐसी प्रक्रिया को डीबग करने के लिए कर सकता हूं जो वर्तमान में चल रही है?

जवाबों:


88

हाँ। attachकमांड का उपयोग करें । की जाँच करें इस लिंक अधिक जानकारी के लिए। help attachGDB कंसोल पर टाइप करने से निम्नलिखित मिलता है:

(gdb) help attach

GDB के बाहर किसी प्रक्रिया या फ़ाइल में संलग्न करें। यह कमांड आपके अंतिम " target" कमांड (" info files" आपके लक्ष्य स्टैक को दिखाएगा) के समान प्रकार के एक और लक्ष्य से जुड़ता है । कमांड एक प्रक्रिया आईडी, एक प्रक्रिया नाम (एक प्रत्यय के रूप में एक वैकल्पिक प्रक्रिया-आईडी के साथ), या एक डिवाइस फ़ाइल के रूप में ले सकती है। प्रोसेस आईडी के लिए, आपके पास प्रक्रिया को सिग्नल भेजने की अनुमति होनी चाहिए, और इसमें डीबगर के समान प्रभावी यूआईडी होना चाहिए। attachमौजूदा प्रक्रिया में " " का उपयोग करते समय , डिबगर प्रक्रिया में चल रहे प्रोग्राम को ढूँढता है, वर्तमान कार्य निर्देशिका में पहली बार देख रहा है, या (यदि वहां नहीं मिला है) स्रोत फ़ाइल खोज पथ का उपयोग करके (" directory" कमांड देखें)। आप fileप्रोग्राम को निर्दिष्ट करने के लिए, और इसके प्रतीक तालिका को लोड करने के लिए " " कमांड का भी उपयोग कर सकते हैं ।


नोट: लिनक्स कर्नेल में बेहतर सुरक्षा के कारण आपको किसी प्रक्रिया में संलग्न होने में कठिनाई हो सकती है - उदाहरण के लिए एक खोल के बच्चे को दूसरे से संलग्न करना।

आपको /proc/sys/kernel/yama/ptrace_scopeअपनी आवश्यकताओं के आधार पर सेट करने की आवश्यकता होगी। कई सिस्टम अब डिफ़ॉल्ट 1या उच्चतर हैं।

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
लिंक टूट गया है :( देखने की मेरी बात से, मैं के रूप में जवाब की तरह इस एक से जे Polfer चीयर्स;)।
olibre

मैंने लिंक ठीक कर दिया है।
अटारी

क्या यह किसी दूरस्थ लक्ष्य पर प्रक्रिया की एक पिड के लिए भी काम करता है?
Bionix1441

आपको दूरस्थ लक्ष्य पर डिबग सर्वर चलाना होगा; उसके बाद भी ऐसा ही होना चाहिए।
कार्ल नॉरम

ध्वज का उपयोग करके बदला जा सकता है echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Daisuke Aramaki


24

हाँ। तुम कर सकते हो:

gdb program_name program_pid

एक शॉर्टकट होगा (केवल एक उदाहरण चल रहा है):

gdb program_name `pidof program_name`

मुझे नहीं पता कि वह क्या करता है लेकिन यह निश्चित है कि नरक मेरे लिए काम नहीं करता है। यह कहता है कि <program_pid> मौजूद नहीं है।
उल्लू

2
मुझे लगता है कि यह सबसे अच्छा काम करता है क्योंकि यह प्रक्रिया को संलग्न करने के अलावा प्रतीक तालिका को लोड करता है। यह ध्यान दिया जाना चाहिए कि program_nameकाम करता है यदि आप बाइनरी के समान निर्देशिका में हैं। मुझे लगता है कि यदि आप एक अलग निर्देशिका में हैं तो बाइनरी के लिए एक रास्ता काम करेगा।
कराटेस्वामेनाइन

क्या आप -pसामने नहीं भूल गए program_id? इसके अलावा, चलने की प्रक्रिया में संलग्न करने के लिए sudo के साथ gdb चलाना आवश्यक हो सकता है।
mxmlnkn

15

उपयोग करने का कमांड वह है gdb attach pidजहाँ pid उस प्रक्रिया की प्रक्रिया आईडी है जिसे आप संलग्न करना चाहते हैं।


3

हाँ तुम कर सकते हो। मान लें कि एक प्रक्रिया fooचल रही है ...

ps -elf | grep फू

पीआईडी ​​नंबर की तलाश करें

जीडीबी-ए {पीआईडी ​​नंबर}

5
आप किस वितरण पर चल रहे हैं? फेडोरा के हालिया संस्करण का उपयोग करते हुए, 'gdb -a' एक "विकल्प -a अस्पष्ट है" त्रुटि प्रिंट करता है।
जस्टिन एथियर

1
आधिकारिक तर्क है -p / - pid
महमूद अल-कुद्सी

3

यदि कोई प्रक्रिया संलग्न करना चाहता है, तो इस प्रक्रिया का स्वामी एक ही होना चाहिए। जड़ किसी भी प्रक्रिया में संलग्न करने में सक्षम है।


2

ps-PID को दिखाने के लिए प्रतीत नहीं होता है। मैं इसके बजाय उपयोग करने की सलाह देता हूं:

ps -ld | grep foo
gdb -p PID

2

सबसे आसान तरीका प्रक्रिया आईडी प्रदान करना है

gdb -p `pidof your_running_program_name`

कृपया विकल्प की पूरी सूची प्राप्त करें man gdb कमांड ।

यदि उसी प्रोग्राम के लिए कई प्रक्रियाएँ चल रही हैं, तो निम्नलिखित कमांड प्रक्रियाओं को सूचीबद्ध करेगी।

ps -C program -o pid h
<number>

फिर आउटपुट प्रोसेस आईडी (संख्या) को gdb के तर्क के रूप में उपयोग किया जा सकता है।

gdb -p <process id>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.