1. 程式人生 > >關於SIGSEGV錯誤及處理方法

關於SIGSEGV錯誤及處理方法

pre 數據訪問 gdb bus 程序 調用棧 bsp 處理 clas

http://blog.csdn.net/brace/article/details/1102422

今天編程遇到了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)意味著指針所對應的地址是無效地址,沒有物理內存對應該地址。

 

 

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

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

SIGSEGV

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

SIGBUS

試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。
--------------------------------------------------------------------------

 

 

弄清楚錯誤以後,就要查找產生錯誤的根源,一般我用以下兩種方法:

(1)gcc -g 編譯 
ulimit -c 20000
之後運行程序,等core dump
最後gdb -c core <exec file>

     來查調用棧

(2)使用strace execfile,運行程序,出錯時會顯示那個系統調用錯

關於SIGSEGV錯誤及處理方法