coredump
coredump介紹
應用程序有時會因為異常或者bug導致在運行過程中異常退出或者終止,為了方便問題的定位,我們往往需要獲取程序運行時的內存,寄存器狀態,堆棧指針,內存管理以及函數調用堆棧信息等,從而找到bug所在。在linux系統中,我們通常可以通過對系統進行一些配置,將上述的信息輸出到ELF文件中,即core文件。
coredump詳細介紹
core文件默認存儲位置與對應的可執行程序位于同一路徑下,文件名為core;具體信息可以通過如下命令查看:
cat /proc/sys/kernel/core_pattern
如果程序中調用了chdir函數,則core文件生成在chdir指定路徑下。另外,我們也可以通過相關設置設定core文件生成路徑。
在類unix系統中,core文件本身的主要格式也是ELF格式,因此可以使用readelf或者file命令查看core文件的具體信息。
coredump基本配置
調試coredump文件需要讀取相應符號信息,因此,編譯時需要加入-g選項。
系統資源限制,默認情況下,core文件大小限制為0,不會生成core文件,需要進行設置。命令如下:
ulimit -c unlimited (coredump文件大小不受限制)
進程資源限制,有時即使系統設置了unlimited,但是當前進程啟動時如果沒有讀取到,則仍然不會生成core文件。進程限制內容查看命令:
egrep "Units|core" /proc/<pid>/limits
使core文件添加pid信息
echo "1" > /proc/sys/kernel/core_uses_pid
配置core文件位置和文件名格式
echo "./core.%p.%e" > /proc/sys/kernel/core_pattern
生成的core文件與執行程序位于相同路徑,文件名為core.pid.execute_name
其他控制參數:
%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 添加命令名
檢查core目錄,core文件生成路徑所在磁盤空間是否為0,或者小于進程運行時所占的虛擬內存大小(通過top命令查看VIRT
檢查core目錄是否有寫權限
如果core文件沒有core全,檢查進程如下配置
cat /proc/<pid>/coredump_filter
00000003
echo "0xF" > /proc/<pid>/coredump_filter
原理如下:
(bit 0) anonymous private memory
(bit 1) anonymous shared memory
(bit 2) file-backed privated memory
(bit 3) file-backed shared memory
如果發現core文件不知道屬于哪個進程,執行如下命令:
strings core.6440 | head
參考資料
詳解coredump
總結
- 上一篇: 网站登录密码忘记后,通过向手机发送验证码
- 下一篇: 人大金仓(jdbc)8.6.0,8.2.