setelah upgrade gdb tidak akan melampirkan ke proses

67

Saya baru saja memutakhirkan dari 10,04 ke 11,04 dan gdb tidak memungkinkan saya untuk melampirkan ke proses lagi saya mendapatkan kesalahan

Melampirkan ke proses 10144 Tidak dapat melampirkan ke proses. Jika uid Anda cocok dengan uid dari proses target, periksa pengaturan / proc / sys / kernel / yama / ptrace_scope, atau coba lagi sebagai pengguna root. Untuk detail lebih lanjut, lihat /etc/sysctl.d/10-ptrace.conf ptrace: Operasi tidak diizinkan.

Bagaimana cara memperbaikinya sehingga saya dapat men-debug lagi tanpa sudo?

Andrew Redd
sumber

Jawaban:

107

Dalam Maverick Meerkat (10.10) Ubuntu memperkenalkan tambalan untuk melarang ptracing dari proses non-anak oleh pengguna non-root - yaitu. hanya proses yang merupakan induk dari proses lain yang dapat melakukan ptrace untuk pengguna normal - sementara root masih bisa melakukan ptrace setiap proses. Karena itu mengapa Anda dapat menggunakan gdb untuk melampirkan melalui sudo.

Anda dapat menonaktifkan pembatasan ini untuk sementara waktu (dan kembali ke perilaku lama yang memungkinkan pengguna Anda untuk melacak (gdb) salah satu dari proses mereka yang lain) dengan melakukan:

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

Untuk memperbolehkannya mengedit /etc/sysctl.d/10-ptrace.conf secara permanen dan mengubah baris:

kernel.yama.ptrace_scope = 1

Untuk membaca

kernel.yama.ptrace_scope = 0

Untuk beberapa latar belakang mengapa perubahan ini dilakukan, lihat wiki Ubuntu

alexmurray
sumber
4
Terima kasih. Saya menambahkan perintah sementara ke dalam file bin pengguna saya sehingga saya bisa menghidupkan dan mematikannya berfungsi dengan baik.
Andrew Redd
Saya mengedit /etc/sysctl.d/10-ptrace.conffile. ini bekerja dengan baik untuk saya. :)
soroosh
8
Jika Anda telah mengedit beberapa file di /etc/sysctl.d, maka Anda dapat menerapkannya secara otomatis dengan "sudo service procps restart"
frankster
@alexmurray - Jawaban bermanfaat Anda juga harus mencatat bahwa beberapa jenis restart diperlukan agar perubahan /etc/sysctl.dmenjadi efektif. Bagi saya, sistem restart sudah cukup, tetapi mungkin telah berlebihan - lihat komentar frankster di atas. Setelah restart, nilai dari /etc/sysctl.ddisalin ke /proc/sys/kernel/yama/ptrace_scope. (Juga, dalam kasus saya, saya tidak dapat mengedit ptrace_scope secara langsung, bahkan dengan sudo.)
Andy Thomas
Tidak perlu reboot. Jalankan saja: sysctl -puntuk menerapkan perubahan dari /etc/sysctl.confdan /etc/sysctl.d/*. Untuk perubahan spesifik ini, di Ubuntu 15.04 Vivid, file tersebut adalah/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici
3

Jika Anda lebih suka membiarkan /proc/sys/kernel/yama/ptrace_scopenilai defaultnya ditetapkan 1, maka sebagai solusi yang dapat Anda pertimbangkan gdbuntuk menjalankan program yang ingin Anda debug. Anda kemudian dapat membuka debugger hanya dengan menekan ^C. Misalnya, untuk debug ke program (membosankan) sleep 60, lakukan hal berikut:

$ gdb -q sleep -ex 'run 60'

Ini adalah contoh lengkapnya.

$ 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

Karena /bin/sleepdikompilasi tanpa informasi debug, backtrace di atas mengandung informasi minimal.

mpb
sumber
2
Anda tidak melampirkan , Anda memulainya . Ini sangat berbeda, karena dalam hal ini gdbadalah induk langsung dari debuggee dan memiliki hak untuk melakukan debug bahkan dengan ptrace_scope==1. Ini tidak akan berhasil jika Anda malah melampirkan , yaitu melakukan sesuatu sepertisleep 60& gdb -ex "attach $!"
Ruslan
Contoh (saran?) Yang diajukan Ruslan, sleep 60& gdb -ex "attach $!"bukanlah "menggunakan gdb untuk menjalankan program", dan karenanya bukan merupakan bantahan dari workraound saya. Contoh Ruslan adalah menggunakan shell untuk menjalankan pertama sleepdan kemudian menjalankan gdb. Solusi saya berhasil , dan itulah yang saya pedulikan. Saya tidak tahu, saya juga tidak peduli, apakah gdbbenar-benar melekat pada anaknya. Saya peduli bisa men-debug anak itu. Solusi saya mencapai itu. Meskipun demikian, saya telah menulis ulang jawaban saya untuk kejelasan.
mpb