core dump文件

在程序運行過程中,發生segmentation fault,如果系統提示core dumped,說明爲產生core文件。core文件會保存程序運行時的信息,如內存鏡像、堆棧調用、寄存器等等,利用相關的工具如gdb可以還原程序發生問題時的情況,便於定位問題代碼。

core文件是否生成,以及在哪裏生成和文件名等情況,涉及如下文件/proc/sys/kernel/core_uses_pid、/proc/sys/kernel/core_pattern、/proc/sys/kernel/core_pile_limit、/proc/sys/fs/suid_dumpable。首先執行ulimit -c,如果輸出結果爲0表明系統不能生產core文件,這時可以執行ulimit -c unlimited,使得可以生產core文件,並且不限制core文件的大小。生成的core的文件名則由core_pattern和core_uses_pid共同決定。其中core_pattern有兩種模式,一直是直接決定文件名和路徑,比如/data/core/core.%e.%p.%s,表明core文件保存在data下面的core目錄下,且文件名的格式是core後面加程序名pid號和引發錯誤的段信號值。

  • %% 單個%字符
  • %p 所dump進程的進程ID
  • %u 所dump進程的實際用戶ID
  • %g 所dump進程的實際組ID
  • %s 導致本次core dump的信號
  • %t core dump的時間 (由1970年1月1日計起的秒數)
  • %h 主機名
  • %e 程序文件名

core_pattern的另一個模式是管道模式,以“|”開頭,然後跟要執行的程序的絕對路徑,如在ubuntu 12.04中,core_parttern文件的內容是“|/usr/share/apport/apport %p %s %c”且core_pipe_limit爲0。當通過管道將內存鏡像保存時,進程/proc/pid下面的內容不能立即刪除,必須等到apport程序保存完內存信息後纔可刪除,否則信息流失不利於問題定位,這時core_pipe_limit的值決定了 系統中運行併發訪問/proc/pid的進程數,如果爲0表示不限制併發進程數量。/usr/share/apport/apport是Python腳本,帶入的參數由上面的流程的符號意義可知,是進程ID號、導致本次core dump的信號和core文件是否限制limit的值。suid_dumpable文件的值可能爲0、1和2。意義不同,0是表明不能產生core文件,1表明debug模式,任何進程都可以產生core,2表明生成的core文件只有root用戶可讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章