linuxcoredump配置與除錯

maojunxu發表於2011-03-09
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為好。


相關文章