Segmentation fault (core dumped) 錯誤的一種解決場景


錯誤類型

Segmentation fault (core dumped)

產生原因

Segmentation fault 段錯誤。

Core Dump 核心轉儲(是操作系統在進程收到某些信號而終止運行時,將此時進程地址空間的內容以及有關進程狀態的其他信息寫出的一個磁盤文件。這種信息往往用於調試),其實“吐核”這個詞形容的很恰當,就是核心內存吐出來。

出現這種錯誤可能的原因(其實就是訪問了內存中不應該訪問的東西):

1,內存訪問越界:

(1) 數組訪問越界,因為下標出超出了范圍。

(2) 搜索字符串的時候,通過字符串的結尾符號來判斷結束,但是實際上沒有這個結束符。

(3)使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函數,超出了字符中定義的可以存儲的最大范圍。使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。

2,多線程程序使用了線程不安全的函數。

3,多線程讀寫的數據未加鎖保護。

 對於會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成核心轉儲

4,非法指針

(1)使用NULL指針

(2)隨意使用指針類型強制轉換,因為在這種強制轉換其實是很不安全的,因為在你不確認這個類型就應該是你轉化的類型的時候,這樣很容易出錯,因為就會按照你強制轉換的類型進行訪問,這樣就有可能訪問到不應該訪問的內存。

5,堆棧溢出

不要使用大的局部變量(因為局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。
    

解決場景

在linux的虛擬機上跑了一個數據結構,在虛擬機上出現上述錯誤,在Windows的宿主機彈出錯誤。於是試運行一個相似的較簡單的哈希函數,虛擬機上出現相同錯誤,,注意到以下代碼:

// generates a hash value for a sting
// same as djb2 hash function
unsigned int CountMinSketch::hashstr(const char *str) {
  unsigned long hash = 5381;
  int c;
  while (c = *str++) {
    hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
  }
  return hash;
}

這是一個針對字符串的哈希函數,其中一行

hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

是問題所在,針對較長的字符串,這個hash變量會不斷變大,甚至溢出。

於是嘗試在這個變量每計算一次,對一個大的質數做一次取余操作,將這個值限制在一定范圍內。嘗試發現可以運行。

但是增加這個取余會產生額外的開銷,並且對什么數取余也是需要考慮的,因為它會限制這個哈希值分布,增加碰撞的幾率。但是為解決之前運行數據結構的問題提供了思路。

    
參考:https://www.cnblogs.com/foreverW/p/7295201.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM