最近公司一個用golang寫的restful服務突然出現了core,最終查到的原因是,golang程序在運行的時候系統啟動另一個占用內存比較大的程序,導致系統內存不足(out of memory),啟動了OOM,golang程序被異常殺掉,產生了core文件。第一次排查core的問題,作此記錄。
core文件產生原因
在程序奔潰時,內核會生成一個core文件,即程序最后 奔潰的內存映像,和程序調試信息。之后可以通過gdb,打開core文件查看程序奔潰時的堆棧信息,可以找出程序出錯的代碼所在文件和函數。
core文件調試
gdb ./test core.123 (test為產生core的可執行程序,core.123為該程序產生的core文件)
core文件的生成開關和大小限制
- 使用ulimit -a命令,可以查看core文件的生成開關和大小限制所有信息
- 使用umlimt -c 命令可查看core文件的生成開關。若結果為0,則表示關閉了 此功能,不會生成core文件
- 使用ulimt -c filesize命令,可以限制core文件的大小(filesize的單位為kbyte)。若ulimit -c unlimited,則表示core文件的大小不受限制。
core文件的名稱和生成路徑
若未設置core文件生成路徑和名稱,默認生成在可執行文件運行命令的同一路徑下,命名為core。新的core文件生成將覆蓋原來的core文件。
- core文件保存位置和文件名設置,通過編輯proc/sys/kernel/core_pattern,設置文件路徑和文件名
echo "/corefile/core-%e-%p-%t" > core_pattern
所產生的core文件會存放在/corefile目錄下,產生的文件名為core-命令名-pid-時間戳
文件名參數列表:
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加當前 uid
%g - insert current gid into filename 添加當前 gid
%s - insert signal that caused the coredump into the filename 添加導致產生 core 的信號
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成時的 unix 時間
%h - insert hostname where the coredump happened into filename 添加主機名
%e - insert coredumping executable name into filename 添加命令名