Linux程式除錯 Bus Error

2021-08-25 18:00:54 字數 1925 閱讀 6348

一,bus error究竟是指什麼

bus error,即匯流排錯誤。

引發原因:

cpu處於效能方面的考慮,要求對資料進行訪問時都必須是位址對齊的。如果發現進行的不是位址對齊的訪問,就會傳送sigbus訊號給程序,使程序產生 core dump。risc包括sparc(一種微處理器架構)都是這種型別的晶元。x86系列cpu都支援不對齊訪問,也提供了開關禁用這個機制。x86架構不 要求對齊訪問的時候,必定會有效能代價。例如,對int的訪問應該是4位元組對齊的,即位址應該是4的倍數,對short則是2位元組對齊的,位址應該是2的 倍數。

bus error也有可能是因為機器物理問題或者訪問無效實體地址,但這種情況非常少見。

linux平台上執行malloc(),如果沒有足夠的ram,linux不是讓malloc()失敗返回,而是向當前程序分發sigbus訊號。

注: 對該點執懷疑態度,有機會可自行測試確認當前系統反應。

sigbus與sigsegv訊號的一般區別如下:

1) sigbus(bus error)意味著指標所對應的位址是有效位址,但匯流排不能正常使用該指標。通常是未對齊的資料訪問所致。

2) sigsegv(segment fault)意味著指標所對應的位址是無效位址,沒有物理記憶體對應該位址。

二,例子程式:

1 int main()

short型別大小為2個位元組,其位址必是2的倍數。而對於int指標來說,能夠使用以訪問資料的位址應該是4的倍數,轉化arrary[1]的位址為int *並訪問,系統會發出sigbus訊號,導致程式崩潰。

wiki上的例子:

#include 

int main(

int argc,

char

**argv)

$ gcc -ansi sigbus.c -o sigbus

$ ./sigbus

bus error

$ gdb ./sigbus

(gdb) r

program received signal sigbus

, bus error.

0x080483ba in main ()

(gdb) x/i $pc

0x80483ba : mov dword ptr [eax],0x2a

(gdb) p/x $eax

$1 = 0x804a009

(gdb) p/t $eax & (sizeof(int) - 1)

$2 = 1

三,編譯器和硬體平台相關性

上述已經描述,對於x86平台,預設允許非對齊訪問,只不過會有效能代價。開啟檢測可以使用上述**中的巨集。

這段程式如果用sun studio編譯器的話,執行就沒有問題。這是因為sun studio預設對32位編譯使用的引數是-xmemalign=8i,其中i選項設定明確指明不產生sigbus訊號。

不過如果編譯成64位程式,sun studio使用的-xmemalign=8s,其中s選項設定意味對這種非對齊訪問產生sigbus訊號,則仍舊會遇到這個錯誤。

如果堅持在sparc上使用gcc去編譯這種**,可以如下進行:

gcc有乙個type attributes特性,例如在需人工對齊的變數後加上:__attribute__ ((aligned (4))); 其意義就是指定偏移量為4的倍數。比如:

short array[10] __attribute__ ((aligned (4)));
不過這個屬性只對linker聯結器可見的變數有效,也就是說對local variable無效。而且這種特性作用粒度比較大,比如這裡只對第乙個元素有作用,並不為陣列的每個成員設定偏移量。如果一定要針對local variable或者陣列的每個成員進行偏移量設定,可以使用union型別:

union 

Linux程式除錯 Bus Error

一 bus error,即匯流排錯誤。引發原因 cpu出於效能方面的考慮,要求對資料進行訪問時都必須是位址對齊的。如果發現進行的不是位址對齊的訪問,就會傳送sigbus訊號給程序,使程序產生 core dump。risc包括sparc 一種微處理器架構 都是這種型別的晶元。x86系列cpu都支援不對...

strace 除錯linux 程式

strace常用引數 c 統計每種系統呼叫執行的時間 呼叫次數 出錯次數,程式退出時給出報告 p pid 跟蹤指定的程序,可以使用多個 p同時跟蹤多個程序 o filename strace預設輸出到stdout,o可以將輸出寫入到指定的檔案 f 跟蹤由fork產生的子程序的系統呼叫 ff 常與 o...

linux下除錯python程式

之前除錯python程式都是用print引數,感覺有點弱爆啊,最近發現python也有類似c語言gdb的工具pdb,記錄下pdb的使用方法和心得。先找了段簡單的測試程式 usr bin python from ftplib import ftpimport sysimport socket impo...