匯流排錯誤和段錯誤問題的定位

2021-07-09 03:38:18 字數 2042 閱讀 5856

對現在的很多初級的程式原來說如果遇到

匯流排錯誤(bus error)或者段錯誤(segementation fault/ core dump)是一件非常折磨人的事,

讓人一時間找不到什麼好的方法也不知從何處下手去解決這個問題;和許多人一樣,我很快也遇到了這樣的問題:

出現這個錯誤時,錯誤資訊對引起這種事件的的錯誤的源**並沒有做簡單或者詳細的解釋;知識簡單的顯示error:segement default 以上的資訊並未提供如何從**中尋找錯誤的線索,而且這兩者之間的區別也並不是十分清楚,是指今日依然如此。

大多數的錯誤都呈現出這樣的一種事實:

錯誤是作業系統所監測到的異常,而這個異常是盡可能的以操作系的處理規則而出現的問題而發出的warning;匯流排錯誤和段錯誤的準確原因是在不同的作業系統之間執行版本的問題。

當硬體告訴系統有錯誤的記憶體引用時,會出現這兩個error作業系統向出現錯誤的程序傳送signal與之進行communication。訊號就通知一種事件的發生或軟中斷的產生,在linux系統中使用很廣泛,但在應用程式的編寫中幾乎不會使用;在預設的情況下,程序在收到段錯誤或者匯流排錯誤訊號後就將資訊轉儲並終止,當然可以對這些中斷或者訊號做一些處理,為它寫一些handler函式,用於修改程序的預設反映。

訊號是由於硬體的中斷而產生的,對中斷的程式設計是很困難的因為它是非同步產生的對其發生的時間也是不可**的。

匯流排錯誤:

匯流排錯誤幾乎是由於data的未對齊的讀或者寫引起的,將他之所以稱為是bus error;原因在於出現未對齊的記憶體的讀寫訪問請求時,被堵塞的組間就是匯流排錯誤。對其(alignment)的意思是資料項只能儲存在位址是資料項大小的整數倍的記憶體空間上。現在很多的risc(

reduced instruction set computer,精簡指令集計算機)需要對資料對齊,因為資料的任意的對齊會對記憶體的空間和邏輯上會出現巨大的影響並使系統的效能和速度上變慢。通過記憶體對齊是記憶體的訪問侷限在乙個

cache或者單獨的段 /頁上可以極大的利用記憶體提高訪問的速率和程式的執行速率,也不會出現記憶體的錯亂現象,便於記憶體的管理。當然乙個好的編譯器會對記憶體的不對齊情況會有相應的warning提示。

段錯誤:

段錯誤是由於記憶體管理單元mmu(負責支援虛擬內村的硬體)的異常所致,而該異常則通常是由於解除引用乙個未出始化或者非法的指標引起的,

int* p = 0;p = 88;

乙個微妙之處是如果初始化的指標恰好具有未對齊的值,它將產生匯流排錯誤而不是段錯誤,對於絕大多數架構而言cpu先看到位址,再把它發給mmu;另外的一點是,導致指標具有非法的值通常是由於不同的程式設計錯誤而引起。和匯流排不同此時的段錯誤更像是乙個間接的症狀引起的。

通常情況下導致段錯誤的幾個直接原因:

1,解除乙個包含非法值的指標。

2,解除引用乙個空指標(常常由於從系統程式中返回空指標,並未經過檢查就使用)。

3,在未得到確定的許可權時就進行訪問,試圖在唯讀的檔案上執行寫操作是出現段錯誤。

4,超出了虛擬記憶體的大小(4g);或堆疊空間

已發生的頻率為序,最終可能導致段錯誤的常見程式設計的錯誤:

p1:壞指標錯誤:在指標之前就用它來引用記憶體,或者向庫函式傳送乙個壞的指標。導致這種壞指標的原因是對指標進行釋放後再去訪問它所致。警記:在free之後含要將指標的指向null值,free(p); p = null;

p2:越過陣列的邊界寫入資料,在動態分配記憶體時容易出現的額一種問題。

p3:兩次釋放同一塊記憶體,或者釋放未曾malloc過的記憶體或無效的指標;或者釋放這在使用中的記憶體空間,乙個極為常見的釋放記憶體有關的錯誤語句:

for(p = head; p ; p = p -

>

next

) 在這段**中,執行下一次迴圈迭代時,程式已經釋放的指標進行解除引用的操作,從而導致不可預料的錯誤。

修改辦法:

struct node *p,

*head,

* q;

for(p = head; p ; p = p -

>

next)

綜上基本上可以確定,出現段錯誤或者匯流排錯誤首先考慮到的就是指標的使用和記憶體訪問方面的東西;一般的問題通過這些基本可以確定了

匯流排錯誤與段錯誤

在計算機領域,匯流排錯誤 bus error 是一種硬體故障,為通知作業系統乙個程序正嘗試訪問cpu無法訪問的實體地址,即乙個無效的位址匯流排位址,它由此得名。在posix相容平台上,匯流排錯誤通常導致傳送sigbus訊號到導致錯誤的程序。sigbus也可能因計算機檢測到的任何常規裝置故障引發。匯流...

匯流排錯誤和段錯誤相關概念

來自 c 專家程式設計.p157 在unix 上程式設計時,經常會遇到如下兩個常見的執行時錯誤 bus error 匯流排錯誤 segmentation fault 段錯誤 匯流排錯誤 匯流排錯誤幾乎都是由於未對齊的讀或寫造成的。它之所以稱為匯流排錯誤,是因為出現未對齊的記憶體訪問請求時,被堵塞的元...

匯流排錯誤和段錯誤相關概念

在unix 上程式設計時,經常會遇到如下兩個常見的執行時錯誤 bus error 匯流排錯誤 segmentation fault 段錯誤 匯流排錯誤 匯流排錯誤幾乎都是由於未對齊的讀或寫造成的。它之所以稱為匯流排錯誤,是因為出現未對齊的記憶體訪問請求時,被堵塞的元件就是位址匯流排。對齊的意思就是資...