如何在docker容器中生成核心文件?

时间:2015-02-05 03:19:03

标签: docker gcc coredump

使用ulimit命令,我设置了核心文件大小。

ulimit -c unlimited

我使用gcc -g选项编译了c源代码。 然后a.out生成。 在命令之后

./a.out 存在运行时错误。

(core dumped)

但未生成核心文件。(例如core.294340)

如何生成核心文件?

2 个答案:

答案 0 :(得分:6)

首先确保容器将核心写入容器文件系统中的现有位置。核心生成设置在主机中设置,而不是在容器中设置。例如:

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

将在文件夹/核心中生成核心。

在Dockerfile中,创建该文件夹:

RUN mkdir /cores

您需要指定核心大小限制; ulimit shell命令不起作用,因为它只影响当前的shell。您需要使用具有软硬限制的docker run选项--ulimit。构建Docker镜像后,运行容器,如:

docker run --ulimit core=99999999999:99999999999 --mount source=coredumps_volume,target=/cores ab3ca583c907 ./a.out

其中coredumps_volume是您已创建的卷,其中核心将在容器终止后保留。 E.g。

docker volume create coredumps_volume

答案 1 :(得分:1)

如果要生成现有进程的核心转储,例如使用gcore,则需要以--cap-add=SYS_PTRACE启动容器,以允许以根用户身份运行的调试器附加到容器中。处理。 (有关信号的核心转储,请参见其他答案)