после обновления gdb не может присоединиться к процессу

Вопрос или проблема

Я только что обновился с 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, связанная с невозможностью прикрепления к процессам после обновления операционной системы, обусловлена новыми мерами безопасности. Однако, применяя описанные выше решения, вы сможете восстановить возможность отладки без использования прав суперпользователя. Выбор подходящего решения зависит от ваших нужд в безопасности и удобства работы.

Оцените материал
Добавить комментарий

Капча загружается...