linux coredump調試 1 )如何產生 coredump 檔案 ?登陸 LINUX 伺服器,任意位置鍵入 echo "ulimit -c 1024" >> /etc/profile退出 LINUX 重新登陸 LINUX鍵入 ulimit -c如果顯示 1024 那麼說明 coredump 已經被開啟。1024 限制產生的 core 檔案的大小不能超過 1024kb,可以使用參數unlimited,取消該限制ulimit -c unlimited2 ) . core 檔案的簡單介紹在一個程式崩潰時,它一般會在指定目錄下產生一個 core 檔案。 core 檔案僅僅是一個記憶體映象 ( 同時加上調試資訊 ) ,主要是用來調試的。3 ) . 開啟或關閉 core 檔案的產生用以下命令來阻止系統產生 core 檔案 :ulimit -c 0下面的命令可以檢查產生 core 檔案的選項是否開啟 :ulimit -a該命令將顯示所有的使用者定製,其中選項 -a 代表“ all ”。也可以修改系統檔案來調整 core 選項在 /etc/profile 通常會有這樣一句話來禁止產生 core 檔案,通常這種設定是合理的 :# No core files by defaultulimit -S -c 0 > /dev/null 2>&1但是在開發過程中有時為了調試問題,還是需要在特定的使用者環境下開啟 core 檔案產生的設定。在使用者的 ~/.bash_profile 裡加上 ulimit -c unlimited 來讓特定的使用者可以產生 core 檔案。如果 ulimit -c 0 則也是禁止產生 core 檔案,而 ulimit -c 1024 則限制產生的 core 檔案的大小不能超過 1024kb4 ) . 設定 Core Dump 的核心轉儲檔案目錄和命名規則/proc/sys/kernel/core_uses_pid 可以控制產生的 core 檔案的檔案名稱中是否添加 pid 作為擴充 ,如果添加則檔案內容為 1 ,否則為 0proc/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 MyServer6 ) . 一個小方法來測試產生 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為好。