天天看點

linux coredump配置與調試

Linux Core Dump 配置與調試

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

---------------------------------

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

2) 使用ulimit -cfilesize指令,可以限制core檔案的大小(filesize的機關為kbyte)。若ulimit -cunlimited,則表示core檔案的大小不受限制。如果生成的資訊超過此大小,将會被裁剪,最終生成一個不完整的core檔案。在調試此 core檔案的時候,gdb會提示錯誤。

2.core檔案的名稱和生成路徑

----------------------------

若系統生成的core檔案不帶其它任何擴充名稱,則全部命名為core。新的core檔案生成将覆寫原來的core檔案。

1)/proc/sys/kernel/core_uses_pid可以控制core檔案的檔案名中是否添加pid作為擴充。檔案内容為1,表示添加pid作為擴充名,生成的core檔案格式為core.xxxx;為0則表示生成的core檔案同一命名為core。

可通過以下指令修改此檔案:

echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core檔案儲存位置和檔案名格式。

echo "/corefile/core-%e-%p-%t" > 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時間

    %h - insert hostname where the coredump happened into filename 添加主機名

    %e - insert coredumping executable name into filename 添加指令名

3.用gdb檢視core檔案:

下面我們可以在發生運作時信号引起的錯誤時發生core dump了.

發生core dump之後, 用gdb進行檢視core檔案的内容, 以定位檔案中引發core dump的行.

gdb [exec file] [core file]

如:

gdb ./test test.core

在進入gdb後, 用bt指令檢視backtrace以檢查發生程式運作到哪裡, 來定位core dump的檔案->行.

4.開發闆上使用core檔案調試

-----------------------------

如果開發闆的作業系統也是linux,core調試方法依然适用。如果開發闆上不支援gdb,可将開發闆的環境(頭檔案、庫)、可執行檔案和core檔案拷貝到PC的linux下,運作相關指令即可。

注意:待調試的可執行檔案,在編譯的時候需要加-g,core檔案才能正常顯示出錯資訊!

注意的問題:

在Linux下要保證程式崩潰時生成Coredump要注意這些問題:

  一、要保證存放Coredump的目錄存在且程序對該目 錄有寫權限。存放Coredump的目錄即程序的目前目錄,一般就是當初發出指令啟動該程序時所在的目錄。但如果是通過腳本啟動,則腳本可能會修改目前目 錄,這時程序真正的目前目錄就會與當初執行腳本所在目錄不同。這時可以檢視”/proc/<程序pid>/cwd“符号連結的目标來确定程序 真正的目前目錄位址。通過系統服務啟動的程序也可通過這一方法檢視。

  二、若程式調用了seteuid()/setegid()改變 了程序的有效使用者或組,則在預設情況下系統不會為這些程序生成Coredump。很多服務程式都會調用seteuid(),如MySQL,不論你用什麼用 戶運作mysqld_safe啟動MySQL,mysqld進行的有效使用者始終是msyql使用者。如果你當初是以使用者A運作了某個程式,但在ps裡看到的 這個程式的使用者卻是B的話,那麼這些程序就是調用了seteuid了。為了能夠讓這些程序生成core dump,需要将/proc/sys/fs /suid_dumpable檔案的内容改為1(一般預設是0)。

  三、這個一般都知道,就是要設定足夠大的Core檔案大小限制 了。程式崩潰時生成的Core檔案大小即為程式運作時占用的記憶體大小。但程式崩潰時的行為不可按平常時的行為來估計,比如緩沖區溢出等錯誤可能導緻堆棧被 破壞,是以經常會出現某個變量的值被修改成亂七八糟的,然後程式用這個大小去申請記憶體就可能導緻程式比平常時多占用很多記憶體。是以無論程式正常運作時占用 的記憶體多麼少,要保證生成Core檔案還是将大小限制設為unlimited為好。

http://www.unix-center.net/bbs/viewthread.php?tid=12164

繼續閱讀