Docker中产生Core Dump文件

产生Core Dump 在Linux中

要使得程序崩溃时产生core dump文件,首先需要设置core文件的大小,默认的core dump文大小最大为0,也就是默认不产生,在这里我们就不做限制,执行

ulimit -c unlimited

异常重启时会产生  core.xxxx文件 如果配置了一直重启该容器则会产生大量的文件直到把宿主机硬盘占满

 

可以通过以下命令查看当前ulimit配置

[root@proxy-demo ~]# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63013
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 60000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 63013
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

当 core file size 为unlimited时,程序崩溃就会产生core文件,顺便整理一下ulimit文件使用方法:

在程序中指定产生Core Dump文件

在写程序的时候,我们可能会希望在一些严重错误发生的时候终止程序运行。除了打日志和 exit() 以外,我们还可以选择使用 abort()。当执行 abort() 的时候,程序直接退出,不执行清扫,并且会产生 Core Dump 文件(如果 ulimit 允许的话)。

在Docker中产生Core Dump文件

在宿主机上执行

echo '/tmp/core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern

这是因为系统在产生 Core Dump 文件的时候是根据 /proc/sys/kernel/core_pattern 的设定。而默认的设定是 |/usr/share/apport/apport %p %s %c %P,也就是用管道传给 apport。然而 Docker 里面的系统不一定有装 apport,并且 /proc 又是直接挂到 Docker 里面的,所以我们就得改成放到固定的位置去,也就是 /tmp。

另外,在 docker run 的时候要加上以下参数

--ulimit core=-1 --security-opt seccomp=unconfined

前者就是把 Core Dump 文件的大小设置为无限制,后者是为了开放 ptrace 系列高权限的系统调用,这样我们才可以在 Docker 里面使用 GDB。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值