नवीनीकरण के बाद gdb प्रोसेस में संलग्न नहीं होगा


66

मैं अभी हाल ही में १०.०४ से ११.०४ में अपग्रेड किया गया था और gdb मुझे उन प्रक्रियाओं से जुड़ने की अनुमति नहीं देगा, जिनमें मुझे त्रुटि मिलती है

10144 प्रक्रिया के लिए संलग्न करना प्रक्रिया में संलग्न नहीं हो सका। यदि आपका यूआईडी लक्ष्य प्रक्रिया के यूआईडी से मेल खाता है, तो / proc / sys / कर्नेल / yama / ptrace_scope की सेटिंग जांचें, या रूट उपयोगकर्ता के रूप में फिर से प्रयास करें। अधिक जानकारी के लिए, /etc/sysctl.d/10-ptrace.conf ptrace देखें: ऑपरेशन की अनुमति नहीं है।

मैं इसे कैसे ठीक करूं ताकि मैं सूडो के बिना फिर से डिबग कर सकूं?

जवाबों:


105

मेवरिक मेर्कैट (10.10) में उबंटू ने गैर-रूट उपयोगकर्ताओं (यानी) द्वारा गैर-चाइल्ड प्रक्रियाओं को रोकने के लिए एक पैच पेश किया। केवल एक प्रक्रिया जो एक अन्य प्रक्रिया का एक माता-पिता है वह सामान्य उपयोगकर्ताओं के लिए इसे पियर्स कर सकता है - जबकि रूट अभी भी हर प्रक्रिया को विमुद्रीकृत कर सकता है। इसलिए क्यों आप sudo के माध्यम से संलग्न करने के लिए gdb का उपयोग कर सकते हैं।

आप इस प्रतिबंध को अस्थायी रूप से अक्षम कर सकते हैं (और अपने व्यवहार को अपने उपयोगकर्ता को ptrace (gdb) को उनकी किसी अन्य प्रक्रिया से अनुमति देकर वापस कर सकते हैं)

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

स्थायी रूप से इसे /etc/sysctl.d/10-ptrace.conf को संपादित करने और लाइन बदलने की अनुमति दें:

kernel.yama.ptrace_scope = 1

पढ़ने के लिए

kernel.yama.ptrace_scope = 0

यह परिवर्तन क्यों किया गया था, इसकी कुछ पृष्ठभूमि के लिए, Ubuntu विकी देखें


4
धन्यवाद। मैंने अपने उपयोगकर्ता बिन फ़ाइल में एक कमांड को अस्थायी रूप से जोड़ा ताकि मैं इसे चालू कर सकूं और शानदार काम कर सकूं।
एंड्रयू रेड

मैं /etc/sysctl.d/10-ptrace.confफ़ाइल संपादित करता हूं । यह मेरे लिए पूरी तरह से काम करता है। :)
सर्पोश

8
यदि आपने /etc/sysctl.d में फ़ाइलों के लिए कुछ संपादन किए हैं, तो आप उन्हें "sudo service procps पुनरारंभ" के साथ स्वचालित रूप से लागू कर सकते हैं
frankster

@alexmurray - आपके उपयोगी उत्तर को यह भी ध्यान देना चाहिए कि परिवर्तनों को /etc/sysctl.dप्रभावी बनाने के लिए किसी प्रकार का पुनरारंभ आवश्यक है । मेरे लिए, एक सिस्टम रीस्टार्ट पर्याप्त था, लेकिन ओवरकिल हो सकता है - ऊपर फ्रैंकेस्टर की टिप्पणी देखें। पुनरारंभ करने के बाद, से मान /etc/sysctl.dको कॉपी किया जाता है /proc/sys/kernel/yama/ptrace_scope। (इसके अलावा, मेरे मामले में मैं सीधे ptrace_scope को संपादित नहीं कर सका, यहां तक ​​कि sudo के साथ भी।)
एंडी थॉमस

किसी रीबूट की जरूरत नहीं है। बस चलाते हैं: और sysctl -pसे परिवर्तन लागू करने के लिए । इस विशिष्ट परिवर्तन के लिए, Ubuntu 15.04 विविड में, फ़ाइल है/etc/sysctl.conf/etc/sysctl.d/*/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici

3

यदि आप /proc/sys/kernel/yama/ptrace_scopeइसके डिफ़ॉल्ट मान पर सेट छोड़ना पसंद करते हैं 1, तो एक समाधान के रूप में आप gdbउस प्रोग्राम को चलाने के लिए उपयोग कर सकते हैं जिसे आप डिबग करना चाहते हैं। तब आप केवल दबाकर डीबगर को ला सकते हैं ^C। उदाहरण के लिए, (उबाऊ) कार्यक्रम को डीबग करने के sleep 60लिए, निम्नलिखित करें:

$ gdb -q sleep -ex 'run 60'

यहाँ एक पूर्ण उदाहरण है।

$ gdb -q sleep -ex 'run 60'
Reading symbols from sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) backtrace
#0  0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x0000000000403cd7 in ?? ()
#2  0x0000000000403b88 in ?? ()
#3  0x00000000004016c9 in ?? ()
#4  0x00007ffff7a35ec5 in __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe9f8) at libc-start.c:287
#5  0x00000000004017d5 in ?? ()
(gdb) continue
Continuing.
[Inferior 1 (process 3531) exited normally]
(gdb) quit

चूंकि /bin/sleepडिबगिंग जानकारी के बिना (अनिश्चित रूप से) संकलित किया गया था, इसलिए उपरोक्त बैकट्रेस में न्यूनतम जानकारी होती है।


2
आपने संलग्न नहीं किया , आपने इसे शुरू किया। यह काफी अलग है, क्योंकि इस मामले gdbमें डिबग के सीधे माता-पिता हैं और इसके साथ डिबग करने का भी हर अधिकार है ptrace_scope==1। यह काम नहीं करेगा यदि आप इसके बजाय संलग्न हैं , जैसे कुछ कियाsleep 60& gdb -ex "attach $!"
रुस्लान

रुस्लान का प्रस्तावित (काउंटर?) उदाहरण, sleep 60& gdb -ex "attach $!""प्रोग्राम को चलाने के लिए gdb का उपयोग करना" नहीं है, और इसलिए यह मेरे काम करने की प्रतिनियुक्ति नहीं है। रुसलान का उदाहरण पहले रन और फिर रन का उपयोग कर रहा है । मेरा वर्कअराउंड काम करता है , जिसकी मुझे परवाह है। मुझे नहीं पता, और न ही मुझे वास्तव में परवाह है, कि क्या वास्तव में इसके बच्चे के साथ संलग्न है या नहीं । मुझे बच्चे के डिबग करने में सक्षम होने की परवाह है। मेरा समाधान यह पूरा करता है। बहरहाल, मैंने स्पष्टता के लिए अपना जवाब फिर से दे दिया है। sleepgdbgdb
एमपीब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.