我的應用程序運行良好的HTC HD2擁有1GHz的高通Snapdragon處理器,但是當嘗試在Windows模擬器專業6或具有ARM處理器的Pidion運行時,它與數據類型偏差異常崩潰。數據類型偏差異常(0xA0000002)
任何人都可以請幫我找出爲什麼它崩潰以及如何解決它。
根據this鏈接__unaligned
應該解決崩潰,但沒有在我的情況下工作。
我的應用程序運行良好的HTC HD2擁有1GHz的高通Snapdragon處理器,但是當嘗試在Windows模擬器專業6或具有ARM處理器的Pidion運行時,它與數據類型偏差異常崩潰。數據類型偏差異常(0xA0000002)
任何人都可以請幫我找出爲什麼它崩潰以及如何解決它。
根據this鏈接__unaligned
應該解決崩潰,但沒有在我的情況下工作。
__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到對齊的地址,並從那裏使用數據,但不知道你的代碼的話,這是不可能給更多的洞察力。
謝謝ctacke。我發現使用UNALIGNED宏崩潰並修復它的代碼。 – user001 2010-09-28 05:03:33
它在這裏崩潰:*(UNALIGNED _type *)&_ buffer [_index] = _value; _value&_type是unsigned int64,_buffer是unsigned char *。這段代碼不是我回來的,我只是將桌面應用程序移植到移動應用程序。我認爲有很多地方可以進行這種類型的轉換,因此無需通過嘗試錯誤方法即可找到解決方法。 – user001 2010-09-28 05:11:15
瞭解。移植糟糕的桌面代碼是他的東西通常發生的地方。 – ctacke 2010-09-28 12:19:11