Posted on 2010-04-09 10:24
S.l.e!ep.¢% 閱讀(767)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Unix
Linux Core Dump 配置與調(diào)試
1.core文件的生成開關(guān)和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成開關(guān)。若結(jié)果為0,則表示關(guān)閉了此功能,不會(huì)生成core文件。
2) 使用ulimit -cfilesize命令,可以限制core文件的大?。╢ilesize的單位為kbyte)。若ulimit -cunlimited,則表示core文件的大小不受限制。如果生成的信息超過(guò)此大小,將會(huì)被裁剪,最終生成一個(gè)不完整的core文件。在調(diào)試此 core文件的時(shí)候,gdb會(huì)提示錯(cuò)誤。
2.core文件的名稱和生成路徑
----------------------------
若系統(tǒng)生成的core文件不帶其它任何擴(kuò)展名稱,則全部命名為core。新的core文件生成將覆蓋原來(lái)的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作為擴(kuò)展。文件內(nèi)容為1,表示添加pid作為擴(kuò)展名,生成的core文件格式為core.xxxx;為0則表示生成的core文件同一命名為core。
可通過(guò)以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通過(guò)以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以將core文件統(tǒng)一生成到/corefile目錄下,產(chǎn)生的文件名為core-命令名-pid-時(shí)間戳
以下是參數(shù)列表:
??? %p - insert pid into filename 添加pid
??? %u - insert current uid into filename 添加當(dāng)前uid
??? %g - insert current gid into filename 添加當(dāng)前gid
??? %s - insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號(hào)
??? %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
??? %h - insert hostname where the coredump happened into filename 添加主機(jī)名
??? %e - insert coredumping executable name into filename 添加命令名
3.用gdb查看core文件:
下面我們可以在發(fā)生運(yùn)行時(shí)信號(hào)引起的錯(cuò)誤時(shí)發(fā)生core dump了.
發(fā)生core dump之后, 用gdb進(jìn)行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進(jìn)入gdb后, 用bt命令查看backtrace以檢查發(fā)生程序運(yùn)行到哪里, 來(lái)定位core dump的文件->行.
4.開發(fā)板上使用core文件調(diào)試
-----------------------------
如果開發(fā)板的操作系統(tǒng)也是linux,core調(diào)試方法依然適用。如果開發(fā)板上不支持gdb,可將開發(fā)板的環(huán)境(頭文件、庫(kù))、可執(zhí)行文件和core文件拷貝到PC的linux下,運(yùn)行相關(guān)命令即可。
注意:待調(diào)試的可執(zhí)行文件,在編譯的時(shí)候需要加-g,core文件才能正常顯示出錯(cuò)信息!
?
注意的問(wèn)題:
在Linux下要保證程序崩潰時(shí)生成Coredump要注意這些問(wèn)題:
一、要保證存放Coredump的目錄存在且進(jìn)程對(duì)該目 錄有寫權(quán)限。存放Coredump的目錄即進(jìn)程的當(dāng)前目錄,一般就是當(dāng)初發(fā)出命令啟動(dòng)該進(jìn)程時(shí)所在的目錄。但如果是通過(guò)腳本啟動(dòng),則腳本可能會(huì)修改當(dāng)前目 錄,這時(shí)進(jìn)程真正的當(dāng)前目錄就會(huì)與當(dāng)初執(zhí)行腳本所在目錄不同。這時(shí)可以查看”/proc/<進(jìn)程pid>/cwd“符號(hào)鏈接的目標(biāo)來(lái)確定進(jìn)程 真正的當(dāng)前目錄地址。通過(guò)系統(tǒng)服務(wù)啟動(dòng)的進(jìn)程也可通過(guò)這一方法查看。
二、若程序調(diào)用了seteuid()/setegid()改變 了進(jìn)程的有效用戶或組,則在默認(rèn)情況下系統(tǒng)不會(huì)為這些進(jìn)程生成Coredump。很多服務(wù)程序都會(huì)調(diào)用seteuid(),如MySQL,不論你用什么用 戶運(yùn)行mysqld_safe啟動(dòng)MySQL,mysqld進(jìn)行的有效用戶始終是msyql用戶。如果你當(dāng)初是以用戶A運(yùn)行了某個(gè)程序,但在ps里看到的 這個(gè)程序的用戶卻是B的話,那么這些進(jìn)程就是調(diào)用了seteuid了。為了能夠讓這些進(jìn)程生成core dump,需要將/proc/sys/fs /suid_dumpable文件的內(nèi)容改為1(一般默認(rèn)是0)。
三、這個(gè)一般都知道,就是要設(shè)置足夠大的Core文件大小限制 了。程序崩潰時(shí)生成的Core文件大小即為程序運(yùn)行時(shí)占用的內(nèi)存大小。但程序崩潰時(shí)的行為不可按平常時(shí)的行為來(lái)估計(jì),比如緩沖區(qū)溢出等錯(cuò)誤可能導(dǎo)致堆棧被 破壞,因此經(jīng)常會(huì)出現(xiàn)某個(gè)變量的值被修改成亂七八糟的,然后程序用這個(gè)大小去申請(qǐng)內(nèi)存就可能導(dǎo)致程序比平常時(shí)多占用很多內(nèi)存。因此無(wú)論程序正常運(yùn)行時(shí)占用 的內(nèi)存多么少,要保證生成Core文件還是將大小限制設(shè)為unlimited為好。
from?
??http://easwy.com/blog/archives/customize-filename-of-core-dump/
??http://www.unix-center.net/bbs/viewthread.php?tid=12164