一,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上的例子:
#includeint 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...