2010-07-14 175 views
4

我們在HPUX上,我的代碼是用C++編寫的。 我們在函數調用的可執行文件中得到了「BUS_ADRALN - 無效地址對齊」。 這個錯誤是什麼意思? 同樣的功能正在多次工作,然後突然給它核心轉儲。 在GDB中,當我嘗試打印它說不在上下文中的對象值時。 任何線索在哪裏檢查?「BUS_ADRALN - 無效地址對齊」錯誤的含義是什麼?

在此先感謝。

回答

8

你有一個數據對齊問題。這可能是由於嘗試通過某種類型的錯誤指針進行讀取或寫入而造成的。

數據對齊問題是當指針指向的地址未正確對齊時。例如,某些體系結構(例如舊的Cray 2)要求任何嘗試從存儲器中讀取除單個字符之外的任何內容的操作都只能通過指針的最後3位爲0的指針發生。如果有最後一個3位是1,硬件會產生對齊錯誤,這會導致您遇到的問題。

大多數體系結構都不是那麼嚴格,而且所需的對齊取決於所訪問的確切類型。例如,一個32位整數可能只需要指針的最後2位爲0,但64位浮點數可能需要最後3位爲0.

對齊問題通常是由相同類型的會導致SEGFAULT或分段故障的問題。通常是一個未初始化的指針。但是它可能是由不正確的內存分配器引起的,該內存分配器不會返回具有正確對齊方式的指針,也可能是指針的指針運算結果不正確。

malloc和/或operator new的系統實現幾乎可以肯定是正確的,或者您的程序在它現在執行之前會崩潰。所以我認爲糟糕的內存分配器是最不可能吠叫的樹。我會首先檢查一個未初始化的指針,然後是錯誤的指針算術。

3

大多數處理器(不是x86和朋友......這個家族的黑匣子)需要訪問某些元素以在多個字節上對齊。即如果你從地址0x04讀取一個整數就可以了,但是如果你試圖從0x03做同樣的操作,你將會引發一箇中斷。

這是因爲如果加載/存儲硬件始終位於您工作的多個數據大小上,則更容易實現加載/存儲硬件。

由於HP-UX僅在通常具有此類約束的RISC處理器上運行,因此您應該在此處看到 - >http://en.wikipedia.org/wiki/Data_structure_alignment#RISC

+0

感謝您的回覆。在我的情況下,我的函數返回一個字符。它不會每 時間失敗。 我會檢查你的維基鏈接。 – Hemant 2010-07-14 13:46:03

+0

@Hermant:我不會檢查返回值,通常在寄存器中傳遞。我會檢查函數的參數。 – 2010-07-14 13:56:17

+0

我的功能沒有任何參數。電話就像 if(abcd-> foo()=='X') //做些什麼 否則 //其他部分 – Hemant 2010-07-14 16:56:15

1

實際上HP-UX在ITRC上有自己的偉大論壇,而且一些惠普員工非常有幫助。我只是看了一下你正在問的同一個話題和here are some results。例如the similar problem實際上是由一個錯誤的輸入參數引起的。我強烈建議您先閱讀類似問題的答案,並在必要時將問題發佈到那裏。

通過很可能你會被要求發佈這些gdb命令的結果的方式:

(gdb) bt 
(gdb) info reg 
(gdb) disas $pc-16*8 $pc+16*4 
+0

謝謝我會檢查hp論壇。 – Hemant 2010-07-14 13:49:00

1

這些問題中的大多數是由多個上游依賴項鍊接到同一個庫的不同版本引起的。

例如,gnustl和stlport都提供了C++標準庫的不同實現。如果您編譯並鏈接到gnustl,而您的一個依賴關係已經編譯並鏈接到stlport,那麼您將分別具有不同的標準函數和類的實現。啓動程序時,動態鏈接程序將嘗試解析所有導出的符號,並以不正確的偏移量發現已知符號,從而產生BUS_ADRALN信號。

相關問題