一、導致SIGSEGV
1.試圖對僅僅讀映射區域進行寫操作 。
2.訪問的內存已經被釋放,也就是已經不存在或者越界。
3.官方說法是:
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.
二、導致SIGBUS信號:
1.硬件故障,不用說,程序猿最常碰上的肯定不是這樣的情形。
2.Linux平台上運行malloc(),假設沒有足夠的RAM。Linux不是讓malloc()失敗返回。 而是向當前進程分發SIGBUS信號。
注: 對該點執懷疑態度,有機會可自行測試確認當前系統反應。
3.某些架構上訪問數據時有對齊的要求,比方僅僅能從4字節邊界上讀取一個4字節的 數據類型。IA-32架構沒有硬性要求對齊,雖然未對齊的訪問減少運行效率。另外一些架構,比方SPARC、m68k,要求對齊訪問,否則向當前進程分發SIGBUS信號。
4.試圖訪問一塊無文件內容相應的內存區域,比方超過文件尾的內存區域,或者以前有文件內容相應,如今為還有一進程截斷過的內存區域。
三、SIGBUS與SIGSEGV信號一樣。能夠正常捕獲。
SIGBUS的缺省行為是終止當前進程並產生core dump。
四、SIGBUS與SIGSEGV信號的一般差別例如以下:
1.SIGBUS(Bus error)意味着指針所相應的地址是有效地址,但總線不能正常使用該指針。一般是未對齊的數據訪問所致。
2.SIGSEGV(Segment fault)意味着指針所相應的地址是無效地址。沒有物理內存相應該地址。
五、弄清楚錯誤以后,就要查找產生錯誤的根源,一般我用下面兩種方法: 1.gcc -g 編譯 ulimit -c 20000 之后執行程序,等core dump 最后gdb -c core <exec file> 來查調用棧 2.使用strace execfile。執行程序,出錯時會顯示那個系統調用錯