Ответ 1
Если вы используете Docker, вам, вероятно, понадобятся следующие опции:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
Я пытаюсь прикрепить программу с помощью GDB, но она возвращает:
Присоединение к процессу 29139
Не удалось подключиться к процессу. Если ваш uid совпадает с uid целевого процесса, проверьте настройку /proc/sys/kernel/yama/ptrace_scope или попробуйте снова как пользователь root. Для получения дополнительной информации см. /Etc/sysctl.d/10-ptrace.conf
ptrace: операция не разрешена.
gdb-debugger возвращает "Не удалось подключиться к процессу, проверьте привилегии и повторите попытку".
strace возвращает "attach: ptrace (PTRACE_ATTACH,...): операция не разрешена"
Я изменил "kernel.yama.ptrace_scope" 1 на 0 и /proc/sys/kernel/yama/ptrace_scope
1 на 0 и попытался set environment LD_PRELOAD=./ptrace.so
следующим образом:
#include <stdio.h>
int ptrace(int i, int j, int k, int l) {
printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
return 0;
}
Но он все равно возвращает ту же ошибку. Как я могу прикрепить его к отладчикам?
Если вы используете Docker, вам, вероятно, понадобятся следующие опции:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
Это связано с ужесточением ядра в Linux; вы можете отключить это поведение echo 0 > /proc/sys/kernel/yama/ptrace_scope
или изменив его в /etc/sysctl.d/10-ptrace.conf
См. также эту статью об этом в Fedora 22 (со ссылками на документацию) и эта ветка комментариев о Ubuntu и.
Не обращаясь к вышеупомянутому варианту использования, но у меня была эта проблема:
Проблема. Случилось так, что я начал свою программу с sudo
, поэтому при запуске gdb она давала мне ptrace: Operation not permitted
.
Решение: sudo gdb ...
Я хотел бы добавить, что мне нужно --security-opt apparmor=unconfined
вместе с параметрами, упомянутыми @wisbucky. Это было в Ubuntu 18.04 (как клиент Docker, так и хост). Поэтому полный вызов для включения отладки GDB в контейнере:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined
Возможно, кто-то связал этот процесс с gdb.
не может gdb дважды применить тот же процесс.
Я не знаю, что вы делаете с LD_PRELOAD или функцией ptrace.
Почему бы вам не попробовать подключить gdb к очень простой программе? Создайте программу, которая просто многократно печатает Hello или что-то еще, и используйте gdb -pid [hello program PID] для прикрепления к ней.
Если это не работает, у вас действительно есть проблема.
Другой проблемой является идентификатор пользователя. Является ли программа, которую вы трассируете, настраивается на другой UID? Если это так, вы не можете использовать его, если вы не используете один и тот же идентификатор пользователя или root.
Я столкнулся с той же проблемой и попробовал много решений, но, наконец, я нашел решение, но на самом деле я не знаю, в чем проблема. Сначала я изменил значение ptrace_conf и зарегистрировался в Ubuntu в качестве корня, но проблема все еще появляется. Но самое странное, что случилось, - это gdb показал мне сообщение, в котором говорится:
Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf
warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.
С терминалом командной строки ps процесс 3755 не указан.
Я нашел процесс 3755 в /proc/ $pid, но я не понимаю, что это было!
Наконец, я удалил целевой файл (foo.c), который я пытаюсь подключить к нему vid gdb и программу tracer c, используя Syscall PTRACE_ATTACH, а в другой папке я создал другую c-программу и скомпилировал ее.
проблема решена, и я смог подключиться к другому процессу либо с помощью gsb или ptrace_attach syscall.
(gdb) attach 4416
Attaching to process 4416
и я посылаю много сигналов для обработки 4416. Я протестировал его как с gdb, так и с ptrace, оба они работают правильно.
На самом деле я не знаю проблемы, что было, но я думаю, что это не ошибка в Ubuntu, как многие сайты ссылались на нее, такие https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root
Jesup ответ правильный; это связано с усилением ядра Linux. В моем случае я использую Docker Community для Mac, и чтобы изменить флаг, я должен войти в оболочку LinuxKit с помощью Джастина Кормака nsenter (ссылка: https://www.bretfisher.com/docker-for-mac-commands -for-get-in-local-docker-vm/).
docker run -it --rm --privileged --pid=host justincormack/nsenter1
/# cat/etc/issue
Добро пожаловать в LinuxKit
## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === { / ===- \______ O __/ \ \ __/ \____\_______/
/# cat/proc/sys/kernel/yama/ptrace_scope
1
/# echo 0>/proc/sys/kernel/yama/ptrace_scope
/# выход