環境:Vagrantでcentos 7.6.1810 (Core)
プログラムがエラーの場合にコアダンプを吐く
何らかの理由(セグメンテーション違反とか)でプログラムがエラーで終了した場合、
デフォルトではそのプロセスのカレントのディレクトリにcore.PIDという形で吐かれる。
#cat /proc/sys/kernel/core_pattern
core
なおcentosではデフォルトではコアダンプは吐かない設定となっているので
vi /etc/systemd/system.conf
で
DumpCore=yes
DefaultLimitCORE=infinity
を設定する必要がある。
・ダンプコアを吐かせる
・ダンプコアのデフォルトの最大値を無制限にする。
プログラムのカレントディレクトリってどこ?
テストしてみる
#sleep 1000000000000&
[1] 11043
sleepコマンドがPID 11043が動いているので
何のファイルがあるか確認してみる。
#ls -l /proc/11043/cwd/
total 8
-rw-r--r--. 1 vagrant vagrant 31 Jan 22 13:32 test.txt
-rw-r--r--. 1 vagrant vagrant 3009 Jan 14 07:48 Vagrantfile
vagrantユーザのホームディレクトリが表示された。
実際にプロセスをセグメンテーション違反させる。
killコマンドでシグナルを送る
kill -l
で遅れるシグナル確認できる。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
11番がセグメンテーション違反のシグナルなので
11043のプロセスにシグナルを送る。
$ kill -11 11043
vagrantユーザのホームディレクトリを確認すると、
#ls
core.11043 test.txt Vagrantfile
対象のプロセスIDのcoreファイルが作成された。
あとはgdbとかで解析したりなんなりする。