http://blog.sina.com.cn/s/blog_54f82cc201013srb.htmlhtml
什麼是coredump?linux
一般狀況下coredmp包含了程序運行時的內存,寄存器狀態,堆棧指針,內存管理信息等。能夠理解爲把程序工做的當前狀態存儲成一個文件。許多程序和操做系統出錯時會自動生成一個core文件。數組
如何使用coredump?安全
coredump能夠用在不少場合,使用Linux,或者solaris的人可能都有過這種經歷,系統在跑一些壓力測試或者系統負載一大的話,系統就hang住了或者乾脆system panic.這時惟一能幫助你分析和解決問題的就是coredump了。bash
如今不少應該程序出錯時也會出現coredump.多線程
分析coredump的工具ide
如今大部分類unix操做系統都提供了分析core文件的工具,好比 GNU Binutils Binary File Descriptor library (BFD), GNU Debugger (gdb),mdb等函數
coredump的文件格式工具
類unix操做系統中使用efi格式保存coredump文件。測試
在solairs下
bash-3.2# file *unix.3 ELF 32-bit LSB executable 80386 Version 1, statically linked, not stripped, no debugging information availableunix.4 ELF 32-bit LSB executable 80386 Version 1, statically linked, not stripped, no debugging information available
形成程序coredump的緣由不少,這裏根據以往的經驗總結一下:
1 內存訪問越界
a) 因爲使用錯誤的下標,致使數組訪問越界
b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,可是字符串沒有正常的使用結束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操做函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。
2 多線程程序使用了線程不安全的函數。
應該使用下面這些可重入的函數,尤爲注意紅色標示出來的函數,它們很容易被用錯:
asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)
3 多線程讀寫的數據未加鎖保護。
對於會被多個線程同時訪問的全局數據,應該注意加鎖保護,不然很容易形成core dump
4 非法指針
a) 使用空指針
b) 隨意使用指針轉換。一個指向一段內存的指針,除非肯定這段內存原先就分配爲某種結構或類型,或者這種結構或類型的數組,不然不要將它轉換爲這種結構或類型 的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是由於若是這段內存的開始地址不是按照這種結構或類型對齊的,那麼訪問它 時就很容易由於bus error而core dump.
5 堆棧溢出
不要使用大的局部變量(由於局部變量都分配在棧上),這樣容易形成堆棧溢出,破壞系統的棧和堆結構,致使出現莫名其妙的錯誤。
coredump文件的生成方法以及使用方法:
(假設下例是在x86上交叉編譯,而在arm上運行異常的現象)
1. 在arm內核里加入coredump的支持(通常內核都支持coredump, 不用重編)
2. 運行命令,此時容許coredump文件產生:(在arm上)
ulimit –c unlimited
3. 執行程序:(在arm上)
./test
在異常退出時,會顯示以下信息,注意括號裏的內容
Segmentation fault (core dumped)
程序執行目錄下將產生*core文件
4. 用gdb分析:(在x86上)
arm-linux-gdb ./test test.core
再用gdb的bt或where看就能夠了
(arm-linux-gdb的編譯見<</span>調試工具之四gdbserve>)
系統支持生成core並設置存儲位置的方法:
1> 在/etc/profile中加入如下一行,這將容許生成coredump文件 ulimit -c unlimited 2>