web-dev-qa-db-ja.com

Dockerコンテナーでコアファイルを生成する方法

ulimitコマンドを使用して、コアファイルのサイズを設定します。

ulimit -c unlimited

そして、gcc --gオプションを使用してcソースコードをコンパイルしました。次にa.outが生成されます。コマンド後

./a.out実行時エラーがあります。

(core dumped)

コアファイルは生成されませんでした(例:core.294340)

コアファイルを生成する方法は?

14
leeyc

まず、コンテナがコンテナファイルシステムの既存の場所にコアを書き込むことを確認します。コア生成設定は、コンテナーではなくホストで設定されます。例:

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

/ coresフォルダーにコアを生成します。

Dockerfileで、そのフォルダーを作成します。

RUN mkdir /cores

コアサイズの制限を指定する必要があります。 ulimitシェルコマンドは機能しません。これは、現在のシェルでのみ影響するためです。 docker runオプション--ulimitを、ソフト制限とハード制限とともに使用する必要があります。 Dockerイメージをビルドしたら、次のようにコンテナを実行します。

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

ここで、coredumps_volumeは、コンテナーが終了した後もコアが存続する、すでに作成したボリュームです。例えば。

docker volume create coredumps_volume
9

既存のプロセスのコアダンプを生成する場合、たとえばgcoreを使用する場合は、--cap-add=SYS_PTRACEでコンテナーを起動して、コンテナー内でrootとして実行されているデバッガーがプロセスにアタッチできるようにする必要があります。 (信号のコアダンプについては、他の回答を参照してください)

2