LINUX:段错误
什么是段錯誤
段錯誤是指程序嘗試訪問一段不可訪問的內存。
在類Unix系統中,當出現段錯誤時,系統發送信號量SIGSEGV給產生段錯誤的進程;在Windows系統中,系統會發送異常STATUS_ACCESS_VIOLATION給產生段錯誤的進程。
產生段錯誤的原因
程序運行過程中能訪問到的內存空間主要有棧和堆。棧存放了函數的本地變量,堆是程序運行過程中能夠自由分配和使用的內存空間。產生段錯誤和棧、堆的訪問密切相關。
產生段錯誤的原因主要有:
- 解引用空指針
- 訪問不可訪問的內存空間(如內核空間)
- 訪問不存在的內存地址
- 試圖寫一個只讀內存空間(如代碼段)
- 棧溢出(函數遞歸調用)
- 使用未初始化的指針(定義時沒有初始化或者已經回收)
避免段錯誤
- 定義指針后初始化
- 數組下標是否越界
- 在堆上分配空間是否足夠(內存限制)
- 變量處理時格式控制是否合理
調試段錯誤
在Linux系統下,首先開啟core dump:
ulimit -c unlimited然后執行段錯誤的程序:
./a.out程序出現段錯誤后,會出現如下提示:
Segmentation fault (core dumped)表明生成了core文件,存放在/proc/sys/kernel/core_pattern目錄下,然后可以使用GDB進行調試。
$ gdb ./a.out core用來查看文件出錯的情況。
執行bt命令可以查看段出錯的過程中調用的函數,如:
#0 0x0000000000441337 in ReorderBySort::Reorder (this=<value optimized out>,
index_files=@0x7fff704326b0, order=ReorderBySort::ORIGIN)
at /usr/include/c++/4.3/bits/stl_vector.h:688
#1 0x00000000004424e7 in ReorderProcessor::Reorder (this=0x7fff704326b0)
at src/reorder.cpp:57
#2 0x00000000004458a9 in Reorder () at src/indexer.cc:396
#3 0x00000000004497ed in main (argc=3, argv=<value optimized out>) at src/indexer.cc:1169
調用順序是
main -> Reorder -> ReorderProcessor::Reorder -> stl_vector.h輸入up和down可以在#0, #1, #2和#3之間切換,輸入list查看源代碼。
要準確定位到出現段錯誤的位置,還需要細細查看源代碼。
總結
- 上一篇: Queue:poll、offer、ele
- 下一篇: Docker:Docker的安装