關於SIGSEGV錯誤及處理方法(轉)


 
今天編程遇到了SIGSEGV錯誤,比較困惑,所以找了些資料,總結一下:
 
        
(1)官方說法是:
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:

1.buffer overflow --- usually caused by a pointer reference out of range.

2.stack overflow --- please keep in mind that the default stack size is 8192K.

3.illegal file access --- file operations are forbidden on our judge system.
 
        
 
 
        
 
 
        
(2)SIGBUS與SIGSEGV信號的一般區別如下:

1) SIGBUS(Bus error)意味着指針所對應的地址是有效地址,但總線不能正常使用該指針。通常是未對齊的數據訪問所致。

2) SIGSEGV(Segment fault)意味着指針所對應的地址是無效地址,沒有物理內存對應該地址。

SEGV_MAPERR, 地址沒有映射到對象,可能的原因是dangling pointer或者overflow,

比如

1. ptr1和ptr2指向同一段內存,但是某個線程某個時刻用ptr1將內存delete了,如果因為錯誤的設計或者假設導致認為ptr2還是指向合法的內存,使用時就會出錯;

2. 某個數組有1個元素,但是傳入的數組大小卻是2,如果我們要用2作為長度來遍歷這個數組,那當訪問第二個元素時就會出錯;

 

SEGV_ACCERR, 對映射的對象沒有權限

 
        
 
 
        
(3)Linux的mmap(2)手冊頁

--------------------------------------------------------------------------
使用映射可能涉及到如下信號

SIGSEGV

    試圖對只讀映射區域進行寫操作

SIGBUS

    試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。
--------------------------------------------------------------------------
 
        
 
 
        
 
 
        
弄清楚錯誤以后,就要查找產生錯誤的根源,一般我用以下兩種方法:
 
        
(1)gcc -g 編譯 
     ulimit -c 20000 
     之后運行程序,等core dump 
     最后gdb -c core <exec file> 
 
        
     來查調用棧
 
        
(2)使用strace execfile,運行程序,出錯時會顯示那個系統調用錯
 
 


免責聲明!

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



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