![Linux開發實用工具之詳解coredump](http://p2.ttnews.xyz/loading.gif)
在開發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的文件名和路徑來解決,具體方法如下:
- 修改 /proc/sys/kernel/core_uses_pid 文件,將內容改為1. 可以使用core文件名自動加上pid, 此時core文件名將變成core.pid, pid為進程的PID
- 修改 /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, 就可以查看到詳細的調用棧,這樣就可以根據顯示的信息,找到崩潰的地方。
閱讀更多 coding1024 的文章