Исключение смещения типа данных (0xA0000002) на процессоре ARM - PullRequest
2 голосов
/ 27 сентября 2010

Мое приложение хорошо работает на HTC HD2 с процессором Qualcomm 1 ГГц Snapdragon, но при попытке запуска на профессиональном эмуляторе Windows 6 или PIDION с процессором ARM происходит сбой с исключением смещения типа данных.

Может кто-нибудь помочь мне выяснить, почему происходит сбой и как его устранить.

Согласно этой ссылке , __unaligned должен решить проблему, но не смогработа в моем случае.

1 Ответ

8 голосов
/ 27 сентября 2010

__ unaligned не волшебная пуля, которую вы должны просто начать бросать, когда получаете исключение смещения. Сначала вы должны определить, где в коде произошло это исключение, а затем посмотреть, почему. Вы обращаетесь к указателю, который смещен? Что-то вроде взятия какого-либо байтового массива или буфера с последующей попыткой доступа к данным WORD с нечетной границы или к данным DWORD с адреса, не делимого на 4?

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

Или, может быть, у вас есть структура, на которой странная упаковка?

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

Ключ в том, что вы должны делать выравниваемый доступ. x86 позволяет вам осуществлять доступ без выравнивания только потому, что он перехватывает исключение для вас, а затем выполняет второе чтение без выравнивания. Вот краткий учебник , хотя имейте в виду, что это для x86, поэтому он показывает, что процессор "исправляет" смещение за вас. ARM не так простит. Вы должны переставить или собрать данные самостоятельно на ARM.

Скорее всего, вам нужно сделать memcpy для выровненного адреса и использовать данные оттуда, но, не зная ничего о вашем коде, невозможно дать гораздо больше информации.

...