Linux下core檔案使用
阿新 • • 發佈:2019-01-05
有時候程式會異常退出而不帶任何日誌,此時就可以使用code
檔案進行分析,它會記錄程式執行的記憶體,暫存器,堆疊指標等資訊
什麼是core檔案
通常在Linux
下遇到程式異常退出或者中止,我們都會使用core
檔案進行分析,其中包含了程式執行時的記憶體,暫存器,堆疊指標等資訊,格式為ELF
,可以理解是程式工作當前狀態轉儲成一個檔案,通過工具分析這個檔案,我們可以定位到程式異常退出或者終止時相應的堆疊呼叫等資訊,為解決問題提供幫助。
使用core檔案除錯
生成方法
- 檢視當前
core
檔案的狀態
$ ulimit -a
...
-c: core file size (blocks) 0 # 關閉狀態
...
- 開啟生成開關
ulimit -c unlimited
ulimit -a
...
-c: core file size (blocks) unlimited
...
- 對
core
檔案的大小進行限制,單位為blocks
,一般1 block=512 bytes
,設定太小可能導致不會生成檔案
$ ulimit -c 1024
$ ulimit -a
...
-c: core file size (blocks) 1024
...
- 關閉生成開關
ulimit -c 0
ulimit -a
...
-c: core file size (blocks) 0
...
上面對
core
檔案的操作僅對當前生效,若需要永久生效,則要將相應操作寫入/etc/profile
生成路徑
core
檔案預設生成在程式的工作目錄,可以對生成路徑進行設定,需要保證對對應目錄有足夠空間並具有寫許可權
echo /MyCoreDumpDir/core.%e.%p > /proc/sys/kernel/core_pattern
其中命名使用的引數列表
%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 # 新增命令名
/proc/sys/kernel/core_uses_pid
這個檔案的值若為1,則無論時候配置%p
,最後生成的core
檔案都會新增pid
除錯方法
可以使用gdb
對core
檔案進行除錯,編譯是需要帶上-g
選項
$ gdb a.out
...
(gdb) core-file core
...
(gdb) bt
...
如需要在PC
上除錯嵌入式裝置產生的core
檔案,則需要選取相應平臺的gdb
工具,並在進入gdb
後設置符號檔案的位置
$ xxx-xxx-gdb a.out
...
(gdb) solib-search-path xxx.so:xxx.so
...
(gdb) core-file core
...
(gdb) bt
...