Linux開發實用工具之詳解coredump

Linux開發實用工具之詳解coredump

在開發Linux的程序時,例如遊戲服務器,有時會異常終止或者崩潰,此時沒有任何日誌,也不能定位到崩潰代碼的位置,有些老手會告訴你去查看coredump,那什麼是coredump, 又怎麼查看呢?這裡就跟大家講一講

什麼是coredump

coredump是程序異常終止或崩潰時,操作系統將當時內存、寄存器、堆棧等數據記錄下,並保存在一個文件中,可以簡單理解成是一個快照文件

開啟coredump功能

如果不知道是否開啟coredump功能,可以在命令行中輸入:ulimit -c , 如果返回的結果是0,表示沒有開啟coredump。

開啟coredump的方法,可以輸入命令: ulimit -c size 開啟,size是文件大小,以blocks為單位,1個block為512bytes, 也可以設置成unlimited,表示不限制coredump文件的大小。

這種方法,只會在當前會話生效,可以將 ulimit 的命令加到 /etc/profile 中修改所有用戶的環境變量。

還可以修改 /etc/security/limits.conf 文件 和 在程序中使用 setrlimit 函數來設置,筆者沒有具體使用,這裡就不詳細介紹

修改coredump的保存路徑

默認情況下,生成的coredump保存在可執行程序的當前目錄下, 文件名為core.

有時候程序可能會反覆崩潰,這樣上次產生的coredump文件會被覆蓋掉,這種情況,可以通過修改coredump的文件名和路徑來解決,具體方法如下:

  1. 修改 /proc/sys/kernel/core_uses_pid 文件,將內容改為1. 可以使用core文件名自動加上pid, 此時core文件名將變成core.pid, pid為進程的PID
  2. 修改 /proc/sys/kernel/core_pattern 文件,例如內容修改為:/tmp/core.e%.%p.%t , 即表示將core文件保存到 /tmp目錄,文件名為:core.可執行程序名稱.進程PID.時間戳

以下為文件名參數列表:

  • %p - 進程的pid
  • %u - 當前的uid
  • %g - 當前的gid
  • %s - 產生coredump的信號
  • %t - 產生coredump的時間戳
  • %h - 主機名
  • %e - 可執行文件的名稱

查看coredump文件

查看coredump文件有很多工具,這裡簡單講一下使用gdb查看

例如當程序 cli發生崩潰,產生coredump文件為core,可以使用下面的命令查看

gdb -c ./core cli

然後輸入bt full, 就可以查看到詳細的調用棧,這樣就可以根據顯示的信息,找到崩潰的地方。


分享到:


相關文章: