Linux中如何產生core

2021-06-22 07:02:53 字數 3092 閱讀 8502

在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案(是乙個記憶體映像,同時加上除錯資訊)。使用gdb來檢視core檔案,可以指示出導致程式出錯的**所在檔案和行數。

1.core檔案的生成開關和大小限制

(1)使用ulimit -c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,不會生成core檔案。

(2)使用ulimit -c filesize命令,可以限制core檔案的大小(filesize的單位為kbyte)。例如使用ulimit -c 1000將會把core檔案限制為1000kb。如果生成的資訊超過此大小,將會被裁剪,最終生成乙個不完整的core檔案,在除錯此core檔案的時候,gdb會提示錯誤。

(3)使用ulimit -c unlimited,則表示core檔案的大小不受限制。

(4)可以將ulimit -c unlimited寫入到.bashrc中。

2.core檔案生成路徑:

預設為輸入可執行檔案執行命令的同一路徑下。若系統生成的core檔案不帶其它任何擴充套件名稱,則全部命名為core。新的core檔案生成將覆蓋原來的core檔案。

如何查詢和修改linux作業系統生成core dump檔案的預設路徑?

方法1:# cat /proc/sys/kernel/core_pattern

方法2:# /sbin/sysctl kernel.core_pattern

3.控制core檔案的檔名中是否新增pid作為擴充套件

這個檔案/proc/sys/kernel/core_uses_pid可以控制core檔案的檔名中是否新增pid作為擴充套件。檔案內容為1,表示新增 pid作為副檔名,生成的core檔案格式為core.***x;為0則表示生成的core檔案同一命名為core。可通過以下命令修改此檔案:echo "1" > /proc/sys/kernel/core_uses_pid

4.修改core dump檔案儲存路徑和檔名格式

例如:echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern,可以將core檔案統一生成到/corefile目錄下,產生的檔名為core-命令名-pid-時間戳

方法2:永久修改:使用sysctl -w name=value命令。

例:/sbin/sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t

5.為了更詳盡的記錄core dump當時的系統狀態,可通過以下引數來豐富core檔案的命名:  

%% - 單個%字元  

%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時間(由2023年1月1日計起的秒數)

%e - insert coredumping executable name into filename 新增命令名(程式檔名)

6.執行示例

kk@ubuntu:~/desk/python/day5-27$ echo "1" > /proc/sys/kernel/core_uses_pid

bash: /proc/sys/kernel/core_uses_pid: 許可權不夠

kk@ubuntu:~/desk/python/day5-27$ su

密碼:  

root@ubuntu:/home/kk/desk/python/day5-27# echo "1" > /proc/sys/kernel/core_uses_pid

root@ubuntu:/home/kk/desk/python/day5-27# cd /proc/sys/kernel/

root@ubuntu:/proc/sys/kernel# echo "/tmp/core-%e-%p-%t" > core_pattern

root@ubuntu:/proc/sys/kernel# cd -

/home/kk/desk/python/day5-27

root@ubuntu:/home/kk/desk/python/day5-27# exit

exit

kk@ubuntu:~/desk/python/day5-27$ ll /tmp/         

kk@ubuntu:~/desk/python/day5-27$ ll /tmp/core-a.out-3173-1401287037  

-rw------- 1 kk kk 413696  5月 28 22:23 /tmp/core-a.out-3173-1401287037

kk@ubuntu:~/desk/python/day5-27$ gdb ./a.out /tmp/

/tmp/at-spi2                     /tmp/ssh-utctvudg1989

/tmp/core-a.out-3173-1401287037  /tmp/unity_support_test.1

/tmp/ibus.log                    /tmp/vmwarednd

/tmp/.ice-unix                   /tmp/vmware-kk

/tmp/keyring-q0k3an              /tmp/vmware-root

/tmp/pulse-2l9k88emlgn7          /tmp/.x0-lock

/tmp/pulse-pkdhtxmmr18n          /tmp/.x11-unix

/tmp/pulse-y400hbnsm00c           

kk@ubuntu:~/desk/python/day5-27$ gdb ./a.out /tmp/core-a.out-3173-1401287037

Linux下發生段錯誤時如何產生core檔案

linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...

Linux下發生段錯誤時如何產生core檔案

linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...

Linux下發生段錯誤時如何產生core檔案

linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...