после обновления GDB не присоединится к процессу

67

Я недавно обновился с 10.04 до 11.04, и GDB больше не позволяет мне подключаться к процессам. Я получаю ошибку

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

Как я могу это исправить, чтобы я мог снова отлаживать без sudo?

Эндрю Редд
источник

Ответы:

107

В Maverick Meerkat (10.10) Ubuntu представила патч, запрещающий трассировку не дочерних процессов пользователями без полномочий root - т.е. только процесс, который является родителем другого процесса, может отслеживать его для обычных пользователей - в то время как root может отслеживать каждый процесс. Следовательно, почему вы можете использовать GDB для подключения через sudo еще.

Вы можете временно отключить это ограничение (и вернуться к старому поведению, позволяющему пользователю отслеживать (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.

alexmurray
источник
4
Благодарю. Я добавил временную команду в свой файл bin пользователя, так что я могу включить и выключить его, отлично работает.
Эндрю Редд
Я редактирую /etc/sysctl.d/10-ptrace.confфайл. это прекрасно работает для меня. :)
сороош
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.)
Энди Томас,
Перезагрузка не требуется. Просто запустите: sysctl -pприменить изменения от /etc/sysctl.confи /etc/sysctl.d/*. Для этого конкретного изменения в Ubuntu 15.04 Vivid файл/etc/sysctl.d/10-ptrace.conf
Мирча Вутковичи
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(что неудивительно) был скомпилирован без отладочной информации, вышеупомянутая обратная трассировка содержит минимальную информацию.

MPB
источник
2
Вы не привязались , вы начали это. Это совсем другое, так как в этом случае gdbявляется прямым родителем отладчика и имеет полное право отлаживать его даже с ptrace_scope==1. Это не сработало бы, если бы вы вместо этого подключились , т.е. сделали что-то вродеsleep 60& gdb -ex "attach $!"
Руслан
Предлагаемый Русланом (встречный?) Пример sleep 60& gdb -ex "attach $!"не «использует gdb для запуска программы» и, следовательно, не является опровержением моего обходного пути. Например, Руслан использует оболочку для запуска, sleepа затем запуска gdb. Мой обходной путь работает , и это то, что меня волнует. Я не знаю, и мне действительно все равно, привязана ли gdbона к своему ребенку или нет . Я забочусь о возможности отладить ребенка. Мой обходной путь делает это. Тем не менее, для ясности я перефразировал свой ответ.
mpb