产生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。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐