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