摘自網路,以及自己加工整理,特此聲明。
<!--
@page { size: 8.5in 11in; margin: 0.79in }
P { margin-bottom: 0.08in }
-->
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為好。