gdbserver не подключается к запущенному процессу в контейнере docker

#docker #gdbserver

#docker #gdbserver

Вопрос:

В моем контейнере docker (на основе дистрибутива SUSE SLES 15) установлены как исполняемый файл C (с улучшенным кодом отладки), так и исполняемый файл gdbserver.
Прежде чем делать что-либо продуктивное, исполняемый файл C спит в течение 5 секунд, затем инициализирует и обрабатывает данные из базы данных. Времени обработки достаточно, чтобы подключить его к gdbserver.
Исполняемый файл C запускается в фоновом режиме, и его идентификатор процесса возвращается на консоль.
Сразу после этого запускается gdbserver и подключается к тому же идентификатору процесса.

Проблема: сервер gdbserver жалуется, что не может подключиться к процессу:

Не удается подключиться к lwp 59: нет такого файла или каталога (2)
, выходящего

В другой попытке я скопировал тот же исполняемый файл gdbserver в /tmp в контейнере docker.
Запуск этого gdbserver выдал другой ответ об ошибке:

Не удается подключиться к процессу 220: операция не разрешена (1)
Завершение

Было проверено, что в обоих случаях процесс все еще выполняется. ‘ps -e’ четко показывает идентификатор процесса и имя процесса.
Если процесс уже завершен, выдается другое сообщение об ошибке; это понятно и объяснять не нужно:

gdbserver: не удается открыть файл / proc ‘/proc/79/status’

gdbserver был запущен один раз снаружи контейнера и один раз изнутри.
В обоих сценариях сервер gdbserver отказался подключать запущенный процесс:

  1. $ kubectl exec -it POD_NAME —container debugger — gdbserver —attach:44444 59
    Не удается подключиться к lwp 59: нет такого файла или каталога (2)
    , выходящего
  2. $ kubectl exec -it POD_NAME — /bin/bash
    bash-4.4 $ cd / tmp
    bash-4.4 $ ./gdbserver 10.0.2.15:44444 —attach 220
    Не удается подключиться к процессу 220: операция не разрешена (1)
    Завершение

Может ли кто-нибудь объяснить, почему gdbserver отказывается подключаться к указанному процессу, и дать совет, как преодолеть несоответствие, т. Е. Где / что мне нужно проверить, чтобы подготовить правильное рукопожатие между исполняемым файлом C и gdbserver?

Ответ №1:

Основная причина, по которой gdbserver не смог подключиться к запущенному процессу C , связана с повышением безопасности в Ubuntu (версии> = 10.10):
по умолчанию процесс A не может отслеживать запущенный процесс B, если B не является прямым дочерним процессом A (или A запускается от имени root).
Прямая отладка по-прежнему всегда разрешена, например gdb EXE , и strace EXE .

Ограничение можно ослабить, изменив значение /proc/sys/kernel/yama/ptrace_scope с 1 (= по умолчанию) на 0 (= трассировка разрешена для всех процессов). Параметр безопасности можно изменить с помощью:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Все ссылки на описание области видимости ptrace относятся к следующему сообщению, см. 2-й ответ Элиа Кагана — спасибо за подробное объяснение! — здесь:
https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root