1. 程式人生 > >Linux下core檔案使用

Linux下core檔案使用

有時候程式會異常退出而不帶任何日誌,此時就可以使用code檔案進行分析,它會記錄程式執行的記憶體,暫存器,堆疊指標等資訊

什麼是core檔案

通常在Linux下遇到程式異常退出或者中止,我們都會使用core檔案進行分析,其中包含了程式執行時的記憶體,暫存器,堆疊指標等資訊,格式為ELF,可以理解是程式工作當前狀態轉儲成一個檔案,通過工具分析這個檔案,我們可以定位到程式異常退出或者終止時相應的堆疊呼叫等資訊,為解決問題提供幫助。

使用core檔案除錯

生成方法

  1. 檢視當前core檔案的狀態
$ ulimit -a
...
-c: core file size (blocks)         0
# 關閉狀態 ...
  1. 開啟生成開關
ulimit -c unlimited
ulimit -a
...
-c: core file size (blocks)         unlimited
...
  1. core檔案的大小進行限制,單位為blocks,一般1 block=512 bytes,設定太小可能導致不會生成檔案
$ ulimit -c 1024
$ ulimit -a
...
-c: core file size (blocks)         1024
...
  1. 關閉生成開關
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

除錯方法

可以使用gdbcore檔案進行除錯,編譯是需要帶上-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
...

Reference

About me