我的应用程序在具有Qualcomm 1GHz Snapdragon处理器的HTC HD2上运行良好,但是当尝试在具有ARM处理器的Windows专业仿真器6或PIDION上运行时,它会因数据类型错位异常而崩溃。
任何人都可以帮助我找出崩溃的原因以及如何解决它。
根据this链接,__unaligned
应解决崩溃,但在我的情况下不起作用。
答案 0 :(得分:8)
__未对齐不是一个神奇的子弹,当你得到一个错位异常时,你应该简单地开始扔。首先,您必须确定代码中发生异常的位置,然后查看原因。您是否正在访问未对齐的指针?有点像取一个字节数组或某种类型的缓冲区,然后尝试从一个奇数边界获取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并使用那里的数据,但是如果不了解你的代码,就不可能提供更多的洞察力。