Вопрос или проблема
Я только что обновился с 10.04 до 11.04, и gdb больше не позволяет мне подключаться к процессам. Я получаю ошибку:
Подключение к процессу 10144. Не удалось
подключиться к процессу. Если ваш uid
совпадает с uid целевого процесса,
проверьте настройку
/proc/sys/kernel/yama/ptrace_scope или
попробуйте снова как пользователь root. Для получения
дополнительных
сведений смотрите
/etc/sysctl.d/10-ptrace.conf ptrace:
Операция не разрешена.
Как мне это исправить, чтобы я мог отлаживать снова без sudo?
В Maverick Meerkat (10.10) Ubuntu внедрила патч, который запрещает ptracing не-дочерних процессов пользователям, не являющимся root – т.е. только процесс, который является родителем другого процесса, может ptrace его для обычных пользователей, в то время как root по-прежнему может 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.
Если вы предпочитаете оставить /proc/sys/kernel/yama/ptrace_scope
установленным на его значение по умолчанию 1
, вы можете рассмотреть возможность использования gdb
для запуска программы, которую вы хотите отлаживать. Затем вы можете вызвать отладчик, просто нажав ^C
. Например, чтобы отлаживать (скучную) программу sleep 60
, выполните следующее:
$ gdb -q sleep -ex 'run 60'
Вот полный пример.
$ gdb -q sleep -ex 'run 60'
Чтение символов из sleep...(символы отладки не найдены)...готово.
Запуск программы: /bin/sleep 60
^C
Программа получила сигнал SIGINT, Прерывание.
0x00007ffff7ad5d60 в __nanosleep_nocancel () по адресу ../sysdeps/unix/syscall-template.S:81
81 ../sysdeps/unix/syscall-template.S: Нет такого файла или директории.
(gdb) backtrace
#0 0x00007ffff7ad5d60 в __nanosleep_nocancel () по адресу ../sysdeps/unix/syscall-template.S:81
#1 0x0000000000403cd7 в ?? ()
#2 0x0000000000403b88 в ?? ()
#3 0x00000000004016c9 в ?? ()
#4 0x00007ffff7a35ec5 в __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<оптимизировано>,
fini=<оптимизировано>, rtld_fini=<оптимизировано>, stack_end=0x7fffffffe9f8) по адресу libc-start.c:287
#5 0x00000000004017d5 в ?? ()
(gdb) continue
Продолжаю.
[Inferior 1 (процесс 3531) вышел нормально]
(gdb) quit
Поскольку /bin/sleep
был (неудивительно) скомпилирован без информации отладки, полученный обратный трассировка содержит минимальную информацию.
Также возможно использовать setpriv
, чтобы запустить программу с возможностями SYS_PTRACE
:
sudo setpriv --reuid=$UID --regid=$(id -g) --inh-caps=+SYS_PTRACE --ambient-caps=+SYS_PTRACE --clear-groups
Ответ или решение
После обновления с Ubuntu 10.04 до 11.04 вы столкнулись с проблемой, при которой gdb не может прикрепиться к процессам, и получаете сообщение об ошибке, связанной с правами доступа. Эта проблема вызвана внедрением новых настроек безопасности, связанных с использованием функции ptrace, которая необходима для отладки процессов.
Проект Yama и ограничения ptrace
С версии Ubuntu 10.10 были внесены изменения в безопасный механизм обработки системных вызовов, что ограничивает возможности обычных пользователей по подключению к процессам, отличным от дочерних. Это было сделано для повышения общей безопасности системы; теперь только родительский процесс может воспользоваться функцией ptrace для отладки дочерних процессов. Это объясняет причину, по которой вы можете использовать gdb с привилегиями суперпользователя (sudo), но не можете сделать то же самое без них.
Возможные решения проблемы
Есть несколько способов обойти проблему и восстановить возможность использовать gdb без sudo:
1. Изменение параметра ptrace_scope
Вы можете временно отключить ограничения ptrace следующим образом:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Это изменение будет действовать до следующей перезагрузки. Если вы хотите сделать это изменение постоянным, отредактируйте файл конфигурации:
sudo nano /etc/sysctl.d/10-ptrace.conf
Найдите строку:
kernel.yama.ptrace_scope = 1
И измените её на:
kernel.yama.ptrace_scope = 0
После изменения сохраните файл и примените изменения:
sudo sysctl -p /etc/sysctl.d/10-ptrace.conf
2. Альтернативный способ с использованием gdb
Если вы предпочитаете оставить настройки ptrace_scope без изменений (на уровне 1), вы можете использовать gdb для запуска программы, которую хотите отлаживать. Это позволит избежать необходимости прикрепления к уже запущенному процессу. Например, чтобы отлаживать программу sleep
, выполните следующую команду:
gdb -q sleep -ex 'run 60'
После того как программа будет запущена, вы можете остановить её, нажав ^C
, и затем использовать команды gdb для отладки.
3. Использование setpriv
Другой подход заключается в использовании утилиты setpriv
, которая позволяет запускать программу с правами на использование ptrace. Это можно сделать с помощью следующей команды:
sudo setpriv --reuid=$UID --regid=$(id -g) --inh-caps=+SYS_PTRACE --ambient-caps=+SYS_PTRACE --clear-groups
Таким образом, вы получите возможность отлаживать процессы без необходимости изменять системные настройки безопасности.
Заключение
Проблема с gdb, связанная с невозможностью прикрепления к процессам после обновления операционной системы, обусловлена новыми мерами безопасности. Однако, применяя описанные выше решения, вы сможете восстановить возможность отладки без использования прав суперпользователя. Выбор подходящего решения зависит от ваших нужд в безопасности и удобства работы.