Как решить "операция ptrace не разрешена" при попытке присоединить GDB к процессу?

Я пытаюсь прикрепить программу с помощью 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;
}

Но он все равно возвращает ту же ошибку. Как я могу прикрепить его к отладчикам?

Ответ 1

Если вы используете Docker, вам, вероятно, понадобятся следующие опции:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined

Ответ 3

Не обращаясь к вышеупомянутому варианту использования, но у меня была эта проблема:

Проблема. Случилось так, что я начал свою программу с sudo, поэтому при запуске gdb она давала мне ptrace: Operation not permitted.

Решение: sudo gdb ...

Ответ 4

Я хотел бы добавить, что мне нужно --security-opt apparmor=unconfined вместе с параметрами, упомянутыми @wisbucky. Это было в Ubuntu 18.04 (как клиент Docker, так и хост). Поэтому полный вызов для включения отладки GDB в контейнере:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

Ответ 5

Возможно, кто-то связал этот процесс с gdb.

  • ps -ef | grep gdb

не может gdb дважды применить тот же процесс.

Ответ 6

Я не знаю, что вы делаете с LD_PRELOAD или функцией ptrace.

Почему бы вам не попробовать подключить gdb к очень простой программе? Создайте программу, которая просто многократно печатает Hello или что-то еще, и используйте gdb -pid [hello program PID] для прикрепления к ней.

Если это не работает, у вас действительно есть проблема.

Другой проблемой является идентификатор пользователя. Является ли программа, которую вы трассируете, настраивается на другой UID? Если это так, вы не можете использовать его, если вы не используете один и тот же идентификатор пользователя или root.

Ответ 7

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

Ответ 8

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

/# выход