什麼是段錯誤

2021-06-18 10:32:34 字數 1368 閱讀 1044

段錯誤是指程式嘗試訪問一段不可訪問的記憶體。

在類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=, 

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=) at src/indexer.cc:1169

呼叫順序是

main -> reorder -> reorderprocessor::reorder -> stl_vector.h
輸入updown可以在#0, #1, #2和#3之間切換,輸入list檢視源**。

要準確定位到出現段錯誤的位置,還需要細細檢視源**。

什麼是bss段

乙個程式本質上都是由 bss段 data段 text段三個組成的。這樣的概念,不知道最初 於 的規定,但在當前的計算機程式設計中是很重要的乙個基本概念。而且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元占用空間大小的問題。在採用段式記憶體管理的架構中 比如intel...

段錯誤?打的就是段錯誤!!

呵,段錯誤?自從我看了這篇文章,我還會怕你個小小段錯誤?請開啟你的linux終端,跟緊咯,準備發車!嘟嘟嘟噠 include void errfunc intmain 這段 拿去執行,肯定段錯誤。系統會在程式崩潰的那一剎那將整個核心的資訊記錄在乙個檔案裡邊。如果你是第一次,那麼ls是查不到的。這樣 ...

段錯誤總結

sigsegv是在訪問記憶體時發生的錯誤,它屬於記憶體管理的範疇 sigsegv是乙個使用者態的概念,是作業系統在使用者態程式錯誤訪問記憶體時所做出的處理。當使用者態程式訪問 訪問表示讀 寫或執行 不允許訪問的記憶體時,產生sigsegv。當使用者態程式以錯誤的方式訪問允許訪問的記憶體時,產生sig...