什麼是Segmentation fault(Core Dump)? + 我遇到的例項問題
什麼是Core Dump?
Core的意思是記憶體, Dump的意思是扔出來, 堆出來.
開發和使用Unix程式時, 有時程式莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程式號的檔案生成, 這個檔案便是作業系統把程式down掉時的記憶體內容扔出來生成的, 它可以做為除錯程式的參考.
core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在一個core檔案中, 叫core dump.
如何使用core檔案?
gdb -c core檔案路徑 [應用程式的路徑]
進去後輸入where回車, 就可以顯示程式在哪一行down掉的, 在哪個函式中.
為什麼沒有core檔案生成呢?
有時候程式down了, 但是core檔案卻沒有生成. core檔案的生成跟你當前系統的環境設定有關係, 可以用下面的語句設定一下, 然後再執行程式便成生成core檔案.
ulimit -c unlimited
【沒有找到core檔案,我們改改ulimit的設定,讓它產生。1024是隨便取的,要是core檔案大於1024個塊,就產生不出來了。)
$ ulimit -c 1024 (轉者注: 使用-c unlimited不限制core檔案大小】
core檔案生成的位置一般於執行程式的路徑相同, 檔名一般為core.程式號
4. 用gdb檢視core檔案:
下面我們可以在發生執行時訊號引起的錯誤時發生core dump了.
發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進入gdb後, 用bt命令檢視backtrace以檢查發生程式執行到哪裡, 來定位core dump的檔案->行.
===========================================================================
造成程式core dump的原因很多,這裡根據以往的經驗總結一下:
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 堆疊溢位
不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。============================================================================
我發生的問題(待解決中):
main.h:
typedef struct TS_PAT
{
UINT8 table_id;
UINT32 zero;
} TS_PAT;
main.c:
TS_PAT *PAT_DataTable;
void Load_PAT_table(FILE *stream){
PAT_DataTable->table_id = 1;
}
上記程式碼,編譯透過。
執行時:
Segmentation fault(core dumped)
用上記方法,最後的bt命令輸入後:
#0 0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
76 PAT_DataTable->table_id = 1;
(gdb) bt
#0 0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
#1 0x080487a5 in Parse_Adjust_PAT_table (stream=0x804c050) at main.c:137
#2 0x08049651 in main (argn=3, argc=0xbf96e284) at main.c:827
當註釋掉”PAT_DataTable->table_id = 1;“的時候,沒問題。
否則,在這行賦值語句執行時就down機。
原因:查明,,未對指標初始化(未分配起指向的記憶體空間)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477398/viewspace-2127432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pytorch 程式碼出現 ‘segmentation fault (core dump)’ 問題PyTorchSegmentation
- 當import matplotlib.pyplot as ply 出現Segmentation fault (core dumped)ImportSegmentation
- 什麼是細分Segmentation? - KDnuggetsSegmentation
- Memory Dump利用例項
- Dev 日誌 | 一次 Segmentation Fault 和 GCC Illegal Instruction 編譯問題排查devSegmentationGCStruct編譯
- 我遇到的小白問題
- Python中replace()的用法是什麼?附例項!Python
- 學妹問我,併發問題的根源到底是什麼?
- Service Mesh是什麼,為我們解決了什麼問題?
- 故事:坐在我隔壁的小王問我什麼是HyperLogLog
- JSONP的原理是什麼?解決什麼問題?JSON
- 什麼是P問題、NP問題和NPC問題
- 掘金 AMA:我是 Vue.js 作者--尤雨溪,你有什麼問題想問我?Vue.js
- 面試官問我:什麼是訊息佇列?什麼場景需要他?用了會出現什麼問題?面試佇列
- 我的sql沒問題為什麼還是這麼慢|MySQL加鎖規則MySql
- nodejs打包問題解決例項NodeJS
- 說說你工作中遇到過比較難的技術問題是什麼?是如何解決的?
- 通俗易懂,什麼是.NET Core,.NET Core能做什麼
- 掘金 AMA:我是天貓營銷平臺前端-- ?耗子,你有什麼問題要問我?前端
- 掘金 AMA:我是天貓營銷平臺前端– ?耗子,你有什麼問題要問我?前端
- [轉載]什麼是P問題、NP問題和NPC問題
- 別再問我什麼是「極樂」迪斯科
- 外甥問我什麼是作業系統?作業系統
- 三個例項演示 Java Thread Dump 日誌分析Javathread
- 從程式棧記憶體底層原理到Segmentation fault報錯記憶體Segmentation
- Java虛擬機器中獲得Runtime例項的方法是什麼?Java虛擬機
- Python類屬性和例項屬性分別是什麼?Python
- 無法連線windows例項的問題排查Windows
- Navigation問題詳解——Fragment建立新的例項NavigationFragment
- Linux core dump使用Linux
- 人工智慧存在的問題是什麼(三)人工智慧
- 併發問題的三大根源是什麼?
- 什麼是 Flink SQL 解決不了的問題?SQL
- 掘金 AMA:我是前端娛樂圈的老人 & Facebook 實習生 -- 黃玄,你有什麼問題要問我?前端
- 利用jstack定位典型效能問題例項JS
- 什麼是智慧礦山?它能解決什麼問題?
- 什麼是Asp.net Core?和 .net core有什麼區別?ASP.NET
- linux遇到的問題Linux
- Vagrant 遇到的問題