自分用にメモ
coreを吐くように設定する
起動スクリプトなどで以下のコマンドを実行させる
echo '/tmp/core.%h.%e.%t' > /proc/sys/kernel/core_pattern
ulimit -c unlimited
-
/proc/sys/kernel/core_pattern
は初期値でプロセスに渡されている場合もあるので,明示的に指定する -
ulimit
でコアファイルのサイズを無制限に設定する
バイナリ側の準備
- 自分でコンパイルしているバイナリならデバッグオプションを有効化する.パッケージならデバッグシンボルを入れておく
- docker build する時にソースコードは消さずないようにDockefileを修正する
実行
-
/proc/sys/kernel/core_pattern
へ書き込みができるように docker run時に
--privileged
オプションをつける - あとは通常通りに docker run する
Segmentation faultした後
-
docker ps -a
で落ちたコンテナのcontainer IDを調べる -
docker commit
コマンドを使ってコンテナからイメージを作成する- 例)
docker commit -m "coredump" 92b8935a7cd7
(92b8935a7cd7は container ID)
- 例)
-
docker run -it <作成したimage ID> sh
などとしてsegmentation faultした直後の状態のコンテナを起動する
起動後
- gdbをインストールする(すでに入っているなら不要)
-
gdb /path/to/binary /path/to/corefile
で起動する - 後はよしなに