#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 отказался подключать запущенный процесс:
- $ kubectl exec -it POD_NAME —container debugger — gdbserver —attach:44444 59
Не удается подключиться к lwp 59: нет такого файла или каталога (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