Sau khi nâng cấp, gdb sẽ không đính kèm vào quy trình


67

Tôi vừa mới nâng cấp từ 10.04 lên 11.04 và gdb sẽ không cho phép tôi đính kèm vào các quy trình nữa. Tôi gặp lỗi

Đính kèm vào quy trình 10144 Không thể đính kèm vào quy trình. Nếu uid của bạn khớp với uid của quá trình đích, hãy kiểm tra cài đặt của / Proc / sys / kernel / yama / ptrace_scope hoặc thử lại với tư cách là người dùng root. Để biết thêm chi tiết, xem /etc/sysctl.d/10-ptrace.conf ptrace: Thao tác không được phép.

Làm thế nào để tôi sửa lỗi này để tôi có thể gỡ lỗi một lần nữa mà không cần sudo?

Câu trả lời:


107

Trong Maverick Meerkat (10.10) Ubuntu đã giới thiệu một bản vá để không cho phép ptracing các quy trình không phải con của người dùng không phải root - tức là. chỉ một quá trình là cha mẹ của một tiến trình khác có thể tạo ra nó cho người dùng bình thường - trong khi root vẫn có thể tạo ra mọi tiến trình. Do đó tại sao bạn có thể sử dụng gdb để đính kèm qua sudo still.

Bạn có thể tạm thời vô hiệu hóa hạn chế này (và trở lại hành vi cũ cho phép người dùng của bạn xử lý (gdb) bất kỳ quy trình nào khác của họ) bằng cách thực hiện:

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

Để vĩnh viễn cho phép nó chỉnh sửa /etc/sysctl.d/10-ptrace.conf và thay đổi dòng:

kernel.yama.ptrace_scope = 1

Đọc

kernel.yama.ptrace_scope = 0

Để biết một số nền tảng về lý do tại sao thay đổi này được thực hiện, hãy xem wiki Ubuntu


4
Cảm ơn. Tôi đã thêm tạm thời vào một lệnh trong tệp bin người dùng của mình để tôi có thể bật và tắt nó hoạt động tốt.
Andrew Redd

Tôi chỉnh sửa /etc/sysctl.d/10-ptrace.conftập tin. Nó hoạt động hoàn hảo cho tôi. :)
soroosh

8
Nếu bạn đã thực hiện một số chỉnh sửa cho các tệp trong /etc/sysctl.d, thì bạn có thể tự động áp dụng chúng với "sudo service Procps restart"
frankster 18/07/13

@alexm bồ - Câu trả lời hữu ích của bạn cũng cần lưu ý rằng việc khởi động lại một số loại là cần thiết để các thay đổi /etc/sysctl.dcó hiệu lực. Đối với tôi, khởi động lại hệ thống là đủ, nhưng có thể đã quá mức cần thiết - xem bình luận của frankster ở trên. Sau khi khởi động lại, giá trị từ /etc/sysctl.dđược sao chép vào /proc/sys/kernel/yama/ptrace_scope. (Ngoài ra, trong trường hợp của tôi, tôi không thể chỉnh sửa trực tiếp ptrace_scope, ngay cả với sudo.)
Andy Thomas

Không cần khởi động lại. Chỉ cần chạy: sysctl -pđể áp dụng các thay đổi từ /etc/sysctl.conf/etc/sysctl.d/*. Đối với thay đổi cụ thể này, trong Ubuntu 15.04 Vivid, tệp là/etc/sysctl.d/10-ptrace.conf
Mircea Vutcovici

3

Nếu bạn muốn /proc/sys/kernel/yama/ptrace_scopeđặt thành giá trị mặc định của nó 1, thì như một cách giải quyết bạn có thể cân nhắc sử dụng gdbđể chạy chương trình bạn muốn gỡ lỗi. Sau đó, bạn có thể đưa ra trình gỡ lỗi chỉ bằng cách nhấn ^C. Ví dụ, để gỡ lỗi cho chương trình (nhàm chán) sleep 60, hãy làm như sau:

$ gdb -q sleep -ex 'run 60'

Dưới đây là một ví dụ đầy đủ.

$ 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được (không có gì đáng ngạc nhiên) được biên dịch mà không có thông tin gỡ lỗi, nên phần nền phía trên chứa thông tin tối thiểu.


2
Bạn đã không đính kèm , bạn đã bắt đầu nó. Nó hoàn toàn khác, vì trong trường hợp gdbnày là cha mẹ trực tiếp của trình gỡ lỗi và có mọi quyền để gỡ lỗi ngay cả với ptrace_scope==1. Nó sẽ không hoạt động nếu bạn thay vì gắn liền , tức là đã làm một cái gì đó giống nhưsleep 60& gdb -ex "attach $!"
Ruslan

Ví dụ đề xuất (bộ đếm?) Của Ruslan, sleep 60& gdb -ex "attach $!"không phải là "sử dụng gdb để chạy chương trình", và do đó không phải là từ chối cách làm việc của tôi. Ví dụ của Ruslan là sử dụng shell để chạy đầu tiên sleepvà sau đó chạy gdb. Cách giải quyết của tôi hoạt động , đó là những gì tôi quan tâm. Tôi không biết, tôi cũng không thực sự quan tâm, có gdbthực sự gắn bó với đứa con của nó hay không . Tôi quan tâm đến việc có thể gỡ lỗi cho đứa trẻ. Cách giải quyết của tôi hoàn thành điều đó. Tuy nhiên, tôi đã điều chỉnh lại câu trả lời của mình cho rõ ràng.
mpb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.