來自:c
專家程式設計.p157
在unix
上程式設計時,經常會遇到如下兩個常見的執行時錯誤:
bus error
(匯流排錯誤)
segmentation fault
(段錯誤)
匯流排錯誤
匯流排錯誤幾乎都是由於未對齊的讀或寫造成的。它之所以稱為匯流排錯誤,是因為出現未對齊的記憶體訪問請求時,被堵塞的元件就是位址匯流排。對齊的意思就是資料項只能儲存在位址是資料項大小的整數倍的記憶體位置上。在現代的計算機架構中,尤其是
risc
架構,都需要資料對齊,因為與任意的對齊有關的額外邏輯會使整個記憶體系統更大且更慢。通過迫使每個記憶體訪問侷限在乙個
cache
行或乙個單獨的頁面內,可以極大地簡化如
cache
控制器或記憶體管理單元這樣的硬體。
我們表達「資料項不能跨越頁面或
cache
邊界」規則的方法多少有些間接,因為我們用位址對齊這個術語來陳述這個問題,而不是直截了當說是禁止記憶體跨頁訪問,但它們說的是同一回事。例如,訪問乙個
8位元組的
double
資料時,位址只允許是
8的整數倍。所以乙個
double
資料可以儲存於位址24、
8008
、32768
,但不能儲存於位址
1006
,頁和cache
的大小是經過精心設計的,這樣只要遵守對齊規則就可以保證乙個原子資料項不會跨越乙個頁或
cache
塊的邊界。
段錯誤
段錯誤通常是由於解除引用乙個未初始化或非法值的指標引起的。以發生頻率為序,最終可能導致段錯誤的常見程式設計錯誤是: 1
、壞指標錯誤:在指標賦值之前就用它來引用記憶體;或者向庫函式傳遞乙個壞指標
(如果偵錯程式顯示系統程式中出現了段錯誤,很可能並不是系統程式引起的段錯誤,問題可能就出現在自己的**中
);或者指標被釋放後還繼續訪問它的內容。 2
、改寫錯誤:越過陣列邊界寫入資料,在動態分配的記憶體空間以外寫入資料,或改寫一些堆管理資料結構
(在動態分配的記憶體之前的區域寫入資料就很容易發生這種情況)。
3、指標釋放引起的錯誤:釋放同一塊記憶體兩次,或釋放一塊未曾使用
malloc
分類的記憶體,或釋放乙個無效的指標。乙個極為常見的與釋放記憶體有關的錯誤就是在
for(p=start;p;p=p->next)
這樣的迴圈中迭代乙個鍊錶,並在迴圈體內使用
free(p)
這樣的語句。這樣,在下一次迴圈迭代時,程式就會對已經釋放的指標進行解除引用操作,從而導致不可預料的結果。
匯流排錯誤和段錯誤相關概念
在unix 上程式設計時,經常會遇到如下兩個常見的執行時錯誤 bus error 匯流排錯誤 segmentation fault 段錯誤 匯流排錯誤 匯流排錯誤幾乎都是由於未對齊的讀或寫造成的。它之所以稱為匯流排錯誤,是因為出現未對齊的記憶體訪問請求時,被堵塞的元件就是位址匯流排。對齊的意思就是資...
匯流排錯誤與段錯誤
在計算機領域,匯流排錯誤 bus error 是一種硬體故障,為通知作業系統乙個程序正嘗試訪問cpu無法訪問的實體地址,即乙個無效的位址匯流排位址,它由此得名。在posix相容平台上,匯流排錯誤通常導致傳送sigbus訊號到導致錯誤的程序。sigbus也可能因計算機檢測到的任何常規裝置故障引發。匯流...
匯流排錯誤和段錯誤問題的定位
對現在的很多初級的程式原來說如果遇到 匯流排錯誤 bus error 或者段錯誤 segementation fault core dump 是一件非常折磨人的事,讓人一時間找不到什麼好的方法也不知從何處下手去解決這個問題 和許多人一樣,我很快也遇到了這樣的問題 出現這個錯誤時,錯誤資訊對引起這種事...