Linux core dump使用

JYRoy發表於2021-02-08

什麼是 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檔案。

注意

  1. 如果管道符號(‘|’)被用在core file pattern中,core dump檔案的大小限制就不起作用了。

參考文獻

本文部分內容翻譯自

  1. https://medium.com/@sourabhedake/core-dumps-how-to-enable-them-73856a437711
  2. http://manpages.ubuntu.com/manpages/precise/man5/core.5.html

有興趣的同學可以直接看英文原版。如有翻譯問題請在評論區指出。

相關文章