私のdockerエッセイ24:dockerはcoredumpファイルを生成します
1869 ワード
dockerコンテナでC++プログラムを実行し、クラッシュすることがありますが、ログもプロンプトもありません.以前coredumpデバッグを把握していましたが、コンテナで試してみました.
操作
まずcoreサイズを表示します.
設定:
再表示:
パスの設定
ミラーの実行:
対応するプログラムディレクトリに入ります.
エラーのあるテストプログラムを実行します.
生成するかどうかを確認します.
生成されたcoredumpファイルは
core設定が永続的に有効
/etc/sysctlを編集します.confファイル、ファイルの最後に追加:
注意:以上の2つのファイルはroot権限で開く必要があります.
小結
0、プログラムは-gコンパイルを使用する必要があります.すなわち、プログラムはデバッグ情報を持っています.そうしないと、coredumpがあっても問題は見えません.1.まず、
経験
1、ネット上では
操作
まずcoreサイズを表示します.
$ ulimit -a | grep core
core file size (blocks, -c) 0
設定:
$ulimit -c unlimited
再表示:
$ ulimit -a | grep core
core file size (blocks, -c) unlimited
パスの設定
$ sudo echo 'core.%t.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
ミラーの実行:
docker run -v /home:/home -it latelee/myserver bash
対応するプログラムディレクトリに入ります.
# cd /home/latelee/docker/test/myserver/
エラーのあるテストプログラムを実行します.
# ./myserver
Segmentation fault (core dumped)
生成するかどうかを確認します.
# ls
Dockerfile core.1535079291.myserver.11 entrypoint.sh config.ini myserver
生成されたcoredumpファイルは
core.1535079291.myserver.11
です.core設定が永続的に有効
/etc/security/limits.conf
ファイルを編集し、core関連の構成項目を以下のように変更します.* soft core unlimited
root hard core unlimited
/etc/sysctlを編集します.confファイル、ファイルの最後に追加:
kernel.core_pattern = core.%t.%e.%p
注意:以上の2つのファイルはroot権限で開く必要があります.
小結
0、プログラムは-gコンパイルを使用する必要があります.すなわち、プログラムはデバッグ情報を持っています.そうしないと、coredumpがあっても問題は見えません.1.まず、
ulimit -c unlimited
をシンクホスト上で実行し、coredumpを生成するパスを設定する.2、dockerコンテナでプログラムを実行します.経験
1、ネット上では
docker run
の時に--ulimit core=-1 --security-opt seccomp=unconfined
のパラメータを持っていて、経験証があって、持っていなくてもcoredumpファイルを生成することができます.筆者は一般的にdocker-compose
を用いて容器を編成しているが,これはまだdocker-compose.yml
文書にどのように書くか分からないので,しばらく使用しない.2、coredumpファイルパスの設定については、/tmpまたは単独でマウントするディレクトリを推奨します.上記はプレゼンテーションのみで、実際の指導的な意味はありません.