關於Linux的core dump那些事

什麼是core?

在linux中,程序運行時出現異常崩潰,操作系統會將程序當時的內存狀態、調用堆棧等信息保存在core文件中。這種行爲就是core dump(核心轉儲)。core文件中一般會保存寄存器信息(包括程序指針、棧指針等)、內存管理信息、CPU和操作系統狀態和以及函數調用堆棧等信息。所以,core文件對於開發人員是非常重要的,很多時候我們都需要依賴對core文件的分析結合日誌來定位和解決崩潰的問題。

core dump相關設置

在linux中,core dump的一些相關設置方法:

  • 查詢:ulimit -c,查詢結果爲0則表示關閉core dump功能,系統默認是關閉的。
  • 關閉:ulimit -c 0
  • 打開:ulimit -c unlimited,不限制core文件大小,也可以限制指定大小,單位是blocks(一般爲kB),如ulimit -c 100表示限制core文件大小爲100k。
  • 修改core文件名生成規則:通過執行命令echo 1 > /proc/sys/kernel/core_uses_pid,可以將生成core文件的文件名改爲core.pid。默認情況下,core dump生成的文件名爲core,文件生成在程序當前目錄下。且新的core會覆蓋已存在的core。
  • 修改生成路徑和文件名:通過修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如,通過命令echo "/tmp/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern將core文件保存在/tmp/corefile/目錄下,文件名的格式爲core-命令名-pid-時間戳.
  • core_pattern的命名參數如下:
%e dump的命令名
%p dump的進程PID
%t dump時間戳(由1970年1月1日起計的秒數)
%s 導致本次core dump的信號
%c 轉儲文件的大小上限
%g dump的進程的實際組ID
%u dump進程的實際用戶ID
%h 主機名

產生core文件的必備條件

  • 環境變量的設置:通過前面介紹的ulimit –c等環境變量的設置打開core文件的生成限制。
  • 程序編譯選項的設置:要產生 core 文件,編譯器必須支持把當前進程的鏡像以某種格式 dump 到一個文件中,常見的比如 gcc/g++ 的 -g 選項。
  • 崩潰時的特殊信號:Linux內核會根據進程退出時的信號的類型來決定是否要產生 core 文件。例如SIGSEGV、SIGABRT等信號會產生core,而SIGALRM、SIGPIPE等信號不會產生core。

GDB調試core文件

當程序core dump之後,使用命令gdb program core來查看 core 文件,其中 program 爲可執行程序名,core 爲生成的 core 文件名。然後執行bt(backtrace)命令查看函數的調用堆棧,定位崩潰產生的位置。其他gdb調試技巧在此不贅述。

core文件的缺點

  • 因爲 core 文件是對當時進程地址空間的鏡像,所以 core 文件大小一般都會比較大,這樣很佔用磁盤空間,而且如果要將文件從服務器上下載到本地分析也會比較耗時。
  • 對於緩衝區溢出導致的 coredump ,進程的調用堆棧已經被覆蓋破壞了, core 文件顯示的堆棧信息往往錯誤。
  • 程序因SIGALRM、SIGPIPE等信號崩潰,則不會產生 core 文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章