docker容器中运行 C++ 程序,有时崩溃,但没日志,也没提示。之前掌握了 coredump 调试,本文在容器中尝试。
操作
先查看core大小:
1 | $ ulimit -a | grep core |
设置:
1 | $ulimit -c unlimited |
再查看:
1 | $ ulimit -a | grep core |
设置路径
1 | $ sudo echo 'core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern |
运行镜像:
1 | docker run -v /home:/home -it latelee/myserver bash |
进入对应的程序目录:
1 | # cd /home/latelee/docker/test/myserver/ |
运行有段错误的测试程序:
1 | # ./myserver |
查看是否产生:
1 | # ls |
生成的coredump文件为core.1535079291.myserver.11
core设置永久生效
编辑/etc/security/limits.conf
文件,修改core相关的配置项,如下:
1 | * soft core unlimited |
编辑/etc/sysctl.conf文件,在文件最后添加:
1 | kernel.core_pattern = core.%t.%e.%p |
注:以上2个文件均需root权限打开。
小结
0、程序必须使用-g编译,即程序是带有调试信息的,否则,即使有coredump,也看不出问题所在。
1、先在宿主机上执行ulimit -c unlimited
,并且设置生成coredump路径。
2、再在docker容器里执行程序。
经验
1、网上有说法提到在docker run
时带--ulimit core=-1 --security-opt seccomp=unconfined
参数,经验证,带与不带都可以生成coredump文件。由于笔者一般使用docker-compose
来编排容器,这个还不知道怎么写到docker-compose.yml
文件,所以暂不使用。
2、关于设置coredump文件路径,建议在/tmp或单独挂载的目录,上文仅是演示,没有实际指导意义。