段錯誤(核心已轉儲)的原因

2022-07-22 16:21:09 字數 2497 閱讀 7431

一旦乙個程式發生了越界訪問,cpu 就會產生相應的保護,於是 segmentation fault 就出現了,通過上面的解釋,段錯誤應該就是訪問了不可訪問的記憶體,這個記憶體區要麼是不存在的,要麼是受到系統保護的,還有可能是缺少檔案或者檔案損壞。

下面是一些典型的段錯誤的原因: 非關聯化空指標——這是特殊情況由記憶體管理硬體 試圖訪問乙個不存在的記憶體位址(在程序的位址空間) 試圖訪問記憶體的程式沒有權利(如核心結構流程上下文) 試圖寫入唯讀儲存器(如**段)

在c**,分割錯誤通常發生由於指標的錯誤使用,特別是在c動態記憶體分配。非關聯化乙個空指標總是導致段錯誤,但野指標和懸空指標指向的記憶體,可能會或可能不會存在,而且可能或不可能是可讀的還是可寫的,因此會導致瞬態錯誤。

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

現在,非關聯化這些變數可能導致段錯誤:非關聯化空指標通常會導致段錯誤,閱讀時從野指標可能導致隨機資料但沒有段錯誤,和閱讀從懸空指標可能導致有效資料,然後隨機資料覆蓋。

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

寫入唯讀儲存器提出了乙個 segmentation fault,這個發生在程式寫入自己的一部分**段或者是唯讀的資料段,這些都是由作業系統載入到唯讀儲存器。

#include #include 

int main (void

)輸出結果:

段錯誤(核心已轉儲)

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

上述例子ansi c**通常會導致段錯誤和記憶體保護平台。

它試圖修改乙個字串文字,這是根據ansi c標準未定義的行為。

大多數編譯器在編譯時不會抓,而是編譯這個可執行**,將崩潰。

包含這個**被編譯程式時,字串「hello」位於rodata部分程式的可執行檔案的唯讀部分資料段。

當載入時,作業系統與其他字串和地方常數唯讀段的記憶體中的資料。

當執行時,乙個變數 ptr 設定為指向字串的位置,並試圖編寫乙個h字元通過變數進入記憶體,導致段錯誤。

編譯程式的編譯器不檢查作業的唯讀的位置在編譯時,和執行類unix作業系統產生以下執行時發生 segmentation fault。

#include int main (void

)

即使不能修改字串(相反,這在c標準未定義行為),在c char *型別,所以沒有隱式轉換原始**,在c++的 const char *型別,因此有乙個隱式轉換,所以編譯器通常會抓住這個特定的錯誤。

因為是乙個很常見的程式錯誤空指標廢棄(讀或寫在乙個空指標,用於c的意思是「沒有物件指標」作為乙個錯誤指示器),大多數作業系統記憶體訪問空指標的位址,這樣它會導致段錯誤。

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

這個示例**建立了乙個空指標,然後試圖訪問它的值(讀值)。在執行時在許多作業系統中,這樣做會導致段錯誤。

非關聯化乙個空指標,然後分配(寫乙個值到乙個不存在的目標)也通常會導致段錯誤。

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

下面的**包含乙個空指標,但當編譯通常不會導致段錯誤,值是未使用的。因此,廢棄通常會被優化掉,死**消除。

#include int main (void

)

還有,比如malloc 動態分配記憶體,釋放、置空完成後,不可再使用該指標。

#include #include 

#include

intmain()

strcpy(str,

"hello");

printf(

"%s\n

",str);

free(str);

str=null;

strcpy(str,

"abcdef");

return0;

}輸出結果:

hello

段錯誤 (核心已轉儲)

#include #include 

int main (void

)輸出結果:

段錯誤(核心已轉儲)

上述例子的無限遞迴,導致的堆疊溢位會導致段錯誤,但無線遞迴未必導致堆疊溢位,優化執行的編譯器和**的確切結構。

在這種情況下,遙不可及的**(返回語句)行為是未定義的。

因此,編譯器可以消除它,使用尾部呼叫優化,可能導致沒有堆疊使用。其他優化可能包括將遞迴轉換成迭代,給出例子的結構功能永遠會導致程式執行,雖然可能不是其他堆疊溢位。

#include int main (void

)輸出結果:

段錯誤(核心已轉儲)

**:

GCC 4 6 3段錯誤(核心已轉儲)

串列埠相關的標頭檔案 include 標準輸入輸出定義 include 標準函式庫定義 include include include 檔案控制定義 include 標準輸入輸出定義 include 錯誤號定義 include posix終端控制定義 include include include ...

核心已轉儲處理

在伺服器上執行某些命令時會出現崩潰,並列印核心已轉儲字樣。如果需要分析具體log,可以按照如下步驟 設定core file 生成,命令 ulimit c unlimited 設定core file生成路徑,命令 echo var log core e p t proc sys kernel core...

PAT段錯誤原因

最近在刷pat,會出現段錯誤這類錯誤,總結一下段錯誤的出現原因。陣列越界 陣列越界應該是最常見的段錯誤了,一般在定義陣列的時候大小可能有所偏差,注意題目中的陣列範圍即可。堆疊溢位 在寫遞迴的時候,可能會出現遞迴呼叫層數太多導致堆疊溢位,可以將大陣列作為全域性變數,可以開到很大避免溢位。變數未初始化 ...