Почему GDB не может прикрепить к серверному приложению, вызванному с INETD?
Вопрос
У меня есть серверное приложение, которое можно вызвать для клиента, используя INETD. Однако, если я попытаюсь прикрепить к серверному процессу, который был запущен с INETD, я получаю следующий ответ: PTRACE: Операция не разрешена.
gdb --annotate=3 /my/app/here <processId>
Current directory is /usr/local/bin/
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Reading symbols from /usr/local/bin/flumed...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
Attaching to program: /my/app/here, process <processId>
ptrace: Operation not permitted.
/usr/local/bin/<processId>: No such file or directory.
(gdb)
Решение 2
По -видимому, все становится причудливым с inetd, где пользователь не является корнем. Вы получите процесс со странными разрешениями. Например, вы не можете прочитать/proc/self/exe, даже если разрешения 777. Я подозреваю, что эта проблема более такая же. Несмотря на то, что я изнася в процессе, у меня нет разрешений. Использование Root для GDB - это обход.
Другие советы
Решением для меня было следующее:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Дальше, что сказал Tgoodhart, другие ptrace
Пользователям нравится /usr/bin/strace
также будет блокировать gdb
.
Я также видел, как эта проблема возникает, когда несколько экземпляров GDB работают одновременно, обычно потому, что я не смог правильно закрыть GDB. Закрытие этих просочившихся экземпляров исправило проблему.
Пожалуйста, запустите следующую команду, чтобы решить вашу проблему:
sudo chmod +s/usr/bin/gdb