我的应用程序在配备 Qualcomm 1GHz Snapdragon 处理器的 HTC HD2 上运行良好,但当尝试在 Windows 专业模拟器 6 或配备 ARM 处理器的 PIDION 上运行时,它会因数据类型未对齐异常而崩溃。
谁能帮我找出它崩溃的原因以及如何解决它。
根据 this链接,__unaligned
应该可以解决崩溃问题,但在我的情况下不起作用。
请您参考如下方法:
__unaligned 不是一个 Elixir ,当您遇到未对齐异常时,您应该简单地开始扔掉它。首先,您必须确定代码中发生异常的位置,然后查看原因。您正在访问未对齐的指针吗?比如获取字节数组或某种缓冲区,然后尝试从奇数边界访问 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 并使用那里的数据,但在不了解您的代码的情况下,不可能提供更多信息。