1. 程式人生 > >linux下core檔案設定與檢視

linux下core檔案設定與檢視

程式異常退出時,核心會生成一個core檔案(是記憶體映像以及除錯資訊)。可以通過使用gdb來檢視core檔案,指示出導致程式出錯的程式碼所在的檔案和行數。

 1、檢視系統中core檔案生成的開關是否開啟

    1)使用ulimit -c命令可檢視core檔案的生成開關,若結果為0,則便是關閉了此功能,不會生成core檔案。

2、設定core檔案生成

    1)使用命令ulimit -c filesize命令

            若ulimit -c unlimited 則標識此core檔案的大小不受限制

            若指定filesize,如果生成的資訊超過此大小,將會被裁剪,最終生成一個不完整的core檔案,在調 

            試此core檔案時,gdb會提示錯誤。

    2)但是若想整個系統中生效則在shell裡面設定是不行的,方法如下:

       (1)編輯/root/.bash_profile檔案,在其中加入ulitmit -S -c unlimited

       (2)source /root/.bash_profile

3、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)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.core檔案的檢視
 core檔案需要使用gdb來檢視。
 gdb ./a.out
 core-file core.xxxx
 使用bt命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt

也可以通過gdb 程式名 core檔名

 如:gdb test core.8482

 然後通過bt或者where檢視程式崩潰時的堆疊資訊

注意:在編譯程式的時候要加入選項-g。

linux環境下除錯多執行緒,總覺得不像.NET那麼方便。這幾天就為找一個死鎖的bug折騰好久,介紹一下用過的方法吧。

多執行緒如果dump,多為段錯誤,一般都涉及記憶體非法讀寫。可以這樣處理,使用下面的命令開啟系統開關,讓其可以在死掉的時候生成core檔案。  
ulimit -c unlimited
這樣的話死掉的時候就可以在當前目錄看到core.pid(pid為程序號)的檔案。接著使用gdb:
gdb ./bin ./core.pid
進去後,使用bt檢視死掉時棧的情況,在使用frame命令。

還有就是裡面某個執行緒停住,也沒死,這種情況一般就是死鎖或者涉及訊息接受的超時問題(聽人說的,沒有遇到過)。遇到這種情況,可以使用:
gcore pid(除錯程序的pid號)
手動生成core檔案,在使用pstack(linux下好像不好使)檢視堆疊的情況。如果都看不出來,就仔細檢視程式碼,看看是不是在if,return,break,continue這種語句操作是忘記解鎖,還有巢狀鎖的問題,都需要分析清楚了。
最後,說一句,靜心看程式碼,捶胸頓足是沒有用的。

 ---------------------------------------------------------------

使用C/C++語言開發程式時,當程式crash的時候產生core dump檔案對於除錯程式是很有幫助的。在Redhat Linux系統中預設是不生成core dump檔案的,這是因為在/etc/profile檔案中有這樣一行

ulimit -S -c 0 > /dev/null 2>&1


如何開啟core dump呢?最簡單的方法是使用者在自己的~/.bash_profile中加入ulimit -S -c unlimited > /dev/null 2>&1,這樣設定後允許當前使用者生成沒有大小限制的core dump檔案。此外還有兩種系統級修改生成core dump的方法。

第一種方法是修改/etc/profile,把ulimit那一行改為

ulimit -S -c unlimited > /dev/null 2>&1

這樣設定後系統允許所有使用者生成沒有大小限制的core dump檔案。這樣做的優點是不需要重起系統,缺點是無法控制只讓某些使用者生成core dump檔案。

第二種方法是修改/etc/security/limits.conf檔案。很多系統上限都可以通過修改這個檔案改變,如最大子程序個數,最大開啟檔案數等等。這個檔案有詳細的註釋,對如何修改這個檔案做了說明。如果想對所有使用者開啟core dump,可以加入一行

* soft core 0

如果只想對某些使用者或使用者組開啟core dump,可以加入

user soft core 0或@group soft core 0

注意如果通過修改/etc/security/limits.conf檔案開啟core dump,還需要註釋掉/etc/profile中的ulmit那一行
#ulimit -S -c 0 > /dev/null 2>&1
這樣修改的優點是可以針對特定使用者或特定組開啟core dump檔案,缺點是需要重起系統。

最後說一下生成core dump檔案的位置,預設位置與可執行程式在同一目錄下,檔名是core.***,其中***是一個數字。core dump檔名的模式儲存在/proc/sys/kernel/core_pattern中,預設值是core。通過以下命令可以更改core dump檔案的位置(如希望生成到/tmp/cores目錄下)

echo "/tmp/cores/core" > /proc/sys/kernel/core_pattern