після оновлення gdb не додаватиметься до процесу


67

Нещодавно оновлений з 10.04 до 11.04 і gdb більше не дозволить мені приєднуватися до процесів, я отримую помилку

Додавання до процесу 10144 Неможливо приєднати до процесу. Якщо ваш uid відповідає uid цільового процесу, перевірте налаштування / proc / sys / kernel / yama / ptrace_scope або спробуйте знову як користувач root. Більш детально див. /Etc/sysctl.d/10-ptrace.conf ptrace: Операція не дозволена.

Як це виправити, щоб я знову міг налагоджувати без судо?

Відповіді:


106

У Maverick Meerkat (10.10) Ubuntu представив виправлення, щоб заборонити простежувати недітові процеси некористувальними користувачами - тобто. лише звичайний процес, який є батьківським іншим процесом, може простежити його для звичайних користувачів - в той час як root все ще може простежити кожен процес. Отже, чому ви можете використовувати 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
Дякую. Я додав тимчасове до команди у своєму файлі бін користувача, щоб я міг його включати та вимикати, чудово працює.
Ендрю Редд

Я редагую /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 безпосередньо, навіть із судо.)
Енді Томас,

Перезавантаження не потрібне. Просто запустіть: 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було (не дивно) складено без налагодження інформації, вищезазначений зворотний вміст містить мінімальну інформацію.


2
Ви не приєдналися , ви почали це. Це зовсім інакше, оскільки в цьому випадку gdbє безпосереднім батьком налагодження і має повне право налагоджувати його навіть з ptrace_scope==1. Це не спрацювало б, якщо ви замість цього приєдналися , тобто зробили щось на кшталтsleep 60& gdb -ex "attach $!"
Руслан

Запропонований Русланом (лічильник?) Приклад - sleep 60& gdb -ex "attach $!"це не "використання gdb для запуску програми", і тому це не спростування моєї роботи. Приклад Руслана - це використання оболонки, щоб спочатку запустити, sleepа потім запустити gdb. Мій обхідний шлях працює , що то , що я дбаю. Я не знаю, а також мені не байдуже, чи gdbстосується насправді чи ні до своєї дитини. Мені все одно, що я можу налагодити дитину. Моє вирішення цього досягає. Тим не менш, я переформулював свою відповідь для ясності.
mpb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.