跳到主要内容

Docker容器Core文件生成

· 阅读需 2 分钟
阅读量: 101
阅读人次: 102
amass
一个躺不平的板砖人

在 Ubuntu Docker 容器中启用并自定义 Core Dump 的生成路径,涉及容器内部配置和宿主机内核设置两个层面。

这是因为 Core Dump 的处理是由宿主机内核(Kernel)控制的,容器只是共享了宿主机的内核。

内核在生成 Core Dump 时,会根据 /proc/sys/kernel/core_pattern 的设置来决定保存路径。需要执行命令临时生效:

sysctl -w kernel.core_pattern=/tmp/coredumps/core.%e.%t.%p

或修改宿主机上的文件永久生效:

/etc/sysctl.conf
kernel.core_pattern=/tmp/coredumps/core.%e.%t.%p

然后执行:

sysctl -p
备注

这里的路径 /tmp/cores 必须在容器内部也存在,或者通过挂载卷映射进去,否则容器进程崩溃时会找不到路径导致生成失败。

在启动容器时,必须放开资源限制(ulimit)并提供足够的权限:

  • --privileged:赋予容器追踪进程的权限。
  • --ulimit core=-1:解除 core 文件大小限制(设置为无限)。
  • 挂载目录:将宿主机的 core 存放目录映射到容器内。
docker run -d \
--privileged \
--ulimit core=-1 \
-v /tmp/coredumps:/tmp/coredumps \
--name my_ubuntu_container \
ubuntu:latest

测试代码:

#include <stdio.h>

void crash_function() {
printf("准备触发崩溃...\n");
int *ptr = NULL; // 定义一个空指针
*ptr = 10; // 尝试向空指针写入数据,触发段错误
}

int main() {
printf("程序启动,PID: %d\n", getpid());
crash_function();
return 0;
}

编译运行后得到 Core Dump 文件后:

gdb ./app /tmp/coredumps/core.app.1768486704.127