2010-09-27 47 views
1

我的應用程序運行良好的HTC HD2擁有1GHz的高通Snapdragon處理器,但是當嘗試在Windows模擬器專業6或具有ARM處理器的Pidion運行時,它與數據類型偏差異常崩潰。數據類型偏差異常(0xA0000002)

任何人都可以請幫我找出爲什麼它崩潰以及如何解決它。

根據this鏈接__unaligned應該解決崩潰,但沒有在我的情況下工作。

回答

7

__unaligned不是一個神奇的子彈,你應該簡單地開始扔,當你得到一個錯位異常。首先,您必須確定代碼中發生異常的位置,然後查看原因。你在訪問一個沒有對齊的指針嗎?就像是採用某種字節數組或緩衝區,然後嘗試訪問來自奇數邊界的WORD數據或來自不能被4整除的地址的DWORD數據?

BYTE buffer[256]; 
.... 
DWORD d = *(DWORD*)buffer[3]; 

或者也許你有一個結構,你有奇怪的包裝?

#pragma pack(push, 1) 
struct 
{ 
    BYTE b; 
    DWORD d; 
} s; 
#pragma pack(pop) 

關鍵是您必須進行對齊訪問。 x86允許你進行未對齊的訪問,只是因爲它爲你捕獲異常,然後進行第二次未對齊的讀取。 Here's a quick tutorial,但請記住這是針對x86的,因此它會顯示CPU「修復」您的錯位。 ARM並不那麼寬容。您必須在ARM上重新排列或重新組合數據。

你可能必須做的memcpy到對齊的地址,並從那裏使用數據,但不知道你的代碼的話,這是不可能給更多的洞察力。

+0

謝謝ctacke。我發現使用UNALIGNED宏崩潰並修復它的代碼。 – user001 2010-09-28 05:03:33

+0

它在這裏崩潰:*(UNALIGNED _type *)&_ buffer [_index] = _value; _value&_type是unsigned int64,_buffer是unsigned char *。這段代碼不是我回來的,我只是將桌面應用程序移植到移動應用程序。我認爲有很多地方可以進行這種類型的轉換,因此無需通過嘗試錯誤方法即可找到解決方法。 – user001 2010-09-28 05:11:15

+0

瞭解。移植糟糕的桌面代碼是他的東西通常發生的地方。 – ctacke 2010-09-28 12:19:11