今天編程遇到了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.
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)意味着指針所對應的地址是無效地址,沒有物理內存對應該地址。
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
試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。
--------------------------------------------------------------------------
--------------------------------------------------------------------------
使用映射可能涉及到如下信號
SIGSEGV
試圖對只讀映射區域進行寫操作
SIGBUS
試圖訪問一塊無文件內容對應的內存區域,比如超過文件尾的內存區域,或者以前有文件內容對應,現在為另一進程截斷過的內存區域。
--------------------------------------------------------------------------
弄清楚錯誤以后,就要查找產生錯誤的根源,一般我用以下兩種方法:
(1)gcc -g 編譯
ulimit -c 20000
之后運行程序,等core dump
最后gdb -c core <exec file>
ulimit -c 20000
之后運行程序,等core dump
最后gdb -c core <exec file>
來查調用棧
(2)使用strace execfile,運行程序,出錯時會顯示那個系統調用錯