หลังจากอัปเกรด gdb จะไม่เชื่อมต่อกับกระบวนการ


67

ฉันเพิ่งอัพเกรดจาก 10.04 เป็น 11.04 และ gdb จะไม่อนุญาตให้ฉันแนบกับกระบวนการอีกต่อไปฉันได้รับข้อผิดพลาด

การแนบกับกระบวนการ 10144 ไม่สามารถแนบกับกระบวนการ หาก uid ของคุณตรงกับ uid ของกระบวนการเป้าหมายให้ตรวจสอบการตั้งค่า / proc / sys / kernel / yama / ptrace_scope หรือลองอีกครั้งในฐานะผู้ใช้รูท สำหรับรายละเอียดเพิ่มเติมโปรดดู /etc/sysctl.d/10-ptrace.conf ptrace: ไม่อนุญาตให้ใช้งาน

ฉันจะแก้ไขได้อย่างไรเพื่อให้สามารถดีบักอีกครั้งโดยไม่มี sudo

คำตอบ:


106

ใน Maverick Meerkat (10.10) Ubuntu ได้เปิดตัวแพทช์เพื่อไม่อนุญาตให้ใช้กระบวนการที่ไม่ใช่ลูกโดยผู้ใช้ที่ไม่ใช่รูท - เช่น เฉพาะกระบวนการที่เป็นพาเรนต์ของกระบวนการอื่นสามารถ ptrace สำหรับผู้ใช้ปกติ - ในขณะที่รูทยังสามารถ ptrace ทุกกระบวนการ ดังนั้นทำไมคุณสามารถใช้ gdb เพื่อแนบผ่าน sudo ภาพนิ่ง

คุณสามารถปิดการใช้งานข้อ จำกัด นี้ได้ชั่วคราว (และกลับสู่พฤติกรรมเดิมที่อนุญาตให้ผู้ใช้ของคุณ 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
ขอบคุณ ฉันเพิ่มชั่วคราวลงในคำสั่งในไฟล์ bin ผู้ใช้ของฉันเพื่อให้สามารถเปิดและปิดใช้งานได้ดี
Andrew Redd

ฉันแก้ไข/etc/sysctl.d/10-ptrace.confไฟล์ มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน :)
soroosh

8
หากคุณได้ทำการแก้ไขไฟล์ใน /etc/sysctl.d คุณสามารถปรับใช้มันโดยอัตโนมัติด้วย "sudo service procps restart"
frankster

@alexmurray - คำตอบที่เป็นประโยชน์ของคุณควรทราบว่าการรีสตาร์ทบางอย่างเป็นสิ่งจำเป็นเพื่อให้การเปลี่ยนแปลง/etc/sysctl.dมีผล สำหรับฉันแล้วการรีสตาร์ทระบบก็เพียงพอแล้ว แต่อาจจะเกินกำลังแล้ว - ดูความคิดเห็นของแฟรงค์เตอร์ด้านบน หลังจากที่เริ่มต้นค่าจากถูกคัดลอกลง/etc/sysctl.d /proc/sys/kernel/yama/ptrace_scope(ในกรณีของฉันฉันไม่สามารถแก้ไข ptrace_scope โดยตรงแม้แต่กับ sudo)
Andy Thomas

ไม่จำเป็นต้องรีบูต เพียงแค่เรียกใช้: sysctl -pใช้การเปลี่ยนแปลงจากและ/etc/sysctl.conf /etc/sysctl.d/*สำหรับการเปลี่ยนแปลงเฉพาะนี้ใน Ubuntu 15.04 Vivid ไฟล์คือ/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ถูกคอมไพล์ (ไม่น่าแปลกใจ) โดยไม่มีข้อมูลการดีบัก backtrace ด้านบนมีข้อมูลน้อยที่สุด


2
คุณไม่ได้แนบคุณเริ่มมัน มันแตกต่างกันมากเนื่องจากในกรณีนี้gdbเป็นผู้ปกครองโดยตรงของ debuggee ptrace_scope==1และมีสิทธิที่จะแก้ปัญหาได้แม้จะมีทุก มันจะไม่ทำงานถ้าคุณแนบมาแทนนั่นคือทำสิ่งที่ต้องการsleep 60& gdb -ex "attach $!"
Ruslan

ตัวอย่างของ Ruslan ที่เสนอ (ตัวนับ?) sleep 60& gdb -ex "attach $!"ไม่ใช่ "ใช้ gdb เพื่อเรียกใช้โปรแกรม" และดังนั้นจึงไม่ใช่การพิสูจน์วิธีแก้ปัญหาของฉัน ตัวอย่างเช่น Ruslan จะใช้เปลือกเพื่อเรียกใช้ครั้งแรกและเรียกใช้sleep gdbวิธีแก้ปัญหาของฉันทำงานซึ่งเป็นสิ่งที่ฉันสนใจ ฉันไม่รู้และไม่สนใจจริง ๆ ว่าgdbติดอยู่กับลูกหรือไม่ ฉันดูแลเกี่ยวกับความสามารถในการแก้ปัญหาเด็ก การแก้ปัญหาของฉันประสบความสำเร็จ กระนั้นฉันก็ได้รับคำตอบสำหรับความชัดเจน
mpb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.