Как я могу присоединить 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
Другие вопросы по тегам