1.core檔案的簡單介紹
在乙個程式崩潰時,它一般會在程式的當前目錄下生成乙個core檔案。core檔案僅僅是乙個記憶體映象(同時加上除錯資訊),主要是用來除錯的。
2. 開啟或關閉core檔案的生成
以下命令可以檢查生成core檔案的選項是否開啟:
ulimit –a
該命令將顯示所有的使用者定製,其中選項-a代表「all」。檢視結果中形如:core file size (blocks, -c) 0的內容,如果紅色文字為0,則表示未開啟core檔案;否則,已開啟並代表core檔案的最大kb位元組數。
用以下命令來系統為當前bash的當前使用者生成core檔案,生成的檔案一般在程式的當前目錄下
#ulimit –c unlimited
unlimited表示coredump檔案大小無限制。
另外,可以用以下命令來阻止系統生成core檔案:
ulimit -c 0
0表示檔案大小為0。
也可以修改系統檔案來調整core選項
在/etc/profile通常會有這樣一句話來禁止產生core檔案,通常這種設定是合理的:
ulimit -s -c 0 > /dev/null 2>&1
但是在開發過程中有時為了除錯問題,還是需要在特定的使用者環境下開啟core檔案產生的設定
在使用者的~/.bash_profile裡加上ulimit -c unlimited來讓特定使用者可以產生core檔案。
也可以用ulimit -c 1024,表示限制產生的core檔案的大小不能超過1024kb
3. 設定core dump的核心轉儲檔案目錄和命名規則
/proc/sys/kernel/core_uses_pid可以控制產生的core檔案的檔名中是否新增pid作為擴充套件,如果新增則檔案內容為1,否則為0
/proc/sys/kernel/core_pattern可以設定格式化的core檔案儲存位置或檔名,比如原來檔案內容是core-%e
可以這樣修改:
echo "/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern
將會控制所產生的core檔案會存放到/corefile目錄下,產生的檔名為core-命令名-pid-時間戳
以下是引數列表:
%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時間
%e - insert coredumping executable name into filename 新增命令名
4. 使用core檔案來除錯程式
例如,a.c程式內容如下:
#includeint main()
1、用-g引數編譯a.c程式檔案,並執行
#gcc –g a.c –o a.out
#./a.out
floating point exception (core dumped)
#lsa.c a.out core
當前目錄下生成了core檔案。
2、使用gdb除錯core檔案
#gdb –core=core
gnu gdb (ubuntu 7.7-0ubuntu3.1) 7.7
license gplv3+: gnu gpl version 3 or later
this is free software: you are free tochange and redistribute it.
there is no warranty, to the extentpermitted by law. type "showcopying"
and "show warranty" for details.
this gdb was configured as"x86_64-linux-gnu".
type "show configuration" forconfiguration details.
for bug reporting instructions, please see:
.find the gdb manual and other documentationresources online at:
.for help, type "help".
type "apropos word" to search forcommands related to "word".
[new lwp 29993]
core was generated by `./a.out'.
program terminated with signal sigfpe,arithmetic exception.
#0 0x0000000000400546 in ?? ()
(gdb)
此時會顯示生成此core檔案的程式名(a.out),中止此程式的訊號(sigfpe)等等。
(gdb) bt
#0 0x0000000000400546 in ?? ()
#1 0x00007fff27fbf7d0 in ?? ()
#2 0x0000000000000000 in ?? ()
此時bt還不能看到呼叫堆疊,需要將程式的symbol讀進來
(gdb) file ./a.out
reading symbols from ./a.out...done.
這時就可以使用bt檢視呼叫堆疊,用list檢視程式在哪行**中止了。
(gdb) bt
#0 0x0000000000400546 in main () at a.c:8
(gdb) list
1 #include
2
3 int main()
4 {
5 int a = 10;
6 int b;
7 a = a - 10;
8 b = 10 / a;
9 printf("%d", b);
10
Linux Coredump 配置生成例項
coredump是linux程式執行時的記憶體映象,當程式發生異常 獲儲存,用於程式除錯分析。為程式儲存coredump 又稱core 檔案需要系統配置支援。ulimit c 0 ulimit c unlimited ulimit c 1024 0表示不生成檔案。可以通過 ulimit c 設定乙個...
Linux core dump的除錯技術(1)
有的程式可以通過編譯,但在執行時會出現segment fault 段錯誤 這通常都是指標錯誤引起的.以下是我們詳細的對linux core dump的除錯技術進行的介紹,想能幫助大家 1.linux core dump 前言 有的程式可以通過編譯,但在執行時會出現segment fault 段錯誤 ...
Linux core dump 分析及相關除錯
core是core dump檔案,是linux伺服器的一種機制。core是個程式的嚴重問題,會致使程式直接掛掉,需要恢復。core檔案產生原因很多,有主動core 請求的,也有是程式的非法操作導致os傳送sigsegv相關的訊號。主動core的方法 1 程式在執行中,需要檢視裡面的程序或者執行緒的運...