Linux開發中常見段錯誤問題原因分析

2021-07-22 15:45:06 字數 1649 閱讀 6179

標籤: c++

2015-09-18 22:12

106人閱讀收藏 

舉報

c++(75)

c(13)

linux開發中常見段錯誤問題原因分析

1 使用非法的記憶體位址(指標),包括使用未經初始化及已經釋放的指標、不存在的位址、受系統保護的位址,唯讀的位址等,這一類也是最常見和最好解決的段錯誤問題,使用gdb print一下即可知道原因。

2 記憶體讀/寫越界。包括陣列訪問越界,或在使用一些寫記憶體的函式時,長度指定不正確或者這些函式本身不能指定長度,典型的函式有strcpy(strncpy),sprintf(snprint)等等。

3 對於c++物件,應該通過相應類的介面來去記憶體進行操作,禁止通過其返回的指針對記憶體進行寫操作,典型的如string類的c_str()介面,如果你強制往其返回的指標進行寫操作肯定會段錯誤的,因為其返回的位址是唯讀的。

4 函式不要返回其中區域性物件的引用或位址,當函式返回時,函式棧彈出,區域性物件的位址將失效,改寫或讀這些位址都會造成未知的後果。

5 避免在棧中定義過大的陣列,否則可能導致程序的棧空間不足,此時也會出現段錯誤,同樣的,在建立程序/執行緒時如果不知道此執行緒/程序最大需要多少棧空間時最好不要在**中指定棧大小,應該使用系統預設的,這樣問題比較好查,ulimit一下即可知道。這類問題也是為什麼我的程式在其他平台跑得好好的,為什麼一移植到這個平台就段錯誤了。

6 作業系統的相關限制,如:程序可以分配的最大記憶體,程序可以開啟的最大檔案描述符個數等,在linux下這些需要通過ulimit、setrlimit、sysctl等來解除相關的限制,這類段錯誤問題在系統移植中也經常發現,以前我們移植linux的程式到vxworks下時經常遇到(vxworks要改核心配置來解決)。

7 多執行緒的程式,涉及到多個執行緒同時操作一塊記憶體時必須進行互斥,否則記憶體中的內容將不可預料。

8 在多執行緒環境下使用非執行緒安全的函式呼叫,例如 strerror 函式等。

9 在有訊號的環境中,使用不可重入函式呼叫,而這些函式內部會讀或寫某片記憶體區,當訊號中斷時,記憶體寫操作將被打斷,而下次進入時將無法避免地出錯。

10 跨程序傳遞某個位址,傳遞的都是經過對映的虛擬位址,對另外乙個程序是不通用的。

11 某些有特殊要求的系統呼叫,例如epool_wait,正常情況下使用close關閉乙個套接字後,epool會不再返回這個socket上的事件,但是如果你使用dup或dup2操作,將導致epool無法進行移除操作,此時再進行讀寫操作肯定是段錯誤的。

Linux開發中常見段錯誤問題原因分析

1 使用非法的記憶體位址 指標 包括使用未經初始化及已經釋放的指標 不存在的位址 受系統保護的位址,唯讀的位址等,這一類也是最常見和最好解決的段錯誤問題,使用gdb print一下即可知道原因。2 記憶體讀 寫越界。包括陣列訪問越界,或在使用一些寫記憶體的函式時,長度指定不正確或者這些函式本身不能指...

Linux開發中常見段錯誤問題原因分析

1 使用非法的記憶體位址 指標 包括使用未經初始化及已經釋放的指標 不存在的位址 受系統保護的位址,唯讀的位址等,這一類也是最常見和最好解決的段錯誤問題,使用gdb print一下即可知道原因。2 記憶體讀 寫越界。包括陣列訪問越界,或在使用一些寫記憶體的函式時,長度指定不正確或者這些函式本身不能指...

Linux開發中常見段錯誤問題原因分析

分類 linux 嵌入式linux c和c 2012 09 22 20 35 1701人閱讀收藏 舉報linux 多執行緒socket 平台stringc 1 使用非法的記憶體位址 指標 包括使用未經初始化及已經釋放的指標 不存在的位址 受系統保護的位址,唯讀的位址等,這一類也是最常見和最好解決的段...