在程式不尋常退出時,核心會在當前工作目錄下生成乙個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可...