LoginSignup
7
6

More than 5 years have passed since last update.

Docker内で segmentation fault するプロセスのcoreを取って調べる方法

Posted at

自分用にメモ

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 で起動する
  • 後はよしなに
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6