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