什麼是 core dump?
core dump是一個當程式意外終止時包含程式記憶體內容的檔案。當程式崩潰的時候,core dump由kernel觸發。core dump可以作為程式崩潰時的事後快照(post-mortem snapshot),尤其是在難以可靠的重現故障的情況下。
大多數Linux系統預設開始core dump。但是通常這麼做是有代價的。一方面我們想要去收集資訊從而提高穩定性並且幫助我們排除故障;另一方面,我們希望限制debug的資料並且避免洩漏一些敏感資料。第一個選擇適合於研究不穩定的程式的機器。第二個選擇適用於儲存和處理敏感資料。
開啟 core dump
為了開啟core dump,我們需要開啟一下系統的軟限制(soft limits)。
ulimit -S -c unlimited
- -S:soft limit
- -c:core dump的大小
如果想要永久的開啟core dump,我們可以在 /etc/security/limits.conf 檔案中新增下面這一句,
* soft core unlimited
除了指定為unlimited,即沒有大小限制外,我們還可以直接指定大小,例如
ulimit -c 1024 限制大小為1024
ulimit -c 0 限制大小為0,即不輸出core檔案
當我們指定數字為0的時候,就意味著不輸出core檔案了。
當我們只使用-c引數的時候,就是檢視core檔案的大小限制,也就是關閉了core dump。
ulimit -c
關閉 core dump
core dump 通常需要佔用我們的磁碟空間並且可能會包含一些敏感資料,所以我們有的時候需要關閉它。
我們可以通過更新soft limit來關閉core dump
ulimit -S -c 0
如果想要永久的關閉core dump,我們可以在 /etc/security/limits.conf 檔案中新增下面這一句,
* soft core 0
* hard core 0
core dump在哪?
Linux通過一個配置的地址來儲存core dump
預設路徑是
/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I
(%s %c %p %u %g %t e %P %I為core dump檔案的命令規則,會在下一小節中解釋)
我們可以通過sysctl命令來改變這個位置
sudo sysctl -w kernel.core_pattern=/coredumps/core-%e-%s-%u-%g-%p-%t
這個命令將會更新core_pattern檔案/proc/sys/kernel/core_pattern到一個新的位置。
也可以通過在/etc/sysctl.conf中新增下面的程式碼來永久的改變core dump檔案的路徑,
kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t"
core dump檔案的命名規則
預設情況下,一個core dump檔案被命名為core,但是在/proc/sys/kernel/core_pattern檔案中我們可以定義core dump檔案的命名規則(參考上一節中的例子)。這個規則使用%識別符號來代替一些當core dump檔案被建立的時候可能的傳來的值。
- %%:一個%字元
- %p:dumped程式的PID
- %u:dumped程式的真實UID
- %g:dumped程式的真實GID
- %s:導致dump的訊號個數
- %t:dump的時間,精確到秒
- %h:hostname
- %e:可執行檔名
- %c:core file大小的限制
例子
根據上面提到的命令,我們現在可以進行一些core dump的操作,檢視core dump檔案的大小限制、開啟core dump、更新core file pattern去儲存core dump到磁碟上。下面的操作可以看到在程式崩潰後產生了一個core dump檔案。
Docker中使用core dump
在docker容器中,使用core dump需要在docker啟動的時候就做好設定。我們可以利用--ulimit引數進行設定。
docker run -it -d --name=core-test --ulimit core=-1 image-test bash
這樣在容器中,如果發生了程式崩潰,我們就可以在pwd,即當前目錄下看到core檔案。
注意
- 如果管道符號(‘|’)被用在core file pattern中,core dump檔案的大小限制就不起作用了。
參考文獻
本文部分內容翻譯自
- https://medium.com/@sourabhedake/core-dumps-how-to-enable-them-73856a437711
- http://manpages.ubuntu.com/manpages/precise/man5/core.5.html
有興趣的同學可以直接看英文原版。如有翻譯問題請在評論區指出。