linux coredump調試
1 )如何生成 coredump 文件 ?
登陸 LINUX 服務器,任意位置鍵入
echo "ulimit -c 1024" >> /etc/profile
退出 LINUX 重新登陸 LINUX
鍵入 ulimit -c
如果顯示 1024 那麼說明 coredump 已經被開啟。
1024 限制產生的 core 文件的大小不能超過 1024kb,可以使用參數unlimited,取消該限制
ulimit -c unlimited
2 ) . core 文件的簡單介紹
在一個程序崩潰時,它一般會在指定目錄下生成一個 core 文件。 core 文件僅僅是一個內存映象 ( 同時加上調試信息 ) ,主要是用來調試的。
3 ) . 開啟或關閉 core 文件的生成
用以下命令來阻止系統生成 core 文件 :
ulimit -c 0
下面的命令可以檢查生成 core 文件的選項是否打開 :
ulimit -a
該命令將顯示所有的用戶定制,其中選項 -a 代表“ all ”。
也可以修改系統文件來調整 core 選項
在 /etc/profile 通常會有這樣一句話來禁止產生 core 文件,通常這種設置是合理的 :
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在開發過程中有時為了調試問題,還是需要在特定的用戶環境下打開 core 文件產生的設置。
在用戶的 ~/.bash_profile 裡加上 ulimit -c unlimited 來讓特定的用戶可以產生 core 文件。
如果 ulimit -c 0 則也是禁止產生 core 文件,而 ulimit -c 1024 則限制產生的 core 文件的大小不能超過 1024kb
4 ) . 設置 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" > 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 添加命令名
5 ) . 使用 core 文件
在 core 文件所在目錄下鍵入 :
gdb -c core
它會啟動 GNU 的調試器,來調試 core 文件,並且會顯示生成此 core 文件的程序名,中止此程序的信號等等。
需要關聯產生core文件的程序文件進行調試,gdb中使用file命令進行關聯
如果你已經知道是由什麼程序生成此 core 文件的,比如 MyServer 崩潰了生成 core.12345 ,那麼用此指令調試 :
gdb -c core MyServer
6 ) . 一個小方法來測試產生 core 文件
直接輸入指令 :
kill -s SIGSEGV $$
7 ) .開發板上使用core文件調試
-----------------------------
如果開發板的操作系統也是linux,core調試方法依然適用。如果開發板上不支持gdb,可將開發板的環境(頭文件、庫)、可執行文件和core文件拷貝到PC的linux下,運行相關命令即可。
注意:待調試的可執行文件,在編譯的時候需要加-g,core文件才能正常顯示出錯信息!
注意的問題:
8 ) .在Linux下要保證程序崩潰時生成Coredump要注意這些問題:
一、要保證存放Coredump的目錄存在且進程對該目錄有寫權限。存放Coredump的目錄即進程的當前目錄,一般就是當初發出命令啟動該進程時所在的目錄。但如果是通過腳本啟動,則腳本可能會修改當前目錄,這時進程真正的當前目錄就會與當初執行腳本所在目錄不同。這時可以查看”/proc/進程pid>/cwd“符號鏈接的目標來確定進程真正的當前目錄地址。通過系統服務啟動的進程也可通過這一方法查看。
二、若程序調用了seteuid()/setegid()改變
了進程的有效用戶或組,則在默認情況下系統不會為這些進程生成Coredump。很多服務程序都會調用seteuid(),如MySQL,不論你用什麼用
戶運行mysqld_safe啟動MySQL,mysqld進行的有效用戶始終是msyql用戶。如果你當初是以用戶A運行了某個程序,但在ps裡看到的
這個程序的用戶卻是B的話,那麼這些進程就是調用了seteuid了。為了能夠讓這些進程生成coredump,需要將/proc/sys/fs/suid_dumpable文件的內容改為1(一般默認是0)。
三、這個一般都知道,就是要設置足夠大的Core文件大小限制
了。程序崩潰時生成的Core文件大小即為程序運行時占用的內存大小。但程序崩潰時的行為不可按平常時的行為來估計,比如緩沖區溢出等錯誤可能導致堆棧被破壞,因此經常會出現某個變量的值被修改成亂七八糟的,然後程序用這個大小去申請內存就可能導致程序比平常時多占用很多內存。因此無論程序正常運行時占用的內存多麼少,要保證生成Core文件還是將大小限制設為unlimited為好。