Segmentation-Fault

Is a ‘segmentation fault’ a system error or program bug?

  • April 27, 2020

我目前正在執行一個執行系統發育變異數分析的統計建模腳本。當我分析完整數據集時,腳本執行良好。但是當我獲取一個子集時,它會開始分析,但很快就會因分段錯誤而終止。我無法通過Google搜尋真正弄清楚這是否是由於我這邊的問題(例如,樣本數據集太小以進行分析)和/或腳本中的錯誤,或者這是否與我的 linux 系統有關。我讀到它與將數據寫入記憶體有關,但為什麼使用更大的數據集一切都很好?我試圖使用Google查找更多資訊,但這使它變得更加複雜。

感謝您提前澄清!

(tl;dr:這幾乎可以肯定是你的程序或它使用的庫中的一個錯誤。)

分段錯誤表示記憶體訪問不合法。也就是說,基於發出的請求,CPU 發出頁面錯誤,因為請求的頁面不是常駐的,或者俱有與請求不相符的權限。

之後,核心會檢查它是否根本不知道該頁面的任何資訊,是否它還沒有在記憶體中並且應該把它放在那裡,或者它是否需要執行一些特殊處理(例如,copy-on -write 頁面是只讀的,這個有效的頁面錯誤可能表明我們應該複製它並更新權限)。 有關次要與主要(例如,需求分頁)與無效頁面錯誤的資訊,請參見 Wikipedia 。

獲得分段錯誤表明無效的情況:該頁面不僅不在記憶體中,而且核心也沒有任何補救措施要執行,因為程序在邏輯上沒有映射其虛擬地址空間的該頁面。因此,這幾乎肯定表明程序或其底層庫之一中存在錯誤——例如,嘗試讀取或寫入對程序無效的記憶體。如果地址恰好是有效的,它可能會導致堆棧損壞或亂塗其他數據,但是讀取或寫入映射的頁面會被硬體擷取。

它適用於較大的數據集而不是較小的數據集的原因完全特定於該程序:它可能是該程序邏輯中的一個錯誤,它僅因某種原因而被較小的數據集絆倒(例如,您的數據集可能有表示條目總數的欄位,如果它沒有更新,如果你的程序不做其他健全性檢查,它可能會盲目地讀入未分配的記憶體)。

它比單純的軟體錯誤要低幾個數量級,但分段錯誤也可能是硬體問題的一個指標,例如記憶體故障、CPU 故障或您的硬體因勘誤表而跳閘(例如,請參見此處)。

由於硬體故障而導致段錯誤通常會導致有時有效的行為,儘管如果您在兩者之間不執行任何其他東西,物理 RAM 中的壞位可能會在程序的重複執行中以相同的方式映射。您可以通過啟動 memtest86+ 來檢查記憶體故障,並使用 Prime95 等軟體對您的 CPU 進行壓力測試(包括 FP 數學 FMA 執行單元)來排除這種可能性。


您可以在 gdb 之類的調試器中執行該程序,並在分段錯誤時獲取回溯,這可能會指出罪魁禍首:

% gdb --args ./foo --bar --baz
(gdb) r   # run the program
[...wait for segfault...]
(gdb) bt  # get the backtrace for the current thread

引用自:https://unix.stackexchange.com/questions/581801