Как я могу присоединить GDB к процессу, запущенному в Docker-контейнере?
У меня есть длительный процесс в контейнере Docker, к которому я хотел бы присоединить GDB, чтобы посмотреть, какие потоки работают, и получить трассировки стека. Я могу присоединиться к процессу с хоста, но не могу разрешить символы, потому что исполняемый файл находится в другом месте файловой системы (он находится в томе, смонтированном в докере), а общие системные библиотеки застряли в образе файловой системы докера. где-то в /var/lib/docker.
Я могу сгенерировать файл ядра и использовать gdb, чтобы посмотреть на него, указав путь хоста к исполняемому файлу, но поскольку все системные библиотеки находятся в неправильных местах и загружаются в неправильных местах в файле ядра, я не получаю информация из этого.
Есть ли у меня варианты, которые я упустил?
1 ответ
Вы можете присоединиться к процессу с помощью gdb
экземпляр работает в вашем контейнере, подключившись к работающему контейнеру через lxc-attach.
Примечание: GDB должен быть уже установлен в этом контейнере, или вы должны установить его.
# find your container ID
sudo docker ps
# list of your containers - container ID is 1234567890
# find your full container ID
sudo docker ps --no-trunc -q| grep <short ID>
sudo lxc-attach -n <container long ID>
root@1234567890:/#
# optionally, you can install gdb now if it is not installed
# yum install gdb
root@1234567890:/# gdb
...
(gdb) attach 1
ОБНОВЛЕНИЕ 2017-04:
Теперь доступен более простой рабочий процесс с использованием docker exec (благодаря @42n4).
# find your container ID
sudo docker ps
# list of your containers - container ID is 1234567890
docker exec -i -t 1234567890 /bin/bash
root@1234567890:/#
# optionally, you can install gdb now if it is not installed
# yum install gdb
root@1234567890:/# gdb
...
(gdb) attach 1