0%

使用gdb调试docker容器中的python进程

根据进程特征找到宿主机中对应的进程

docker容器

1
2
# ps -ef | grep 7687 
okp 7687 784 1 20:57 ? 00:00:00 /home/okp/.pyenv/versions/3.6.5/envs/xxx/bin/python3.6 /home/okp/.pyenv/versions/xxx/bin/celery -A celery_worker.celery worker -c 3 --loglevel=info

宿主机

1
2
# ps -ef | grep '20:57 ?        00:00:00 /home/okp/.pyenv/versions/3.6.5/envs/xxx/bin/python3.6 /home/okp/.pyenv/versions/xxx/bin/celery -A celery_worker.celery worker -c 3 --loglevel=inf[o]' 
hzmc 31771 9480 0 20:57 ? 00:00:00 /home/okp/.pyenv/versions/3.6.5/envs/xxx/bin/python3.6 /home/okp/.pyenv/versions/xxx/bin/celery -A celery_worker.celery worker -c 3 --loglevel=info

在宿主机安装gdb

1
yum install gdb

查询容器的UpperDir

1
sudo docker inspect <container-id> | grep diff

例如:

/var/lib/docker/overlay2/e12dcd0006e71a104a4d38bb8bedbcd7752fb8d0eae78280ff0fee655f6e6bdc/diff

拼接pythonpath

pythonpath = <UpperDir> - ‘/diff’ + <容器内pythonpath> (容器内pythonpath可以在第一步的进程信息中获得)

例如:

/var/lib/docker/overlay2/e12dcd0006e71a104a4d38bb8bedbcd7752fb8d0eae78280ff0fee655f6e6bdc/merged/home/okp/.pyenv/versions/3.6.5/envs/okp-ins-demo/bin/python3.6

使用gdb

输入gdb命令进入交互式命令行

1
2
3
4
set auto-load safe-path /
file /var/lib/docker/overlay2/e12dcd0006e71a104a4d38bb8bedbcd7752fb8d0eae78280ff0fee655f6e6bdc/merged/home/okp/.pyenv/versions/3.6.5/envs/okp-ins-demo/bin/python3.6
attach 31771
py-bt