core dump

上篇文章說到valgrind可以打印出程序出錯的信息,redis的backtrack機制也可以實現。
關於valgrind的一個好的文章:https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/

現在,我再介紹一下簡單的打印堆棧的方法 : core 文件

(部分內容直接copy別人的文章。已經找不到出處了。找到的網友,請留言。)

簡介:core dump又叫核心轉儲。
        當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump.
         在程序運行的過程中,有的時候我們會遇到Segment fault(段錯誤)這樣的錯誤。這種看起來比較困難,因爲沒有任何的棧、trace信息輸出。該種類型的錯誤往往與指針操作相關。往往可以通過這樣的方式進行定位。

原因: 造成segment fault,產生core dump的可能原因
      1.內存訪問越界
            a) 由於使用錯誤的下標,導致數組訪問越界
            b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符
            c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。
      2 多線程程序使用了線程不安全的函數。
      3 多線程讀寫的數據未加鎖保護。對於會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成core dump
      4 非法指針
           a) 使用空指針
           b) 隨意使用指針轉換。一個指向一段內存的指針,除非確定這段內存原先就分配爲某種結構或類型,或者這種結構或類型的數組,否則不要將它轉換爲這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是因爲如果這段內存的開始地址不是按照這種結構或類型對齊的,那麼訪問它時就很容易因爲bus error而core dump.
      5 堆棧溢出.不要使用大的局部變量(因爲局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。


1.core文件的生成開關和大小限制
---------------------------------
 1)使用ulimit -c命令可查看core文件的生成開關。若結果爲0,則表示關閉了此功能,不會生成core文件。
 2) 使用ulimit -c filesize命令,可以限制core文件的大小(filesize的單位爲kbyte)。若ulimit -c unlimited,則表示core文件的大小不受限制。如果生成的信息超過此大小,將會被裁剪,最終生成一個不完整的core文件。在調試此core文 件的時候,gdb會提示錯誤。


2.core文件的名稱和生成路徑
----------------------------
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.core文件的查看
-----------------
 core文件需要使用gdb來查看。
 使用bt命令即可看到程序出錯的地方。
以下兩種命令方式具有相同的效果。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章