Yükseltmeden sonra gdb işleme eklenmeyecek


67

Kısa süre önce 10.04’ten 11.04’e yükselttim ve gdb artık işlemleri eklememe izin vermiyor artık hatayı alıyorum

İşleme ekleme 10144 İşleme eklenemedi. Kullanıcı adınız hedef işlemin kullanıcı adınızla eşleşiyorsa, / proc / sys / kernel / yama / ptrace_scope ayarını kontrol edin veya kök kullanıcı olarak tekrar deneyin. Daha fazla ayrıntı için, bkz. /Etc/sysctl.d/10-ptrace.conf ptrace: İşleme izin verilmedi.

Bunu sudo olmadan tekrar hata ayıklayabilmem için nasıl düzeltebilirim?

Yanıtlar:


106

Maverick Meerkat'ta (10.10) Ubuntu, çocuk olmayan süreçlerin kök olmayan kullanıcılar tarafından engellenmesine izin vermeyen bir yama ekledi - yani. sadece başka bir sürecin ebeveyni olan bir süreç normal kullanıcılar için onu zorlayabilir - oysa root hala her süreci zorlayabilir. Bu nedenle neden hala sudo ile bağlamak için gdb kullanabilirsiniz.

Aşağıdakileri yaparak bu kısıtlamayı geçici olarak devre dışı bırakabilirsiniz (ve kullanıcının diğer işlemlerinden herhangi birini oylama yapmasına (gdb) izin veren eski davranışa geri dönebilirsiniz):

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

Kalıcı olarak izin vermek için /etc/sysctl.d/10-ptrace.conf dosyasını düzenleyin ve satırı değiştirin:

kernel.yama.ptrace_scope = 1

Okumak

kernel.yama.ptrace_scope = 0

Bu değişikliğin neden yapıldığı hakkında bazı bilgiler için Ubuntu wiki'sine bakınız.


4
Teşekkürler. Geçici olarak kullanıcı bin dosyamdaki bir komuta ekledim, böylece onu açıp kapatabilirim.
Andrew Redd

/etc/sysctl.d/10-ptrace.confDosyayı düzenlerim . benim için mükemmel çalışıyor. :)
soroosh

8
/Etc/sysctl.d içindeki dosyalarda bazı düzenlemeler yaptıysanız, bunları "sudo service procps restart" ile otomatik olarak uygulayabilirsiniz
frankster

@alexmurray - Yararlı cevabınız, değişikliklerin /etc/sysctl.detkili olması için bir tür yeniden başlatmanın gerekli olduğunu da belirtmelidir . Benim için, sistemin yeniden başlatılması yeterliydi, ancak fazlaca olabilirdi - yukarıdaki Frankster'ın yorumuna bakın. Yeniden /etc/sysctl.dbaşlattıktan sonra, içindeki değer kopyalanır /proc/sys/kernel/yama/ptrace_scope. (Ayrıca, benim durumumda, sudo ile bile ptrace_scope'u doğrudan düzenleyemedim.)
Andy Thomas

Yeniden başlatma gerekmez. : Sadece koşmak sysctl -pgelen değişiklikleri uygulamak için /etc/sysctl.confve /etc/sysctl.d/*. Bu özel değişiklik için, Ubuntu 15.04 /etc/sysctl.d/10-ptrace.conf
Vivid’te

3

/proc/sys/kernel/yama/ptrace_scopeVarsayılan değerine ayarlanmış olarak bırakmayı tercih ederseniz 1, geçici bir çözüm olarak gdb, hata ayıklamak istediğiniz programı çalıştırmak için kullanmayı düşünebilirsiniz . Ardından basitçe basarak hata ayıklayıcısını açabilirsiniz ^C. Örneğin, (sıkıcı) programda hata ayıklamak için sleep 60aşağıdakileri yapın:

$ gdb -q sleep -ex 'run 60'

İşte tam bir örnek.

$ 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

Bilgi /bin/sleepşaşırtıcı şekilde hata ayıklamadan derlendiğinden, yukarıdaki geri dönüş çok az bilgi içerir.


2
Sen etmedi takmak sen başladı onu. Bu oldukça farklı, çünkü bu durumda gdbdoğrudan hata ayıklayıcının ebeveyni ve hatta ayıklama hakkına sahip ptrace_scope==1. Bağlanırsanız işe yaramazdı , yani böyle bir şey yaptısleep 60& gdb -ex "attach $!"
Ruslan

Ruslan'ın önerdiği (sayaç?) Örneği, sleep 60& gdb -ex "attach $!""programı çalıştırmak için gdb kullanmak" değildir ve bu nedenle çalışma ortamımın reddedilmesi değildir. Ruslan'ın örneği, önce çalıştırmak ve sonra çalıştırmak için kabuğu kullanıyor . Geçici çözümüm işe yarıyor , umrumda olan şey de bu. Bilmiyorum, ne de gerçekten umrumda değil , aslında çocuğuna bağlı olup olmamasından . Çocuğu hata ayıklayabilmeyi umursuyorum. Geçici çözümüm bunu başardı. Yine de netlik konusundaki cevabımı yeniden yazdım. sleepgdbgdb
mpb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.