SIGBUS 和 SIGSEGV


一、導致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。執行程序,出錯時會顯示那個系統調用錯


免責聲明!

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



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